1dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/*--------------------------------------------------------------------------
26eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalCopyright (c) 2009, The Linux Foundation. All rights reserved.
3dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
4dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRedistribution and use in source and binary forms, with or without
5dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandmodification, are permitted provided that the following conditions are met:
6dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Redistributions of source code must retain the above copyright
7dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      notice, this list of conditions and the following disclaimer.
8dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Redistributions in binary form must reproduce the above copyright
9dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      notice, this list of conditions and the following disclaimer in the
10dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      documentation and/or other materials provided with the distribution.
116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    * Neither the name of The Linux Foundation nor
12dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      the names of its contributors may be used to endorse or promote
13dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      products derived from this software without specific prior written
14dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      permission.
15dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
16dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand--------------------------------------------------------------------------*/
28dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/*============================================================================
29dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                            O p e n M A X   w r a p p e r s
30dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                             O p e n  M A X   C o r e
31dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
32dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  This module contains the implementation of the OpenMAX core.
33dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
34dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand*//*========================================================================*/
35dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
36dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand//////////////////////////////////////////////////////////////////////////////
37dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand//                             Include Files
38dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand//////////////////////////////////////////////////////////////////////////////
39dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
40dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include <dlfcn.h>           // dynamic library
41dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include <sys/types.h>
42dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include <sys/stat.h>
43dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include <unistd.h>
44dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include <string.h>
45dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include <stdio.h>
46dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
47dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include "qc_omx_core.h"
48dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include "omx_core_cmp.h"
49dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
50dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#define DEBUG_PRINT_ERROR printf
51dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#define DEBUG_PRINT       printf
52dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#define DEBUG_DETAIL      printf
53dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
54dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandextern omx_core_cb_type core[];
55dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandextern const unsigned int SIZE_OF_CORE;
56dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
57dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
58dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
59dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
60dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  omx_core_load_cmp_library
61dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
62dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
63dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Loads up the libary name mentioned in the argument
64dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
65dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
66dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
67dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
68dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
69dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Constructor for creating component instances.
70dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
71dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic create_qc_omx_component
72dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandomx_core_load_cmp_library(char *libname, void **handle_ptr)
73dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
74dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  create_qc_omx_component fn_ptr = NULL;
75dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(handle_ptr)
76dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
77dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("Dynamically Loading the library : %s\n",libname);
78dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    *handle_ptr = dlopen(libname,RTLD_NOW);
79dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(*handle_ptr)
80dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
81dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      fn_ptr = dlsym(*handle_ptr, "get_omx_component_factory_fn");
82dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
83dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if(fn_ptr == NULL)
84dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
85dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("Error: Library %s incompatible as QCOM OMX component loader - %s\n",
86dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  libname, dlerror());
87dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        *handle_ptr = NULL;
88dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
89dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
90dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else
91dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
92dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT("Error: Couldn't load %s: %s\n",libname,dlerror());
93dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
94dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
95dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return fn_ptr;
96dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
97dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
98dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
99dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
100dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_Init
101dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
102dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
103dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  This is the first function called by the application.
104dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  There is nothing to do here since components shall be loaded
105dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  whenever the get handle method is called.
106dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
107dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
108dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
109dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
110dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
111dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None.
112dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
113dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_API OMX_ERRORTYPE OMX_APIENTRY
114dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_Init()
115dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
116dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("OMXCORE API - OMX_Init \n");
117dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /* Nothing to do here ; shared objects shall be loaded at the get handle method */
118dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return OMX_ErrorNone;
119dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
120dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
121dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
122dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
123dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  get_cmp_index
124dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
125dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
126dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Obtains the  index associated with the name.
127dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
128dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
129dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
130dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
131dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
132dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Error None.
133dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
134dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic int get_cmp_index(char *cmp_name)
135dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
136dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int rc = -1,i=0;
137dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("before get_cmp_index **********%d\n", rc);
138dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
139dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  for(i=0; i< (int)SIZE_OF_CORE; i++)
140dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
141dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   DEBUG_PRINT("get_cmp_index: cmp_name = %s , core[i].name = %s ,count = %d \n",cmp_name,core[i].name,i);
142dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
143dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(!strcmp(cmp_name, core[i].name))
144dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
145dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        rc = i;
146dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        break;
147dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
148dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
149dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("returning index %d\n", rc);
150dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return rc;
151dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
152dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
153dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
154dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
155dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  clear_cmp_handle
156dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
157dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
158dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Clears the component handle from the component table.
159dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
160dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
161dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
162dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
163dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
164dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None.
165dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
166dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic void clear_cmp_handle(OMX_HANDLETYPE inst)
167dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
168dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned i = 0,j=0;
169dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
170dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(NULL == inst)
171dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     return;
172dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
173dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  for(i=0; i< SIZE_OF_CORE; i++)
174dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
175dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    for(j=0; j< OMX_COMP_MAX_INST; j++)
176dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
177dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if(inst == core[i].inst[j])
178dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
179dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        core[i].inst[j] = NULL;
180dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return;
181dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
182dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
183dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
184dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return;
185dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
186dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
187dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
188dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  is_cmp_handle_exists
189dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
190dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
191dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Check if the component handle already exists or not.
192dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
193dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
194dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
195dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
196dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
197dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  index pointer if the handle exists
198dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  negative value otherwise
199dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
200dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic int is_cmp_handle_exists(OMX_HANDLETYPE inst)
201dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
202dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned i=0,j=0;
203dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int rc = -1;
204dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
205dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(NULL == inst)
206dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     return rc;
207dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
208dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  for(i=0; i< SIZE_OF_CORE; i++)
209dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
210dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    for(j=0; j< OMX_COMP_MAX_INST; j++)
211dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
212dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if(inst == core[i].inst[j])
213dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
214dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        rc = i;
215dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return rc;
216dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
217dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
218dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
219dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return rc;
220dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
221dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
222dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
223dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
224dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  get_comp_handle_index
225dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
226dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
227dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Gets the index to store the next handle for specified component name.
228dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
229dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
230dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  cmp_name : Component Name
231dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
232dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
233dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Index of next handle to be stored
234dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
235dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic int get_comp_handle_index(char *cmp_name)
236dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
237dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned i=0,j=0;
238dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int rc = -1;
239dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  for(i=0; i< SIZE_OF_CORE; i++)
240dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
241dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(!strcmp(cmp_name, core[i].name))
242dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
243dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      for(j=0; j< OMX_COMP_MAX_INST; j++)
244dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
245dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if(NULL == core[i].inst[j])
246dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
247dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          rc = j;
248dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT("free handle slot exists %d\n", rc);
249dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          return rc;
250dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
251dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
252dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      break;
253dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
254dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
255dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return rc;
256dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
257dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
258dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
259dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
260dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  check_lib_unload
261dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
262dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
263dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Check if any component instance is using the library
264dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
265dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
266dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  index: Component Index in core array.
267dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
268dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
269dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  1: Library Unused and can be unloaded.
270dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  0:  Library used and shouldnt be unloaded.
271dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
272dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic int check_lib_unload(int index)
273dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
274dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned i=0;
275dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int rc = 1;
276dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
277dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  for(i=0; i< OMX_COMP_MAX_INST; i++)
278dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
279dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(core[index].inst[i])
280dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
281dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      rc = 0;
282dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT("Library Used \n");
283dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      break;
284dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
285dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
286dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return rc;
287dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
288dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
289dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
290dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  is_cmp_already_exists
291dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
292dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
293dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Check if the component already exists or not. Used in the
294dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  management of component handles.
295dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
296dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
297dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
298dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
299dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
300dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Error None.
301dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
302dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic int is_cmp_already_exists(char *cmp_name)
303dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
304dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned i    =0,j=0;
305dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int rc = -1;
306dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  for(i=0; i< SIZE_OF_CORE; i++)
307dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
308dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(!strcmp(cmp_name, core[i].name))
309dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
310dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      for(j=0; j< OMX_COMP_MAX_INST; j++)
311dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
312dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if(core[i].inst[j])
313dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
314dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          rc = i;
315dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT("Component exists %d\n", rc);
316dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          return rc;
317dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
318dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
319dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      break;
320dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
321dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
322dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return rc;
323dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
324dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
325dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
326dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
327dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  get_cmp_handle
328dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
329dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
330dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Get component handle.
331dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
332dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
333dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
334dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
335dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
336dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Error None.
337dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
338dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandvoid* get_cmp_handle(char *cmp_name)
339dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
340dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned i    =0,j=0;
341dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
342dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("get_cmp_handle \n");
343dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  for(i=0; i< SIZE_OF_CORE; i++)
344dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
345dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(!strcmp(cmp_name, core[i].name))
346dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
347dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      for(j=0; j< OMX_COMP_MAX_INST; j++)
348dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
349dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if(core[i].inst[j])
350dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
351dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT("get_cmp_handle match\n");
352dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          return core[i].inst[j];
353dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
354dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
355dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
356dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
357dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("get_cmp_handle returning NULL \n");
358dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return NULL;
359dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
360dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
361dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
362dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
363dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_DeInit
364dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
365dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
366dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DeInitialize all the the relevant OMX components.
367dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
368dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
369dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
370dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
371dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
372dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Error None.
373dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
374dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_API OMX_ERRORTYPE OMX_APIENTRY
375dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_Deinit()
376dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
377dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int err;
378dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned i=0,j=0;
379dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_ERRORTYPE eRet;
380dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
381dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /* Free the dangling handles here if any */
382dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  for(i=0; i< SIZE_OF_CORE; i++)
383dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
384dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    for(j=0; j< OMX_COMP_MAX_INST; j++)
385dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
386dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if(core[i].inst[j])
387dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
388dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("OMX DeInit: Freeing handle for %s\n",
389dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                     core[i].name);
390dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
391dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        /* Release the component and unload dynmaic library */
392dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        eRet = OMX_FreeHandle(core[i].inst[j]);
393dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if(eRet != OMX_ErrorNone)
394dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          return eRet;
395dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
396dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
397dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
398dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return OMX_ErrorNone;
399dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
400dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
401dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
402dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
403dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_GetHandle
404dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
405dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
406dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Constructs requested component. Relevant library is loaded if needed.
407dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
408dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
409dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
410dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
411dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
412dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Error None  if everything goes fine.
413dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
414dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
415dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand OMX_API OMX_ERRORTYPE OMX_APIENTRY
416dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_GetHandle(OMX_OUT OMX_HANDLETYPE*     handle,
417dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              OMX_IN OMX_STRING    componentName,
418dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              OMX_IN OMX_PTR             appData,
419dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              OMX_IN OMX_CALLBACKTYPE* callBacks)
420dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
421dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_ERRORTYPE  eRet = OMX_ErrorNone;
422dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int cmp_index = -1;
423dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int hnd_index = -1;
424dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
425dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("OMXCORE API :  Get Handle %x %s %x\n",(unsigned) handle,
426dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                                     componentName,
427dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                                     (unsigned) appData);
428dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(handle)
429dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
430dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    struct stat sd;
431dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
432dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    *handle = NULL;
433dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(stat("/dev/pmem_adsp",&sd) != 0)
434dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return OMX_ErrorInsufficientResources;
435dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
436dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    cmp_index = get_cmp_index(componentName);
437dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
438dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(cmp_index >= 0)
439dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
440dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       DEBUG_PRINT("getting fn pointer\n");
441dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
442dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      // dynamically load the so
443dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      core[cmp_index].fn_ptr =
444dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        omx_core_load_cmp_library(core[cmp_index].so_lib_name,
445dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                  &core[cmp_index].so_lib_handle);
446dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
447dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if(core[cmp_index].fn_ptr)
448dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
449dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        // Construct the component requested
450dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        // Function returns the opaque handle
451dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        void* pThis = (*(core[cmp_index].fn_ptr))();
452dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if(pThis)
453dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
454dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          void *hComp = NULL;
455dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          hComp = qc_omx_create_component_wrapper((OMX_PTR)pThis);
456dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if((eRet = qc_omx_component_init(hComp, core[cmp_index].name)) !=
457dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                           OMX_ErrorNone)
458dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
459dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              DEBUG_PRINT("Component not created succesfully\n");
460dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              return eRet;
461dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
462dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
463dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          qc_omx_component_set_callbacks(hComp,callBacks,appData);
464dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          hnd_index = get_comp_handle_index(componentName);
465dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if(hnd_index >= 0)
466dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
467dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            core[cmp_index].inst[hnd_index]= *handle = (OMX_HANDLETYPE) hComp;
468dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
469dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          else
470dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
471dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT("OMX_GetHandle:NO free slot available to store Component Handle\n");
472dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            return OMX_ErrorInsufficientResources;
473dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
474dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT("Component %x Successfully created\n",(unsigned)*handle);
475dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
476dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        else
477dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
478dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          eRet = OMX_ErrorInsufficientResources;
479dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT("Component Creation failed\n");
480dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
481dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
482dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      else
483dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
484dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        eRet = OMX_ErrorNotImplemented;
485dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("library couldnt return create instance fn\n");
486dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
487dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
488dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
489dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else
490dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
491dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      eRet = OMX_ErrorNotImplemented;
492dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT("ERROR: Already another instance active  ;rejecting \n");
493dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
494dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
495dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
496dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
497dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    eRet =  OMX_ErrorBadParameter;
498dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n OMX_GetHandle: NULL handle \n");
499dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
500dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return eRet;
501dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
502dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
503dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
504dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_FreeHandle
505dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
506dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
507dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Destructs the component handles.
508dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
509dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
510dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
511dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
512dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
513dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Error None.
514dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
515dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_API OMX_ERRORTYPE OMX_APIENTRY
516dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_FreeHandle(OMX_IN OMX_HANDLETYPE hComp)
517dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
518dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_ERRORTYPE eRet = OMX_ErrorNone;
519dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int err = 0, i = 0;
520dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("OMXCORE API :  Free Handle %x\n",(unsigned) hComp);
521dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
522dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  // 0. Check that we have an active instance
523dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if((i=is_cmp_handle_exists(hComp)) >=0)
524dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
525dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    // 1. Delete the component
526dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if ((eRet = qc_omx_component_deinit(hComp)) == OMX_ErrorNone)
527dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
528dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        /* Unload component library */
529dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if( ((unsigned int)i < SIZE_OF_CORE) && core[i].so_lib_handle)
530dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
531dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           if(check_lib_unload(i))
532dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           {
533dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              DEBUG_PRINT_ERROR(" Unloading the dynamic library for %s\n",
534dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                  core[i].name);
535dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              err = dlclose(core[i].so_lib_handle);
536dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              if(err)
537dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              {
538dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  DEBUG_PRINT_ERROR("Error %d in dlclose of lib %s\n",
539dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                     err,core[i].name);
540dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              }
541dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              core[i].so_lib_handle = NULL;
542dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           }
543dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
544dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    clear_cmp_handle(hComp);
545dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
546dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else
547dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
548dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT(" OMX_FreeHandle failed on %x\n",(unsigned) hComp);
549dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return eRet;
550dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
551dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
552dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
553dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
554dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("OMXCORE Warning: Free Handle called with no active instances\n");
555dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
556dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return OMX_ErrorNone;
557dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
558dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
559dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
560dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_SetupTunnel
561dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
562dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
563dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Not Implemented.
564dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
565dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
566dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
567dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
568dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
569dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None.
570dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
571dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_API OMX_ERRORTYPE OMX_APIENTRY
572dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_SetupTunnel(OMX_IN OMX_HANDLETYPE outputComponent,
573dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                OMX_IN OMX_U32             outputPort,
574dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                OMX_IN OMX_HANDLETYPE  inputComponent,
575dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                OMX_IN OMX_U32              inputPort)
576dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
577dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /* Not supported right now */
578dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("OMXCORE API: OMX_SetupTunnel Not implemented \n");
579dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return OMX_ErrorNotImplemented;
580dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
581dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
582dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
583dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_GetContentPipe
584dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
585dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
586dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Not Implemented.
587dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
588dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
589dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
590dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
591dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
592dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None.
593dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
594dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_API OMX_ERRORTYPE
595dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_GetContentPipe(OMX_OUT OMX_HANDLETYPE* pipe,
596dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                   OMX_IN OMX_STRING        uri)
597dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
598dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /* Not supported right now */
599dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("OMXCORE API: OMX_GetContentPipe Not implemented \n");
600dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return OMX_ErrorNotImplemented;
601dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
602dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
603dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
604dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
605dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_GetComponentNameEnum
606dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
607dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
608dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Returns the component name associated with the index.
609dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
610dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
611dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
612dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
613dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
614dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None.
615dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
616dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_API OMX_ERRORTYPE OMX_APIENTRY
617dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_ComponentNameEnum(OMX_OUT OMX_STRING componentName,
618dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      OMX_IN  OMX_U32          nameLen,
619dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      OMX_IN  OMX_U32            index)
620dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
621dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_ERRORTYPE eRet = OMX_ErrorNone;
622dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("OMXCORE API - OMX_ComponentNameEnum %x %d %d\n",(unsigned) componentName
623dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                                              ,(unsigned)nameLen
624dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                                              ,(unsigned)index);
625dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(index < SIZE_OF_CORE)
626dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
627dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    #ifdef _ANDROID_
628dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    strlcpy(componentName, core[index].name,nameLen);
629dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    #else
630dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    strncpy(componentName, core[index].name,nameLen);
631dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    #endif
632dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
633dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
634dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
635dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    eRet = OMX_ErrorNoMore;
636dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
637dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return eRet;
638dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
639dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
640dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
641dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
642dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_GetComponentsOfRole
643dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
644dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
645dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Returns the component name which can fulfill the roles passed in the
646dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  argument.
647dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
648dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
649dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
650dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
651dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
652dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None.
653dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
654dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_API OMX_ERRORTYPE
655dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_GetComponentsOfRole(OMX_IN OMX_STRING      role,
656dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        OMX_INOUT OMX_U32* numComps,
657dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        OMX_INOUT OMX_U8** compNames)
658dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
659dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_ERRORTYPE eRet = OMX_ErrorNone;
660dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned i,j,namecount=0;
661dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
662dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  printf(" Inside OMX_GetComponentsOfRole \n");
663dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
664dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /*If CompNames is NULL then return*/
665dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (compNames == NULL)
666dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
667dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (numComps == NULL)
668dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
669dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          eRet = OMX_ErrorBadParameter;
670dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
671dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      else
672dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
673dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    *numComps          = 0;
674dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    for (i=0; i<SIZE_OF_CORE;i++)
675dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
676dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      for(j=0; j<OMX_CORE_MAX_CMP_ROLES && core[i].roles[j] ; j++)
677dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
678dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if(!strcmp(role,core[i].roles[j]))
679dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
680dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  (*numComps)++;
681dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              }
682dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            }
683dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
684dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
685dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return eRet;
686dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
687dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
688dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(numComps)
689dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
690dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      namecount = *numComps;
691dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
692dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (namecount == 0)
693dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
694dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          return OMX_ErrorBadParameter;
695dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
696dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
697dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    *numComps          = 0;
698dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
699dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    for (i=0; i<SIZE_OF_CORE;i++)
700dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
701dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      for(j=0; j<OMX_CORE_MAX_CMP_ROLES && core[i].roles[j] ; j++)
702dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
703dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if(!strcmp(role,core[i].roles[j]))
704dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
705dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            #ifdef _ANDROID_
706dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            strlcpy((char *)compNames[*numComps],core[i].name, OMX_MAX_STRINGNAME_SIZE);
707dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            #else
708dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            strncpy((char *)compNames[*numComps],core[i].name, OMX_MAX_STRINGNAME_SIZE);
709dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            #endif
710dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          (*numComps)++;
711dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          break;
712dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
713dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
714dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if (*numComps == namecount)
715dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
716dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          break;
717dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
718dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
719dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
720dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
721dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
722dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    eRet = OMX_ErrorBadParameter;
723dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
724dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
725dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  printf(" Leaving OMX_GetComponentsOfRole \n");
726dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return eRet;
727dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
728dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/* ======================================================================
729dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandFUNCTION
730dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_GetRolesOfComponent
731dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
732dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDESCRIPTION
733dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  Returns the primary role of the components supported.
734dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
735dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPARAMETERS
736dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None
737dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
738dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRETURN VALUE
739dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  None.
740dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand========================================================================== */
741dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_API OMX_ERRORTYPE
742dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_GetRolesOfComponent(OMX_IN OMX_STRING compName,
743dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        OMX_INOUT OMX_U32* numRoles,
744dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        OMX_OUT OMX_U8** roles)
745dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
746dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /* Not supported right now */
747dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_ERRORTYPE eRet = OMX_ErrorNone;
748dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned i,j,numofroles = 0;;
749dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("GetRolesOfComponent %s\n",compName);
750dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
751dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (roles == NULL)
752dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
753dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (numRoles == NULL)
754dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
755dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         eRet = OMX_ErrorBadParameter;
756dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
757dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      else
758dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
759dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         *numRoles = 0;
760dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         for(i=0; i< SIZE_OF_CORE; i++)
761dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         {
762dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           if(!strcmp(compName,core[i].name))
763dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           {
764dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             for(j=0; (j<OMX_CORE_MAX_CMP_ROLES) && core[i].roles[j];j++)
765dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             {
766dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                (*numRoles)++;
767dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             }
768dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             break;
769dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           }
770dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         }
771dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
772dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
773dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return eRet;
774dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
775dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
776dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(numRoles)
777dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
778dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (*numRoles == 0)
779dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
780dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return OMX_ErrorBadParameter;
781dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
782dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
783dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    numofroles = *numRoles;
784dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    *numRoles = 0;
785dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    for(i=0; i< SIZE_OF_CORE; i++)
786dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
787dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if(!strcmp(compName,core[i].name))
788dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
789dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        for(j=0; (j<OMX_CORE_MAX_CMP_ROLES) && core[i].roles[j];j++)
790dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
791dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if(roles && roles[*numRoles])
792dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
793dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            #ifdef _ANDROID_
794dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            strlcpy((char *)roles[*numRoles],core[i].roles[j],OMX_MAX_STRINGNAME_SIZE);
795dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            #else
796dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            strncpy((char *)roles[*numRoles],core[i].roles[j],OMX_MAX_STRINGNAME_SIZE);
797dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            #endif
798dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
799dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          (*numRoles)++;
800dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if (numofroles == *numRoles)
801dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
802dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              break;
803dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
804dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
805dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        break;
806dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
807dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
808dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
809dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
810dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
811dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("ERROR: Both Roles and numRoles Invalid\n");
812dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    eRet = OMX_ErrorBadParameter;
813dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
814dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return eRet;
815dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
816dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
817dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_API OMX_BOOL
818dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMXConfigParser(
819dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    OMX_PTR aInputParameters,
820dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    OMX_PTR aOutputParameters)
821dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
822dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    OMX_BOOL Status = OMX_TRUE;
823dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    VideoOMXConfigParserOutputs *aOmxOutputParameters;
824dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    OMXConfigParserInputs *aOmxInputParameters;
825dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    aOmxOutputParameters = (VideoOMXConfigParserOutputs *)aOutputParameters;
826dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    aOmxInputParameters = (OMXConfigParserInputs *)aInputParameters;
827dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
828dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    aOmxOutputParameters->width = 176; //setting width to QCIF
829dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    aOmxOutputParameters->height = 144; //setting height to QCIF
830dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
831dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //TODO
832dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //Qcom component do not use the level/profile from IL client .They are parsing the first buffer
833dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //sent in ETB so for now setting the defalut values . Going farward we can call
834dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //QC parser here.
835dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (0 == strcmp(aOmxInputParameters->cComponentRole, (OMX_STRING)"video_decoder.avc"))
836dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
837dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       aOmxOutputParameters->profile = 66; //minimum supported h264 profile - setting to baseline profile
838dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       aOmxOutputParameters->level = 0;  // minimum supported h264 level
839dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
840dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else if ((0 == strcmp(aOmxInputParameters->cComponentRole, (OMX_STRING)"video_decoder.mpeg4")) || (0 == strcmp(aOmxInputParameters ->cComponentRole, (OMX_STRING)"video_decoder.h263")))
841dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
842dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       aOmxOutputParameters->profile = 8; //minimum supported h263/mpeg4 profile
843dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       aOmxOutputParameters->level = 0; // minimum supported h263/mpeg4 level
844dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
845dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
846dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return Status;
847dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
848