/**
  src/st_static_component_loader.h

  ST specific component loader for local components.

  Copyright (C) 2007-2009 STMicroelectronics
  Copyright (C) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).

  This library is free software; you can redistribute it and/or modify it under
  the terms of the GNU Lesser General Public License as published by the Free
  Software Foundation; either version 2.1 of the License, or (at your option)
  any later version.

  This library is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
  details.

  You should have received a copy of the GNU Lesser General Public License
  along with this library; if not, write to the Free Software Foundation, Inc.,
  51 Franklin St, Fifth Floor, Boston, MA
  02110-1301  USA

*/

#ifndef __ST_STATIC_COMPONENT_LOADER_H__
#define __ST_STATIC_COMPONENT_LOADER_H__

#include "omxcore.h"
#include "extension_struct.h"

/** @brief the private data structure handled by the ST static loader that described
 * an OpenMAX component
 *
 * This structure contains all the fields that the loader must use to support
 * the loading  unloading functions of the component, that are not described by the
 * standard.
 */
typedef struct steLoaderComponentType{
  OMX_VERSIONTYPE componentVersion; /**< the version of the component in the OpenMAX standard format */
  char* name; /**< String that represents the name of the component, ruled by the standard */
  unsigned int name_specific_length;/**< this field contains the number of roles of the component */
  char** name_specific; /**< Strings those represent the names of the specific format components */
  char** role_specific; /**< Strings those represent the names of the specific format components */
  char* name_requested; /**< This parameter is used to send to the component the string requested by the IL Client */
  OMX_ERRORTYPE (*constructor)(OMX_COMPONENTTYPE*,OMX_STRING cComponentName); /**< constructor function pointer for each Linux ST OpenMAX component */
  OMX_U32 nqualitylevels;/**< number of available quality levels */
  multiResourceDescriptor** multiResourceLevel;
} steLoaderComponentType;

/** @brief The initialization of the ST specific component loader.
 */
void st_static_setup_component_loader(BOSA_COMPONENTLOADER * st_static_loader);

/** @brief The constructor of the ST specific component loader.
 *
 * It is the component loader developed under linux by ST, for local libraries.
 * It is based on a registry file, like in the case of GStreamer. It reads the
 * registry file, and allows the components to register themself to the
 * main list templateList.
 */
OMX_ERRORTYPE BOSA_STE_InitComponentLoader(BOSA_COMPONENTLOADER *loader);

/** @brief The destructor of the ST specific component loader.
 *
 * This function deallocates the list of available components.
 */
OMX_ERRORTYPE BOSA_STE_DeInitComponentLoader(BOSA_COMPONENTLOADER *loader);

/** @brief creator of the requested openmax component
 *
 * This function searches for the requested component in the internal list.
 * If the component is found, its constructor is called,
 * and the standard callback are assigned.
 * A pointer to a standard openmax component is returned.
 */
OMX_ERRORTYPE BOSA_STE_CreateComponent(
    BOSA_COMPONENTLOADER *loader,
    OMX_HANDLETYPE* pHandle,
    OMX_STRING cComponentName,
    OMX_PTR pAppData,
    OMX_CALLBACKTYPE* pCallBacks);

/** @brief destructor of the requested OpenMAX component
 *
 */
OMX_ERRORTYPE BOSA_STE_DestroyComponent(
    BOSA_COMPONENTLOADER *loader,
    OMX_HANDLETYPE hComponent);

/** @brief This function search for the index from 0 to end of the list
 *
 * This function searches in the list of ST static components and enumerates
 * both the class names and the role specific components.
 */
OMX_ERRORTYPE BOSA_STE_ComponentNameEnum(
    BOSA_COMPONENTLOADER *loader,
    OMX_STRING cComponentName,
    OMX_U32 nNameLength,
    OMX_U32 nIndex);

/** @brief The specific version of OMX_GetRolesOfComponent
 *
 * This function replicates exactly the behavior of the
 * standard OMX_GetRolesOfComponent function for the ST static
 * component loader
 */
OMX_ERRORTYPE BOSA_STE_GetRolesOfComponent(
    BOSA_COMPONENTLOADER *loader,
    OMX_STRING compName,
    OMX_U32 *pNumRoles,
    OMX_U8 **roles);

/** @brief The specific version of OMX_GetComponentsOfRole
 *
 * This function replicates exactly the behavior of the
 * standard OMX_GetComponentsOfRole function for the ST static
 * component loader
 */
OMX_ERRORTYPE BOSA_STE_GetComponentsOfRole (
    BOSA_COMPONENTLOADER *loader,
    OMX_STRING role,
    OMX_U32 *pNumComps,
    OMX_U8  **compNames);

#endif
