Home | History | Annotate | Download | only in src
      1 
      2 /*
      3  * Copyright (C) Texas Instruments - http://www.ti.com/
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Lesser General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2.1 of the License, or (at your option) any later version.
      9  *
     10  *
     11  * This library is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  * Lesser General Public License for more details.
     15  *
     16  *
     17  * You should have received a copy of the GNU Lesser General Public
     18  * License along with this library; if not, write to the Free Software
     19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     20  */
     21 /* =============================================================================
     22 *             Texas Instruments OMAP(TM) Platform Software
     23 *  (c) Copyright Texas Instruments, Incorporated.  All Rights Reserved.
     24 *
     25 *  Use of this software is controlled by the terms and conditions found
     26 *  in the license agreement under which this software has been supplied.
     27 * ============================================================================*/
     28 /**
     29 * @file OMX_VideoEncoder.c
     30 *
     31 * This file implements OMX Component for MPEG-4 encoder that
     32 * is fully compliant with the OMX specification 1.5.
     33 *
     34 * @path  $(CSLPATH)\src
     35 *
     36 * @rev  0.1
     37 */
     38 /* ---------------------------------------------------------------------------*/
     39 /* =============================================================================
     40 *!
     41 *! Revision History
     42 *! =============================================================================
     43 *!
     44 *! 24-Jul-2005 mf: Revisions appear in reverse chronological order;
     45 *! that is, newest first.  The date format is dd-Mon-yyyy.
     46 * ============================================================================*/
     47 
     48 /* ------compilation control switches ----------------------------------------*/
     49 /******************************************************************************
     50 *  INCLUDE FILES
     51 *******************************************************************************/
     52 /* ----- system and platform files -------------------------------------------*/
     53 #ifdef UNDER_CE
     54     #include <windows.h>
     55     #include <oaf_osal.h>
     56     #include <omx_core.h>
     57 #else
     58     #include <wchar.h>
     59     #include <unistd.h>
     60     #include <sys/time.h>
     61     #include <sys/types.h>
     62     #include <sys/ioctl.h>
     63     #include <sys/select.h>
     64     #include <errno.h>
     65     #include <pthread.h>
     66     #include <dlfcn.h>
     67 #endif
     68 
     69 #include <string.h>
     70 #include <fcntl.h>
     71 #include <stdlib.h>
     72 #include <stdio.h>
     73 #include <dbapi.h>
     74 
     75 /*------- Program Header Files -----------------------------------------------*/
     76 #include "OMX_VideoEnc_Utils.h"
     77 #include "OMX_VideoEnc_DSP.h"
     78 #include "OMX_VideoEnc_Thread.h"
     79 
     80 #ifdef RESOURCE_MANAGER_ENABLED
     81     #include <ResourceManagerProxyAPI.h>
     82 #endif
     83 #ifdef UNDER_CE
     84     extern HINSTANCE g_hLcmlDllHandle;
     85 #endif
     86 /* H.263 Supported Levels & profiles */
     87 VIDEO_PROFILE_LEVEL_TYPE SupportedH263ProfileLevels[] = {
     88   {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level10},
     89   {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level20},
     90   {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level30},
     91   {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level40},
     92   {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level45},
     93   {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level50},
     94   {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level60},
     95   {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level70},
     96   {-1, -1}};
     97 
     98 /* MPEG4 Supported Levels & profiles */
     99 VIDEO_PROFILE_LEVEL_TYPE SupportedMPEG4ProfileLevels[] ={
    100   {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0},
    101   {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0b},
    102   {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1},
    103   {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level2},
    104   {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3},
    105   {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4},
    106   {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4a},
    107   {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5},
    108   {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0},
    109   {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0b},
    110   {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level1},
    111   {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level2},
    112   {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level3},
    113   {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4},
    114   {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level5},
    115   {-1,-1}};
    116 
    117 /* AVC Supported Levels & profiles */
    118 VIDEO_PROFILE_LEVEL_TYPE SupportedAVCProfileLevels[] ={
    119   {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1},
    120   {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1b},
    121   {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel11},
    122   {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel12},
    123   {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13},
    124   {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel2},
    125   {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel21},
    126   {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel22},
    127   {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel3},
    128   {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel31},
    129   {-1,-1}};
    130 /******************************************************************************
    131 *  EXTERNAL REFERENCES NOTE : only use if not found in header file
    132 *******************************************************************************/
    133 /*--------data declarations --------------------------------------------------*/
    134 /*--------function prototypes ------------------------------------------------*/
    135 
    136 /******************************************************************************
    137 *  PUBLIC DECLARATIONS Defined here, used elsewhere
    138 *******************************************************************************/
    139 /*--------data declarations --------------------------------------------------*/
    140 /*--------function prototypes ------------------------------------------------*/
    141 #ifndef UNDER_CE
    142     OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE hComp);
    143 #else
    144     #define OMX_EXPORT __declspec(dllexport)
    145     OMX_EXPORT OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp);
    146 #endif
    147 
    148 /******************************************************************************
    149 *  PRIVATE DECLARATIONS Defined here, used only here
    150 *******************************************************************************/
    151 /*--------data declarations --------------------------------------------------*/
    152 #ifdef UNDER_CE
    153            static pthread_t ComponentThread;
    154 #endif
    155 /*--------macro definitions --------------------------------------------------*/
    156 #define OMX_CONVERT_STATE(_s_, _p_)        \
    157     if (_p_ == 0) {                        \
    158         _s_ = "OMX_StateInvalid";          \
    159     }                                      \
    160     else if (_p_ == 1) {                   \
    161         _s_ = "OMX_StateLoaded";           \
    162     }                                      \
    163     else if (_p_ == 2) {                   \
    164         _s_ = "OMX_StateIdle";             \
    165     }                                      \
    166     else if (_p_ == 3) {                   \
    167         _s_ = "OMX_StateExecuting";        \
    168     }                                      \
    169     else if (_p_ == 4) {                   \
    170         _s_ = "OMX_StatePause";            \
    171     }                                      \
    172     else if (_p_ == 5) {                   \
    173         _s_ = "OMX_StateWaitForResources"; \
    174     }                                      \
    175     else {                                 \
    176         _s_ = "UnsupportedCommand";        \
    177     }
    178 
    179 #define OMX_CONVERT_CMD(_s_, _p_)          \
    180     if (_p_ == 0) {                        \
    181         _s_ = "OMX_CommandStateSet";       \
    182     }                                      \
    183     else if (_p_ == 1) {                   \
    184         _s_ = "OMX_CommandFlush";          \
    185     }                                      \
    186     else if (_p_ == 2) {                   \
    187         _s_ = "OMX_CommandPortDisable";    \
    188     }                                      \
    189     else if (_p_ == 3) {                   \
    190         _s_ = "OMX_CommandPortEnable";     \
    191     }                                      \
    192     else if (_p_ == 4) {                   \
    193         _s_ = "OMX_CommandMarkBuffer";     \
    194     }                                      \
    195     else {                                 \
    196         _s_ = "UnsupportedCommand";        \
    197     }
    198 
    199 /*--------function prototypes ------------------------------------------------*/
    200 static OMX_ERRORTYPE SetCallbacks (OMX_IN OMX_HANDLETYPE hComponent,
    201                                    OMX_IN OMX_CALLBACKTYPE* pCallBacks,
    202                                    OMX_IN OMX_PTR pAppData);
    203 
    204 static OMX_ERRORTYPE GetComponentVersion (OMX_HANDLETYPE hComponent,
    205                                           OMX_STRING  szComponentName,
    206                                           OMX_VERSIONTYPE* pComponentVersion,
    207                                           OMX_VERSIONTYPE* pSpecVersion,
    208                                           OMX_UUIDTYPE* pComponentUUID);
    209 
    210 static OMX_ERRORTYPE SendCommand (OMX_IN OMX_HANDLETYPE hComponent,
    211                                   OMX_IN OMX_COMMANDTYPE Cmd,
    212                                   OMX_IN OMX_U32 nParam1,
    213                                   OMX_IN OMX_PTR pCmdData);
    214 
    215 static OMX_ERRORTYPE GetParameter (OMX_IN OMX_HANDLETYPE hComponent,
    216                                    OMX_IN OMX_INDEXTYPE nParamIndex,
    217                                    OMX_INOUT OMX_PTR CompParamStruct);
    218 
    219 static OMX_ERRORTYPE SetParameter (OMX_IN OMX_HANDLETYPE hComponent,
    220                                    OMX_IN OMX_INDEXTYPE nParamIndex,
    221                                    OMX_IN OMX_PTR CompParamStruct);
    222 
    223 static OMX_ERRORTYPE GetConfig (OMX_HANDLETYPE hComponent,
    224                                 OMX_INDEXTYPE nConfigIndex,
    225                                 OMX_PTR ComponentConfigStructure);
    226 
    227 static OMX_ERRORTYPE SetConfig (OMX_HANDLETYPE hComponent,
    228                                 OMX_INDEXTYPE nConfigIndex,
    229                                 OMX_PTR ComponentConfigStructure);
    230 
    231 static OMX_ERRORTYPE EmptyThisBuffer (OMX_IN OMX_HANDLETYPE hComponent,
    232                                       OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
    233 
    234 static OMX_ERRORTYPE FillThisBuffer (OMX_IN OMX_HANDLETYPE hComponent,
    235                                      OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
    236 
    237 static OMX_ERRORTYPE GetState (OMX_IN OMX_HANDLETYPE hComponent,
    238                                OMX_OUT OMX_STATETYPE* pState);
    239 
    240 static OMX_ERRORTYPE ComponentTunnelRequest (OMX_IN OMX_HANDLETYPE hComponent,
    241                                              OMX_IN OMX_U32 nPort,
    242                                              OMX_IN OMX_HANDLETYPE hTunneledComp,
    243                                              OMX_IN  OMX_U32 nTunneledPort,
    244                                              OMX_INOUT OMX_TUNNELSETUPTYPE* pTunnelSetup);
    245 
    246 static OMX_ERRORTYPE UseBuffer (OMX_IN OMX_HANDLETYPE hComponent,
    247                                 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
    248                                 OMX_IN OMX_U32 nPortIndex,
    249                                 OMX_IN OMX_PTR pAppPrivate,
    250                                 OMX_IN OMX_U32 nSizeBytes,
    251                                 OMX_IN OMX_U8* pBuffer);
    252 
    253 static OMX_ERRORTYPE AllocateBuffer (OMX_IN OMX_HANDLETYPE hComponent,
    254                                      OMX_INOUT OMX_BUFFERHEADERTYPE** pBuffer,
    255                                      OMX_IN OMX_U32 nPortIndex,
    256                                      OMX_IN OMX_PTR pAppPrivate,
    257                                      OMX_IN OMX_U32 nSizeBytes);
    258 
    259 static OMX_ERRORTYPE FreeBuffer (OMX_IN OMX_HANDLETYPE hComponent,
    260                                  OMX_IN OMX_U32 nPortIndex,
    261                                  OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
    262 
    263 static OMX_ERRORTYPE ComponentDeInit (OMX_IN OMX_HANDLETYPE hComponent);
    264 
    265 static OMX_ERRORTYPE VerifyTunnelConnection (VIDEOENC_PORT_TYPE* pPort,
    266                                              OMX_HANDLETYPE hTunneledComp,
    267                                              OMX_PARAM_PORTDEFINITIONTYPE* pPortDef,
    268                                              struct OMX_TI_Debug *dbg);
    269 
    270 static OMX_ERRORTYPE ExtensionIndex (OMX_IN OMX_HANDLETYPE hComponent,
    271                                      OMX_IN OMX_STRING cParameterName,
    272                                      OMX_OUT OMX_INDEXTYPE* pIndexType);
    273 
    274 #ifdef __KHRONOS_CONF_1_1__
    275 static OMX_ERRORTYPE ComponentRoleEnum(OMX_IN OMX_HANDLETYPE hComponent,
    276                                        OMX_OUT OMX_U8 *cRole,
    277                                        OMX_IN OMX_U32 nIndex);
    278 #endif
    279 
    280 void CalculateBufferSize(OMX_PARAM_PORTDEFINITIONTYPE* pCompPort, VIDENC_COMPONENT_PRIVATE* pCompPrivate);
    281 OMX_ERRORTYPE IsResolutionPlayable (OMX_U32 width, OMX_U32 height);
    282 
    283 static const int iQ16_Const = 1 << 16;
    284 static const float fQ16_Const = (float)(1 << 16);
    285 
    286 static float Q16Tof(int nQ16)
    287 {
    288     return nQ16 / fQ16_Const;
    289 }
    290 
    291 static int fToQ16(float f)
    292 {
    293     return(int)(f*fQ16_Const);
    294 }
    295 
    296 extern OMX_U32 VIDENC_STRUCT_H264DEFBITRATE [VIDENC_MAXBITRATES][2];
    297 extern OMX_U32 VIDENC_STRUCT_MPEG4DEFBITRATE [VIDENC_MAXBITRATES][2];
    298 extern OMX_U32 VIDENC_STRUCT_H263DEFBITRATE [VIDENC_MAXBITRATES][2];
    299 
    300 /*----------------------------------------------------------------------------*/
    301 /**
    302   * OMX_ComponentInit() Set the all the function pointers of component
    303   *
    304   * This method will update the component function pointer to the handle
    305   *
    306   * @param hComp         handle for this instance of the component
    307   *
    308   * @retval OMX_NoError              Success, ready to roll
    309   *         OMX_ErrorInsufficientResources If the malloc fails
    310   **/
    311 /*----------------------------------------------------------------------------*/
    312 
    313 #ifdef UNDER_CE
    314 OMX_EXPORT
    315 #endif
    316 OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComponent)
    317 {
    318     OMX_COMPONENTTYPE* pHandle                  = NULL;
    319     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
    320     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
    321     VIDEOENC_PORT_TYPE* pCompPortIn             = NULL;
    322     VIDEOENC_PORT_TYPE* pCompPortOut            = NULL;
    323     OMX_PARAM_PORTDEFINITIONTYPE* pPortDef      = NULL;
    324     OMX_VIDEO_PARAM_PORTFORMATTYPE* pPortFormat = NULL;
    325     OMX_PRIORITYMGMTTYPE* pPriorityMgmt         = NULL;
    326     VIDENC_NODE* pMemoryListHead                = NULL;
    327     struct OMX_TI_Debug dbg;
    328 
    329     OMX_S32 nError = 0;
    330     OMX_U32 i = 0;
    331     char* sDynamicFormat;
    332 #ifdef UNDER_CE
    333     pthread_attr_t attr;
    334     memset(&attr, 0, sizeof(attr));
    335 #endif
    336 
    337 
    338     /* get default settings for debug */
    339     OMX_DBG_INIT(dbg, "OMX_DBG_VIDENC");
    340 
    341     /*dlopen("libLCML.so", RTLD_LAZY);*/
    342     OMX_PRINT2(dbg, "Enter to ComponetInit\n");
    343     if (!hComponent)
    344     {
    345         eError = OMX_ErrorBadParameter;
    346         goto OMX_CONF_CMD_BAIL;
    347     }
    348     pHandle = (OMX_COMPONENTTYPE*)hComponent;
    349     eError = OMX_VIDENC_ListCreate(&dbg, &pMemoryListHead);
    350     OMX_CONF_BAIL_IF_ERROR(eError);
    351 
    352     /* Allocate memory for component's private data area */
    353     VIDENC_MALLOC(pHandle->pComponentPrivate,
    354                   sizeof(VIDENC_COMPONENT_PRIVATE),
    355                   VIDENC_COMPONENT_PRIVATE,
    356                   pMemoryListHead, dbg);
    357 
    358     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate;
    359     pComponentPrivate->pMemoryListHead = pMemoryListHead;
    360 
    361     pComponentPrivate->dbg = dbg;
    362     pComponentPrivate->compressionFormats[0]=OMX_VIDEO_CodingAVC;
    363     pComponentPrivate->compressionFormats[1]=OMX_VIDEO_CodingMPEG4;
    364     pComponentPrivate->compressionFormats[2]=OMX_VIDEO_CodingH263;
    365     pComponentPrivate->colorFormats[0]=OMX_COLOR_FormatYUV420Planar;
    366     pComponentPrivate->colorFormats[1]=OMX_COLOR_FormatYCbYCr;
    367     pComponentPrivate->colorFormats[2]=OMX_COLOR_FormatCbYCrY;
    368 
    369 #ifdef __PERF_INSTRUMENTATION__
    370     pComponentPrivate->pPERF = PERF_Create(PERF_FOURCC('V','E',' ',' '),
    371                                            PERF_ModuleLLMM |
    372                                            PERF_ModuleVideoEncode);
    373 #endif
    374 
    375     pComponentPrivate->bDeblockFilter       = OMX_TRUE;
    376     pComponentPrivate->nVBVSize             = 120;
    377     pComponentPrivate->bForceIFrame         = OMX_FALSE;
    378     pComponentPrivate->nIntraFrameInterval  = 30;
    379     pComponentPrivate->nQPI                 = 12;
    380     pComponentPrivate->nAIRRate             = 0;
    381     pComponentPrivate->ucUnrestrictedMV     = 0;
    382     pComponentPrivate->bHideEvents          = OMX_FALSE;
    383     pComponentPrivate->bHandlingFatalError  = OMX_FALSE;
    384     pComponentPrivate->bUnresponsiveDsp     = OMX_FALSE;
    385     pComponentPrivate->bCodecLoaded         = OMX_FALSE;
    386     pComponentPrivate->cComponentName       = "OMX.TI.Video.encoder";
    387     pComponentPrivate->sps = NULL;
    388     pComponentPrivate->spsLen = 0;
    389 
    390 #ifdef __KHRONOS_CONF__
    391     pComponentPrivate->bPassingIdleToLoaded = OMX_FALSE;
    392     pComponentPrivate->bErrorLcmlHandle     = OMX_FALSE;
    393 #endif
    394 
    395     /*Initialize Circular Buffer*/
    396     OMX_CONF_CIRCULAR_BUFFER_INIT(pComponentPrivate);
    397 
    398     /* ASO/FMO*/
    399     pComponentPrivate->numSliceASO = 0;
    400     for( i=0; i<MAXNUMSLCGPS;i++)
    401     {
    402         pComponentPrivate->asoSliceOrder[i] = 0;
    403     }
    404     pComponentPrivate->numSliceGroups                = 0;
    405     pComponentPrivate->sliceGroupMapType             = 0;
    406     pComponentPrivate->sliceGroupChangeDirectionFlag = 0;
    407     pComponentPrivate->sliceGroupChangeRate          = 0;
    408     pComponentPrivate->sliceGroupChangeCycle         = 0;
    409     for( i=0; i<MAXNUMSLCGPS;i++)
    410     {
    411         pComponentPrivate->sliceGroupParams[i] = 0;
    412     }
    413 
    414     /*Assigning address of Component Structure point to place holder inside
    415        component private structure
    416     */
    417     ((VIDENC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate)->pHandle = pHandle;
    418 
    419     /* fill in function pointers */
    420     pHandle->SetCallbacks           = SetCallbacks;
    421     pHandle->GetComponentVersion    = GetComponentVersion;
    422     pHandle->SendCommand            = SendCommand;
    423     pHandle->GetParameter           = GetParameter;
    424     pHandle->SetParameter           = SetParameter;
    425     pHandle->GetConfig              = GetConfig;
    426     pHandle->SetConfig              = SetConfig;
    427     pHandle->GetExtensionIndex      = ExtensionIndex;
    428     pHandle->GetState               = GetState;
    429     pHandle->ComponentTunnelRequest = ComponentTunnelRequest;
    430     pHandle->UseBuffer              = UseBuffer;
    431     pHandle->AllocateBuffer         = AllocateBuffer;
    432     pHandle->FreeBuffer             = FreeBuffer;
    433     pHandle->EmptyThisBuffer        = EmptyThisBuffer;
    434     pHandle->FillThisBuffer         = FillThisBuffer;
    435     pHandle->ComponentDeInit        = ComponentDeInit;
    436 #ifdef __KHRONOS_CONF_1_1__
    437     pHandle->ComponentRoleEnum      = ComponentRoleEnum;
    438 
    439 sDynamicFormat = getenv("FORMAT");
    440 /*printf("\n ** FORMAT = %s\n\n", sDynamicFormat);*/
    441 #if 1
    442     if (sDynamicFormat != NULL)
    443     {
    444         if ( strcmp(sDynamicFormat,  "MPEG4") == 0 )
    445         {
    446 
    447     strcpy((char *)pComponentPrivate->componentRole.cRole, "video_encoder.mpeg4");
    448         }
    449         else if (strcmp(sDynamicFormat,  "H263") == 0 )
    450         {
    451     strcpy((char *)pComponentPrivate->componentRole.cRole, "video_encoder.h263");
    452         }
    453         else if (strcmp(sDynamicFormat,  "H264") == 0 )
    454         {
    455     strcpy((char *)pComponentPrivate->componentRole.cRole, "video_encoder.avc");
    456         }
    457         }
    458     else
    459     {
    460     strcpy((char *)pComponentPrivate->componentRole.cRole, "video_encoder.avc");
    461         }
    462 #else
    463     strcpy((char *)pComponentPrivate->componentRole.cRole, "VideoEncode");
    464 /*    strcpy((char *)pComponentPrivate->componentRole.cRole, "video_encoder.mpeg4");*/
    465 #endif
    466 #endif
    467 
    468     /* Allocate memory for component data structures */
    469     VIDENC_MALLOC(pComponentPrivate->pPortParamType,
    470                   sizeof(OMX_PORT_PARAM_TYPE),
    471                   OMX_PORT_PARAM_TYPE,
    472                   pMemoryListHead, dbg);
    473 #ifdef __KHRONOS_CONF_1_1__
    474     VIDENC_MALLOC(pComponentPrivate->pPortAudioType,
    475                   sizeof(OMX_PORT_PARAM_TYPE),
    476                   OMX_PORT_PARAM_TYPE,
    477                   pMemoryListHead, dbg);
    478     VIDENC_MALLOC(pComponentPrivate->pPortImageType,
    479               sizeof(OMX_PORT_PARAM_TYPE),
    480               OMX_PORT_PARAM_TYPE,
    481                   pMemoryListHead, dbg);
    482     VIDENC_MALLOC(pComponentPrivate->pPortOtherType,
    483                   sizeof(OMX_PORT_PARAM_TYPE),
    484                   OMX_PORT_PARAM_TYPE,
    485                   pMemoryListHead, dbg);
    486 #endif
    487 
    488 
    489     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_INPUT_PORT],
    490                   sizeof(VIDEOENC_PORT_TYPE),
    491                   VIDEOENC_PORT_TYPE,
    492                   pMemoryListHead, dbg);
    493     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT],
    494                   sizeof(VIDEOENC_PORT_TYPE),
    495                   VIDEOENC_PORT_TYPE,
    496                   pMemoryListHead, dbg);
    497     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pPortDef,
    498                   sizeof(OMX_PARAM_PORTDEFINITIONTYPE),
    499                   OMX_PARAM_PORTDEFINITIONTYPE,
    500                   pMemoryListHead, dbg);
    501     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pPortDef,
    502                   sizeof(OMX_PARAM_PORTDEFINITIONTYPE),
    503                   OMX_PARAM_PORTDEFINITIONTYPE,
    504                   pMemoryListHead, dbg);
    505     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pPortFormat,
    506                   sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE),
    507                   OMX_VIDEO_PARAM_PORTFORMATTYPE,
    508                   pMemoryListHead, dbg);
    509     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pPortFormat,
    510                   sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE),
    511                   OMX_VIDEO_PARAM_PORTFORMATTYPE,
    512                   pMemoryListHead, dbg);
    513 #ifdef __KHRONOS_CONF_1_1__
    514     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pProfileType,
    515                   sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE),
    516                   OMX_VIDEO_PARAM_PROFILELEVELTYPE,
    517                   pMemoryListHead, dbg);
    518     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pProfileType,
    519                   sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE),
    520                   OMX_VIDEO_PARAM_PROFILELEVELTYPE,
    521                   pMemoryListHead, dbg);
    522     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pBitRateTypeConfig,
    523                   sizeof(OMX_VIDEO_CONFIG_BITRATETYPE),
    524                   OMX_VIDEO_CONFIG_BITRATETYPE,
    525                   pMemoryListHead, dbg);
    526     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pBitRateTypeConfig,
    527                   sizeof(OMX_VIDEO_CONFIG_BITRATETYPE),
    528                   OMX_VIDEO_CONFIG_BITRATETYPE,
    529                   pMemoryListHead, dbg);
    530     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pFrameRateConfig,
    531                   sizeof(OMX_CONFIG_FRAMERATETYPE),
    532                   OMX_CONFIG_FRAMERATETYPE,
    533                   pMemoryListHead, dbg);
    534     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pFrameRateConfig,
    535                   sizeof(OMX_CONFIG_FRAMERATETYPE),
    536                   OMX_CONFIG_FRAMERATETYPE,
    537                   pMemoryListHead, dbg);
    538     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pErrorCorrectionType,
    539                   sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE),
    540                   OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE,
    541                   pMemoryListHead, dbg);
    542     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pIntraRefreshType,
    543                   sizeof(OMX_VIDEO_PARAM_INTRAREFRESHTYPE),
    544                   OMX_VIDEO_PARAM_INTRAREFRESHTYPE,
    545                   pMemoryListHead, dbg);
    546 #endif
    547     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pBitRateType,
    548                   sizeof(OMX_VIDEO_PARAM_BITRATETYPE),
    549                   OMX_VIDEO_PARAM_BITRATETYPE,
    550                   pMemoryListHead, dbg);
    551     VIDENC_MALLOC(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pBitRateType,
    552                   sizeof(OMX_VIDEO_PARAM_BITRATETYPE),
    553                   OMX_VIDEO_PARAM_BITRATETYPE,
    554                   pMemoryListHead, dbg);
    555     VIDENC_MALLOC(pComponentPrivate->pPriorityMgmt,
    556                   sizeof(OMX_PRIORITYMGMTTYPE),
    557                   OMX_PRIORITYMGMTTYPE,
    558                   pMemoryListHead, dbg);
    559     VIDENC_MALLOC(pComponentPrivate->pH264,
    560                   sizeof(OMX_VIDEO_PARAM_AVCTYPE),
    561                   OMX_VIDEO_PARAM_AVCTYPE,
    562                   pMemoryListHead, dbg);
    563     VIDENC_MALLOC(pComponentPrivate->pMpeg4,
    564                   sizeof(OMX_VIDEO_PARAM_MPEG4TYPE),
    565                   OMX_VIDEO_PARAM_MPEG4TYPE,
    566                   pMemoryListHead, dbg);
    567     VIDENC_MALLOC(pComponentPrivate->pH263,
    568                   sizeof(OMX_VIDEO_PARAM_H263TYPE),
    569                   OMX_VIDEO_PARAM_H263TYPE,
    570                   pMemoryListHead, dbg);
    571     VIDENC_MALLOC(pComponentPrivate->pVidParamBitrate,
    572                   sizeof(OMX_VIDEO_PARAM_BITRATETYPE),
    573                   OMX_VIDEO_PARAM_BITRATETYPE,
    574                   pMemoryListHead, dbg);
    575     VIDENC_MALLOC(pComponentPrivate->pQuantization,
    576                   sizeof(OMX_VIDEO_PARAM_QUANTIZATIONTYPE),
    577                   OMX_VIDEO_PARAM_QUANTIZATIONTYPE,
    578                   pMemoryListHead, dbg);
    579     VIDENC_MALLOC(pComponentPrivate->pH264IntraPeriod,
    580                   sizeof(OMX_VIDEO_CONFIG_AVCINTRAPERIOD),
    581                   OMX_VIDEO_CONFIG_AVCINTRAPERIOD,
    582                   pMemoryListHead, dbg);
    583     VIDENC_MALLOC(pComponentPrivate->pMotionVector,
    584                   sizeof(OMX_VIDEO_PARAM_MOTIONVECTORTYPE),
    585                   OMX_VIDEO_PARAM_MOTIONVECTORTYPE,
    586                   pMemoryListHead, dbg);
    587     VIDENC_MALLOC(pComponentPrivate->pCapabilityFlags,
    588                   sizeof(PV_OMXComponentCapabilityFlagsType),
    589                   PV_OMXComponentCapabilityFlagsType,
    590                   pMemoryListHead, dbg);
    591 
    592     /* Set pPortParamType defaults */
    593     OMX_CONF_INIT_STRUCT(pComponentPrivate->pPortParamType, OMX_PORT_PARAM_TYPE);
    594     pComponentPrivate->pPortParamType->nPorts = VIDENC_NUM_OF_PORTS;
    595     pComponentPrivate->pPortParamType->nStartPortNumber = VIDENC_INPUT_PORT;
    596 
    597 #ifdef __KHRONOS_CONF_1_1__
    598     OMX_CONF_INIT_STRUCT(pComponentPrivate->pPortAudioType, OMX_PORT_PARAM_TYPE);
    599     pComponentPrivate->pPortAudioType->nPorts = 0;
    600     pComponentPrivate->pPortAudioType->nStartPortNumber = -1;
    601 
    602     OMX_CONF_INIT_STRUCT(pComponentPrivate->pPortImageType, OMX_PORT_PARAM_TYPE);
    603     pComponentPrivate->pPortImageType->nPorts = 0;
    604     pComponentPrivate->pPortImageType->nStartPortNumber = -1;
    605 
    606     OMX_CONF_INIT_STRUCT(pComponentPrivate->pPortOtherType, OMX_PORT_PARAM_TYPE);
    607     pComponentPrivate->pPortOtherType->nPorts = 0;
    608     pComponentPrivate->pPortOtherType->nStartPortNumber = -1;
    609 
    610 #endif
    611 
    612     pCompPortIn = pComponentPrivate->pCompPort[VIDENC_INPUT_PORT];
    613 
    614     /* Set input port defaults */
    615 
    616     pPortDef = pCompPortIn->pPortDef;
    617     OMX_CONF_INIT_STRUCT(pPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
    618     pPortDef->nPortIndex                         = VIDENC_INPUT_PORT;
    619     pPortDef->eDir                               = OMX_DirInput;
    620     pPortDef->nBufferCountActual                 = VIDENC_NUM_OF_IN_BUFFERS;
    621     pPortDef->nBufferCountMin                    = 1;
    622     pPortDef->nBufferSize                        = 0;    /* It is calculated below */
    623     pPortDef->bEnabled                           = OMX_TRUE;
    624     pPortDef->bPopulated                         = OMX_FALSE;
    625     pPortDef->eDomain                            = OMX_PortDomainVideo;
    626     pPortDef->format.video.cMIMEType             = "yuv";
    627     pPortDef->format.video.pNativeRender         = NULL;
    628     pPortDef->format.video.nFrameWidth           = 176;
    629     pPortDef->format.video.nFrameHeight          = 144;
    630     pPortDef->format.video.nStride               = -1;
    631     pPortDef->format.video.nSliceHeight          = -1;
    632     pPortDef->format.video.xFramerate            = fToQ16(15.0);
    633     pPortDef->format.video.bFlagErrorConcealment = OMX_FALSE;
    634     pPortDef->format.video.eCompressionFormat    = OMX_VIDEO_CodingUnused;
    635     pPortDef->format.video.eColorFormat          = OMX_COLOR_FormatYUV420Planar;
    636 
    637     /* Set the default value of the run-time Target Frame Rate to the create-time Frame Rate */
    638     pComponentPrivate->nTargetFrameRate = Q16Tof(pPortDef->format.video.xFramerate);
    639 
    640     CalculateBufferSize(pPortDef, pComponentPrivate);
    641     pComponentPrivate->nInBufferSize = 0;
    642 
    643     for (i = 0; i < VIDENC_MAX_NUM_OF_IN_BUFFERS; i++)
    644     {
    645         VIDENC_MALLOC(pCompPortIn->pBufferPrivate[i],
    646                       sizeof(VIDENC_BUFFER_PRIVATE),
    647                       VIDENC_BUFFER_PRIVATE,
    648                       pMemoryListHead, dbg);
    649     }
    650     for (i = 0; i < VIDENC_MAX_NUM_OF_IN_BUFFERS; i++)
    651     {
    652         pCompPortIn->pBufferPrivate[i]->pBufferHdr = NULL;
    653     }
    654     pCompPortIn->nBufferCnt = 0;
    655 
    656     /* Set output port defaults */
    657     pCompPortOut = pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT];
    658     pPortDef = pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pPortDef;
    659     OMX_CONF_INIT_STRUCT(pPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
    660     pPortDef->nPortIndex                         = VIDENC_OUTPUT_PORT;
    661     pPortDef->eDir                               = OMX_DirOutput;
    662     pPortDef->nBufferCountActual                 = VIDENC_NUM_OF_OUT_BUFFERS;
    663     pPortDef->nBufferCountMin                    = 1;
    664     pPortDef->nBufferSize                        = 0;  /* It is calculated below */
    665     pPortDef->bEnabled                           = OMX_TRUE;
    666     pPortDef->bPopulated                         = OMX_FALSE;
    667     pPortDef->eDomain                            = OMX_PortDomainVideo;
    668     pPortDef->format.video.cMIMEType             = "264";
    669     pPortDef->format.video.pNativeRender         = NULL;
    670     pPortDef->format.video.nFrameWidth           = 176;
    671     pPortDef->format.video.nFrameHeight          = 144;
    672     pPortDef->format.video.nStride               = -1;
    673     pPortDef->format.video.nSliceHeight          = -1;
    674     pPortDef->format.video.xFramerate            = fToQ16(15.0);
    675     pPortDef->format.video.bFlagErrorConcealment = OMX_FALSE;
    676 
    677     if (sDynamicFormat != NULL)
    678     {
    679         if ( strcmp(sDynamicFormat,  "MPEG4") == 0 )
    680         {
    681             pPortDef->format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
    682             pPortDef->format.video.cMIMEType             = "mp4";
    683             pPortDef->format.video.nBitrate              = VIDENC_STRUCT_MPEG4DEFBITRATE[0][1];
    684         }
    685         else if (strcmp(sDynamicFormat,  "H263") == 0 )
    686         {
    687             pPortDef->format.video.eCompressionFormat  = OMX_VIDEO_CodingH263;
    688             pPortDef->format.video.cMIMEType             = "mp4";
    689             pPortDef->format.video.nBitrate              = VIDENC_STRUCT_H263DEFBITRATE[0][1];
    690         }
    691         else if (strcmp(sDynamicFormat,  "H264") == 0 )
    692         {
    693             pPortDef->format.video.eCompressionFormat    = OMX_VIDEO_CodingAVC;
    694             pPortDef->format.video.cMIMEType             = "264";
    695             pPortDef->format.video.nBitrate              = VIDENC_STRUCT_H264DEFBITRATE[0][1];
    696         }
    697     }
    698     else
    699     {
    700         pPortDef->format.video.eCompressionFormat    = OMX_VIDEO_CodingAVC;
    701         pPortDef->format.video.cMIMEType             = "264";
    702         pPortDef->format.video.nBitrate              = VIDENC_STRUCT_H264DEFBITRATE[0][1];
    703     }
    704 
    705     pPortDef->format.video.eColorFormat          = OMX_COLOR_FormatUnused;
    706 
    707     CalculateBufferSize(pPortDef, pComponentPrivate);
    708     pComponentPrivate->nOutBufferSize = 0;
    709 
    710     for (i = 0; i < VIDENC_MAX_NUM_OF_OUT_BUFFERS; i++)
    711     {
    712         VIDENC_MALLOC(pCompPortOut->pBufferPrivate[i],
    713                       sizeof(VIDENC_BUFFER_PRIVATE),
    714                       VIDENC_BUFFER_PRIVATE,
    715                       pMemoryListHead, pComponentPrivate->dbg);
    716     }
    717     for (i = 0; i < VIDENC_MAX_NUM_OF_OUT_BUFFERS; i++)
    718     {
    719         pCompPortOut->pBufferPrivate[i]->pBufferHdr = NULL;
    720     }
    721     /*allocate MPEG4 metadata structure*/
    722     for (i = 0; i < VIDENC_MAX_NUM_OF_OUT_BUFFERS; i++)
    723     {
    724         VIDENC_MALLOC(pCompPortOut->pBufferPrivate[i]->pMetaData,
    725                       sizeof(VIDENC_MPEG4_SEGMENTMODE_METADATA),
    726                       VIDENC_MPEG4_SEGMENTMODE_METADATA,
    727                       pMemoryListHead, pComponentPrivate->dbg);
    728     }
    729 
    730     /*segment mode defaults*/
    731     pComponentPrivate->bMVDataEnable=OMX_FALSE;
    732     pComponentPrivate->bResyncDataEnable=OMX_FALSE;
    733     pCompPortOut->nBufferCnt = 0;
    734 
    735     /* Set input port format defaults */
    736     pPortFormat = pCompPortIn->pPortFormat;
    737     OMX_CONF_INIT_STRUCT(pPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
    738     pPortFormat->nPortIndex         = VIDENC_INPUT_PORT;
    739     pPortFormat->nIndex             = 0x0;
    740     pPortFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
    741     pPortFormat->eColorFormat       = OMX_COLOR_FormatYUV420Planar;
    742 
    743     /* Set output port format defaults */
    744     pPortFormat = pCompPortOut->pPortFormat;
    745     OMX_CONF_INIT_STRUCT(pPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
    746     pPortFormat->nPortIndex         = VIDENC_OUTPUT_PORT;
    747     pPortFormat->nIndex             = 0x0;
    748 
    749     if (sDynamicFormat != NULL)
    750     {
    751         if ( strcmp(sDynamicFormat,  "MPEG4") == 0 )
    752         {
    753             pPortFormat->eCompressionFormat = OMX_VIDEO_CodingMPEG4;
    754         }
    755         else if (strcmp(sDynamicFormat,  "H263") == 0 )
    756         {
    757             pPortFormat->eCompressionFormat = OMX_VIDEO_CodingH263;
    758         }
    759         else if (strcmp(sDynamicFormat,  "H264") == 0 )
    760         {
    761             pPortFormat->eCompressionFormat = OMX_VIDEO_CodingAVC;
    762         }
    763     }
    764     else
    765     {
    766         pPortFormat->eCompressionFormat = OMX_VIDEO_CodingAVC;
    767     }
    768 
    769     pPortFormat->eColorFormat       = OMX_COLOR_FormatUnused;
    770 
    771     /* Set pPriorityMgmt defaults */
    772     pPriorityMgmt = pComponentPrivate->pPriorityMgmt;
    773     OMX_CONF_INIT_STRUCT(pPriorityMgmt, OMX_PRIORITYMGMTTYPE);
    774     pPriorityMgmt->nGroupPriority   = -1;
    775     pPriorityMgmt->nGroupID         = -1;
    776 
    777     /* Buffer supplier setting */
    778     pCompPortIn->eSupplierSetting = OMX_BufferSupplyOutput;
    779 
    780     /* Set pH264 defaults */
    781     OMX_CONF_INIT_STRUCT(pComponentPrivate->pH264, OMX_VIDEO_PARAM_AVCTYPE);
    782     pComponentPrivate->pH264->nPortIndex                = VIDENC_OUTPUT_PORT;
    783     pComponentPrivate->pH264->nSliceHeaderSpacing       = 0;
    784     pComponentPrivate->pH264->nPFrames                  = -1;
    785     pComponentPrivate->pH264->nBFrames                  = -1;
    786     pComponentPrivate->pH264->bUseHadamard              = OMX_TRUE; /*OMX_FALSE*/
    787     pComponentPrivate->pH264->nRefFrames                = 1; /*-1;  */
    788     pComponentPrivate->pH264->nRefIdx10ActiveMinus1     = -1;
    789     pComponentPrivate->pH264->nRefIdx11ActiveMinus1     = -1;
    790     pComponentPrivate->pH264->bEnableUEP                = OMX_FALSE;
    791     pComponentPrivate->pH264->bEnableFMO                = OMX_FALSE;
    792     pComponentPrivate->pH264->bEnableASO                = OMX_FALSE;
    793     pComponentPrivate->pH264->bEnableRS                 = OMX_FALSE;
    794     pComponentPrivate->pH264->eProfile                  = OMX_VIDEO_AVCProfileBaseline; /*0x01;*/
    795     pComponentPrivate->pH264->eLevel                    = OMX_VIDEO_AVCLevel1; /*OMX_VIDEO_AVCLevel11;*/
    796     pComponentPrivate->pH264->nAllowedPictureTypes      = -1;
    797     pComponentPrivate->pH264->bFrameMBsOnly             = OMX_FALSE;
    798     pComponentPrivate->pH264->bMBAFF                    = OMX_FALSE;
    799     pComponentPrivate->pH264->bEntropyCodingCABAC       = OMX_FALSE;
    800     pComponentPrivate->pH264->bWeightedPPrediction      = OMX_FALSE;
    801     pComponentPrivate->pH264->nWeightedBipredicitonMode = -1;
    802     pComponentPrivate->pH264->bconstIpred               = OMX_FALSE;
    803     pComponentPrivate->pH264->bDirect8x8Inference       = OMX_FALSE;
    804     pComponentPrivate->pH264->bDirectSpatialTemporal    = OMX_FALSE;
    805     pComponentPrivate->pH264->nCabacInitIdc             = -1;
    806     pComponentPrivate->pH264->eLoopFilterMode           = 1;
    807     /*other h264 defaults*/
    808     pComponentPrivate->intra4x4EnableIdc                = INTRA4x4_IPSLICES;
    809     pComponentPrivate->maxMVperMB                       = 4;
    810     pComponentPrivate->nEncodingPreset                  = 3;/*0:DEFAULT/ 1:HIGH QUALITY/ 2:HIGH SPEED/ 3:USER DEFINED*/
    811     pComponentPrivate->AVCNALFormat                      = VIDENC_AVC_NAL_SLICE;/*VIDENC_AVC_NAL_UNIT;*/
    812     /* Set pMpeg4 defaults */
    813     OMX_CONF_INIT_STRUCT(pComponentPrivate->pMpeg4, OMX_VIDEO_PARAM_MPEG4TYPE);
    814     pComponentPrivate->pMpeg4->nPortIndex           = VIDENC_OUTPUT_PORT;
    815     pComponentPrivate->pMpeg4->nSliceHeaderSpacing  = 0;
    816     pComponentPrivate->pMpeg4->bSVH                 = OMX_FALSE;
    817     pComponentPrivate->pMpeg4->bGov                 = OMX_FALSE;
    818     pComponentPrivate->pMpeg4->nPFrames             = -1;
    819     pComponentPrivate->pMpeg4->nBFrames             = -1;
    820     pComponentPrivate->pMpeg4->nIDCVLCThreshold     = 0;  /*-1*/
    821     pComponentPrivate->pMpeg4->bACPred              = OMX_TRUE;
    822     pComponentPrivate->pMpeg4->nMaxPacketSize       = -1;
    823     pComponentPrivate->pMpeg4->nTimeIncRes          = -1;
    824     pComponentPrivate->pMpeg4->eProfile             = OMX_VIDEO_MPEG4ProfileSimple;
    825 #ifdef __KHRONOS_CONF_1_1__
    826     pComponentPrivate->pMpeg4->eLevel               = OMX_VIDEO_MPEG4Level1;
    827 #else
    828     pComponentPrivate->pMpeg4->eLevel               = 0x0;
    829 #endif
    830     pComponentPrivate->pMpeg4->nAllowedPictureTypes = -1;
    831     pComponentPrivate->pMpeg4->nHeaderExtension     = 0;
    832     pComponentPrivate->pMpeg4->bReversibleVLC       = OMX_FALSE;
    833 
    834     /* Set pH263 defaults */
    835     OMX_CONF_INIT_STRUCT(pComponentPrivate->pH263, OMX_VIDEO_PARAM_H263TYPE);
    836     pComponentPrivate->pH263->nPortIndex               = VIDENC_OUTPUT_PORT;
    837     pComponentPrivate->pH263->nPFrames                 = 0;
    838     pComponentPrivate->pH263->nBFrames                 = 0;
    839     pComponentPrivate->pH263->eProfile                 = OMX_VIDEO_H263ProfileBaseline;
    840     pComponentPrivate->pH263->eLevel                   = OMX_VIDEO_H263Level10;
    841     pComponentPrivate->pH263->bPLUSPTYPEAllowed        = OMX_FALSE;
    842     pComponentPrivate->pH263->nAllowedPictureTypes     = 0;
    843     pComponentPrivate->pH263->bForceRoundingTypeToZero = OMX_TRUE;
    844     pComponentPrivate->pH263->nPictureHeaderRepetition = 0;
    845     pComponentPrivate->pH263->nGOBHeaderInterval       = 1;
    846 
    847     /* Set pVidParamBitrate and intraRefreshType defaults */
    848     OMX_CONF_INIT_STRUCT(pCompPortOut->pErrorCorrectionType, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE);
    849     OMX_CONF_INIT_STRUCT(pCompPortOut->pIntraRefreshType, OMX_VIDEO_PARAM_INTRAREFRESHTYPE);
    850     pCompPortOut->pErrorCorrectionType->nPortIndex= VIDENC_OUTPUT_PORT;
    851     pCompPortOut->pIntraRefreshType->nPortIndex= VIDENC_OUTPUT_PORT;
    852     /*initDSP params*/
    853     /*Error resilience tools used by MPEG4/H263 encoder*/
    854     pCompPortOut->pErrorCorrectionType->bEnableHEC= OMX_TRUE;/*shouldn't be 0?*/
    855     pCompPortOut->pErrorCorrectionType->bEnableResync = OMX_TRUE;/*shouldn't be 0?*/
    856     pCompPortOut->pErrorCorrectionType->bEnableDataPartitioning= OMX_FALSE;
    857     pCompPortOut->pErrorCorrectionType->bEnableRVLC= OMX_FALSE;
    858     pCompPortOut->pErrorCorrectionType->nResynchMarkerSpacing = 1024;
    859 
    860     pCompPortOut->pIntraRefreshType->nAirRef = 10;
    861     /* Set pVidParamBitrate defaults */
    862     OMX_CONF_INIT_STRUCT(pComponentPrivate->pVidParamBitrate, OMX_VIDEO_PARAM_BITRATETYPE);
    863     pComponentPrivate->pVidParamBitrate->nPortIndex     = VIDENC_OUTPUT_PORT;
    864     pComponentPrivate->pVidParamBitrate->eControlRate   = OMX_Video_ControlRateConstant;
    865     pComponentPrivate->pVidParamBitrate->nTargetBitrate = 64000;
    866     /**/
    867     pComponentPrivate->nMIRRate=0;
    868     /* Set pQuantization defaults */
    869     OMX_CONF_INIT_STRUCT(pComponentPrivate->pQuantization, OMX_VIDEO_PARAM_QUANTIZATIONTYPE);
    870     pComponentPrivate->pQuantization->nPortIndex = VIDENC_OUTPUT_PORT;
    871     pComponentPrivate->pQuantization->nQpI       = 12;
    872     pComponentPrivate->pQuantization->nQpP       = 0;
    873     pComponentPrivate->pQuantization->nQpB       = 0;
    874 
    875     /* Set pMotionVector defaults */
    876     OMX_CONF_INIT_STRUCT(pComponentPrivate->pMotionVector, OMX_VIDEO_PARAM_MOTIONVECTORTYPE);
    877     pComponentPrivate->pMotionVector->nPortIndex = VIDENC_OUTPUT_PORT;
    878     pComponentPrivate->pMotionVector->bFourMV    = 1;
    879     pComponentPrivate->pMotionVector->bUnrestrictedMVs = 0;   /* unused */
    880     pComponentPrivate->pMotionVector->eAccuracy  = OMX_Video_MotionVectorQuarterPel;
    881     pComponentPrivate->pMotionVector->sXSearchRange = pComponentPrivate->pMotionVector->sXSearchRange = 64;
    882 
    883     /* Set pIntraPeriod defaults */
    884     OMX_CONF_INIT_STRUCT(pComponentPrivate->pH264IntraPeriod, OMX_VIDEO_CONFIG_AVCINTRAPERIOD);
    885     pComponentPrivate->pH264IntraPeriod->nPortIndex = VIDENC_OUTPUT_PORT;
    886     pComponentPrivate->pH264IntraPeriod->nIDRPeriod = 0;
    887     pComponentPrivate->pH264IntraPeriod->nPFrames = 30;
    888 
    889 #ifdef __KHRONOS_CONF_1_1__
    890     OMX_CONF_INIT_STRUCT(pCompPortIn->pProfileType, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
    891     pCompPortIn->pProfileType->nPortIndex = VIDENC_INPUT_PORT;
    892     pCompPortIn->pProfileType->eLevel = OMX_VIDEO_AVCLevel1;
    893     pCompPortIn->pProfileType->eProfile = OMX_VIDEO_AVCProfileBaseline;
    894     pCompPortIn->pProfileType->nProfileIndex = 0;
    895 
    896     OMX_CONF_INIT_STRUCT(pCompPortOut->pProfileType, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
    897     pCompPortOut->pProfileType->nPortIndex = VIDENC_OUTPUT_PORT;
    898     pCompPortOut->pProfileType->eLevel = OMX_VIDEO_AVCLevel1;
    899     pCompPortOut->pProfileType->eProfile = OMX_VIDEO_AVCProfileBaseline;
    900     pCompPortOut->pProfileType->nProfileIndex = 0;
    901     OMX_CONF_INIT_STRUCT(pCompPortIn->pFrameRateConfig, OMX_CONFIG_FRAMERATETYPE);
    902     pCompPortIn->pFrameRateConfig->nPortIndex = VIDENC_INPUT_PORT;
    903     pCompPortIn->pFrameRateConfig->xEncodeFramerate = 0;
    904 
    905     OMX_CONF_INIT_STRUCT(pCompPortOut->pFrameRateConfig, OMX_CONFIG_FRAMERATETYPE);
    906     pCompPortOut->pFrameRateConfig->nPortIndex = VIDENC_OUTPUT_PORT;
    907     pCompPortOut->pFrameRateConfig->xEncodeFramerate = (15<<16);
    908 
    909     OMX_CONF_INIT_STRUCT(pCompPortIn->pBitRateTypeConfig, OMX_VIDEO_CONFIG_BITRATETYPE);
    910     pCompPortIn->pBitRateTypeConfig->nPortIndex = VIDENC_INPUT_PORT;
    911     pCompPortIn->pBitRateTypeConfig->nEncodeBitrate = 0;
    912 
    913     OMX_CONF_INIT_STRUCT(pCompPortOut->pBitRateTypeConfig, OMX_VIDEO_CONFIG_BITRATETYPE);
    914     pCompPortOut->pBitRateTypeConfig->nPortIndex = VIDENC_OUTPUT_PORT;
    915     if(pPortDef->format.video.eCompressionFormat == OMX_VIDEO_CodingMPEG4)
    916     {
    917         pCompPortOut->pBitRateTypeConfig->nEncodeBitrate = VIDENC_STRUCT_MPEG4DEFBITRATE[0][1];
    918     }
    919     else if(pPortDef->format.video.eCompressionFormat == OMX_VIDEO_CodingH263) {
    920         pCompPortOut->pBitRateTypeConfig->nEncodeBitrate = VIDENC_STRUCT_H263DEFBITRATE[0][1];
    921     }
    922     else {
    923         pCompPortOut->pBitRateTypeConfig->nEncodeBitrate = VIDENC_STRUCT_H264DEFBITRATE[0][1];
    924     }
    925 
    926 #endif
    927     OMX_CONF_INIT_STRUCT(pCompPortIn->pBitRateType, OMX_VIDEO_PARAM_BITRATETYPE);
    928     pCompPortIn->pBitRateType->nPortIndex = VIDENC_INPUT_PORT;
    929     pCompPortIn->pBitRateType->eControlRate = OMX_Video_ControlRateDisable;
    930     pCompPortIn->pBitRateType->nTargetBitrate = 0;
    931 
    932     OMX_CONF_INIT_STRUCT(pCompPortOut->pBitRateType, OMX_VIDEO_PARAM_BITRATETYPE);
    933     pCompPortOut->pBitRateType->nPortIndex = VIDENC_OUTPUT_PORT;
    934     pCompPortOut->pBitRateType->eControlRate = OMX_Video_ControlRateConstant;
    935     pCompPortOut->pBitRateType->nTargetBitrate = pCompPortOut->pBitRateTypeConfig->nEncodeBitrate;
    936 
    937     /*set the capability Flags needed by Opencore*/
    938     pComponentPrivate->pCapabilityFlags->iIsOMXComponentMultiThreaded=OMX_TRUE;
    939     pComponentPrivate->pCapabilityFlags->iOMXComponentCanHandleIncompleteFrames=OMX_FALSE;
    940     pComponentPrivate->pCapabilityFlags->iOMXComponentSupportsExternalInputBufferAlloc=OMX_FALSE;
    941     pComponentPrivate->pCapabilityFlags->iOMXComponentSupportsExternalOutputBufferAlloc=OMX_FALSE;
    942     pComponentPrivate->pCapabilityFlags->iOMXComponentSupportsMovableInputBuffers=OMX_TRUE;
    943     pComponentPrivate->pCapabilityFlags->iOMXComponentSupportsPartialFrames=OMX_FALSE;
    944     pComponentPrivate->pCapabilityFlags->iOMXComponentUsesFullAVCFrames=OMX_FALSE;
    945     pComponentPrivate->pCapabilityFlags->iOMXComponentUsesNALStartCode=OMX_FALSE;
    946     pComponentPrivate->nLastUpdateTime = 0;
    947     pComponentPrivate->nFrameRateUpdateInterval = 60;
    948     pComponentPrivate->nFrameCount = 0;
    949     pComponentPrivate->nVideoTime = 0;
    950     pComponentPrivate->EmptybufferdoneCount = 0;
    951     pComponentPrivate->EmptythisbufferCount = 0;
    952     pComponentPrivate->FillbufferdoneCount  = 0;
    953     pComponentPrivate->FillthisbufferCount  = 0;
    954 #ifndef UNDER_CE
    955     /* Initialize Mutex for Buffer Tracking */
    956     pthread_mutex_init(&(pComponentPrivate->mVideoEncodeBufferMutex), NULL);
    957 #else
    958     /* Add WinCE critical section API */
    959 #endif
    960 
    961     /* create the pipe used to maintain free input buffers*/
    962     eError = pipe(pComponentPrivate->nFree_oPipe);
    963     if (eError)
    964     {
    965         OMX_CONF_SET_ERROR_BAIL(eError, OMX_ErrorInsufficientResources);
    966     }
    967 
    968     /* create the pipe used to maintain input buffers*/
    969     eError = pipe(pComponentPrivate->nFilled_iPipe);
    970     if (eError)
    971     {
    972         OMX_CONF_SET_ERROR_BAIL(eError, OMX_ErrorInsufficientResources);
    973     }
    974 
    975     /* create the pipe used to send commands to the thread */
    976     eError = pipe(pComponentPrivate->nCmdPipe);
    977     if (eError)
    978     {
    979         OMX_CONF_SET_ERROR_BAIL(eError, OMX_ErrorInsufficientResources);
    980     }
    981 
    982     /* create the pipe used to send commands to the thread */
    983     eError = pipe(pComponentPrivate->nCmdDataPipe);
    984     if (eError)
    985     {
    986         OMX_CONF_SET_ERROR_BAIL(eError, OMX_ErrorInsufficientResources);
    987     }
    988 
    989 #ifdef RESOURCE_MANAGER_ENABLED
    990     /* Initialize Resource Manager */
    991     eError = RMProxy_NewInitalizeEx(OMX_COMPONENTTYPE_VIDEO);
    992     if (eError != OMX_ErrorNone)
    993     {
    994         OMX_PRMGR4(dbg, "Error returned from loading ResourceManagerProxy thread...\n");
    995         OMX_CONF_SET_ERROR_BAIL(eError, OMX_ErrorInsufficientResources);
    996     }
    997 #endif
    998     /* Create the Component Thread */
    999 #ifdef UNDER_CE
   1000     attr.__inheritsched = PTHREAD_EXPLICIT_SCHED;
   1001     attr.__schedparam.__sched_priority = OMX_VIDEO_ENCODER_THREAD_PRIORITY;
   1002     nError = pthread_create(&ComponentThread, &attr, OMX_VIDENC_Thread, pComponentPrivate);
   1003 #else
   1004     nError = pthread_create(&pComponentPrivate->ComponentThread, NULL, OMX_VIDENC_Thread, pComponentPrivate);
   1005 #endif
   1006 
   1007 
   1008 #ifndef UNDER_CE
   1009     if (nError == EAGAIN)
   1010     {
   1011         OMX_CONF_SET_ERROR_BAIL(eError, OMX_ErrorInsufficientResources);
   1012     }
   1013 #else
   1014     if (nError || !(pComponentPrivate->ComponentThread))
   1015     {
   1016         OMX_CONF_SET_ERROR_BAIL(eError, OMX_ErrorInsufficientResources);
   1017     }
   1018 #endif
   1019 
   1020 #ifdef __PERF_INSTRUMENTATION__
   1021     PERF_ThreadCreated(pComponentPrivate->pPERF, pComponentPrivate->ComponentThread,
   1022                        PERF_FOURCC('V','E',' ','T'));
   1023 #endif
   1024 #ifndef UNDER_CE
   1025     /*pthread_mutex_init(&pComponentPrivate->videoe_mutex_app, NULL);*/
   1026     pthread_mutex_init(&pComponentPrivate->videoe_mutex, NULL);
   1027     pthread_cond_init (&pComponentPrivate->populate_cond, NULL);
   1028     pthread_mutex_init(&pComponentPrivate->videoe_mutex_app, NULL);
   1029     pthread_cond_init (&pComponentPrivate->unpopulate_cond, NULL);
   1030     pthread_cond_init (&pComponentPrivate->flush_cond, NULL);
   1031     pthread_cond_init (&pComponentPrivate->stop_cond, NULL);
   1032 
   1033     pthread_mutex_init(&bufferReturned_mutex, NULL);
   1034     pthread_cond_init (&bufferReturned_condition, NULL);
   1035 #else
   1036     OMX_CreateEvent(&(pComponentPrivate->InLoaded_event));
   1037     OMX_CreateEvent(&(pComponentPrivate->InIdle_event));
   1038 #endif
   1039 
   1040     if(pthread_mutex_init(&pComponentPrivate->mutexStateChangeRequest, NULL)) {
   1041        return OMX_ErrorUndefined;
   1042     }
   1043 
   1044     if(pthread_cond_init (&pComponentPrivate->StateChangeCondition, NULL)) {
   1045        return OMX_ErrorUndefined;
   1046     }
   1047 OMX_CONF_CMD_BAIL:
   1048     OMX_PRINT2(dbg, "Component Init Exit\n");
   1049     return eError;
   1050 }
   1051 
   1052 /*----------------------------------------------------------------------------*/
   1053 /**
   1054   *  SetCallbacks() Sets application callbacks to the component
   1055   *
   1056   * This method will update application callbacks
   1057   * the application.
   1058   *
   1059   * @param pComp         handle for this instance of the component
   1060   * @param pCallBacks    application callbacks
   1061   * @param ptr
   1062   *
   1063   * @retval OMX_NoError              Success, ready to roll
   1064   *         OMX_Error_BadParameter   The input parameter pointer is null
   1065   **/
   1066 /*----------------------------------------------------------------------------*/
   1067 
   1068 static OMX_ERRORTYPE SetCallbacks (OMX_IN  OMX_HANDLETYPE hComponent,
   1069                                    OMX_IN  OMX_CALLBACKTYPE* pCallBacks,
   1070                                    OMX_IN  OMX_PTR pAppData)
   1071 {
   1072     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   1073     OMX_COMPONENTTYPE* pHandle                  = NULL;
   1074     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   1075     OMX_U32* pTmp                               = NULL;
   1076 
   1077     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   1078     OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
   1079     OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, pCallBacks, 1, 1);
   1080 
   1081     /*Copy the callbacks of the application to the component private */
   1082     pTmp = memcpy (&(pComponentPrivate->sCbData), pCallBacks, sizeof(OMX_CALLBACKTYPE));
   1083     if (pTmp == NULL)
   1084     {
   1085         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined, pComponentPrivate->dbg,
   1086                                OMX_TRACE4, "Failed to copy callbacks.\n");
   1087     }
   1088 
   1089     /*copy the application private data to component memory*/
   1090     pHandle = (OMX_COMPONENTTYPE*)hComponent;
   1091     pHandle->pApplicationPrivate = pAppData;
   1092     pComponentPrivate->eState = OMX_StateLoaded;
   1093 
   1094 OMX_CONF_CMD_BAIL:
   1095     return eError;
   1096 }
   1097 
   1098 /*----------------------------------------------------------------------------*/
   1099 /**
   1100   *  GetComponentVersion() Sets application callbacks to the component
   1101   *
   1102   * This method will update application callbacks
   1103   * the application.
   1104   *
   1105   * @param pComp         handle for this instance of the component
   1106   * @param pCallBacks    application callbacks
   1107   * @param ptr
   1108   *
   1109   * @retval OMX_NoError              Success, ready to roll
   1110   *         OMX_Error_BadParameter   The input parameter pointer is null
   1111   **/
   1112 /*----------------------------------------------------------------------------*/
   1113 
   1114 static OMX_ERRORTYPE GetComponentVersion (OMX_HANDLETYPE hComp,
   1115                                           OMX_STRING  szComponentName,
   1116                                           OMX_VERSIONTYPE* pComponentVersion,
   1117                                           OMX_VERSIONTYPE* pSpecVersion,
   1118                                           OMX_UUIDTYPE* pComponentUUID)
   1119 {
   1120     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   1121     OMX_COMPONENTTYPE* pHandle                  = NULL;
   1122     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   1123 
   1124     OMX_CONF_CHECK_CMD(hComp, ((OMX_COMPONENTTYPE *) hComp)->pComponentPrivate, 1);
   1125     pHandle = (OMX_COMPONENTTYPE*)hComp;
   1126     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate;
   1127 
   1128     OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, szComponentName, pComponentVersion, pSpecVersion);
   1129     OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, pComponentUUID, 1, 1);
   1130 
   1131     if (pComponentPrivate->eState == OMX_StateInvalid)
   1132     {
   1133         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   1134                                pComponentPrivate->dbg, OMX_PRSTATE3,
   1135                                "Component is in invalid state.\n");
   1136     }
   1137 
   1138     strcpy(szComponentName, pComponentPrivate->cComponentName);
   1139     memcpy(pComponentVersion,
   1140            &(pComponentPrivate->ComponentVersion.s),
   1141            sizeof(pComponentPrivate->ComponentVersion.s));
   1142     memcpy(pSpecVersion,
   1143            &(pComponentPrivate->SpecVersion.s),
   1144            sizeof(pComponentPrivate->SpecVersion.s));
   1145 
   1146 OMX_CONF_CMD_BAIL:
   1147     return eError;
   1148 }
   1149 
   1150 /*----------------------------------------------------------------------------*/
   1151 /**
   1152   *  SendCommand() Sets application callbacks to the component
   1153   *
   1154   * This method will update application callbacks
   1155   * the application.
   1156   *
   1157   * @param pComp         handle for this instance of the component
   1158   * @param pCallBacks    application callbacks
   1159   * @param ptr
   1160   *
   1161   * @retval OMX_NoError              Success, ready to roll
   1162   *         OMX_Error_BadParameter   The input parameter pointer is null
   1163   **/
   1164 /*----------------------------------------------------------------------------*/
   1165 
   1166 static OMX_ERRORTYPE SendCommand (OMX_IN OMX_HANDLETYPE hComponent,
   1167                                   OMX_IN OMX_COMMANDTYPE Cmd,
   1168                                   OMX_IN OMX_U32 nParam1,
   1169                                   OMX_IN OMX_PTR pCmdData)
   1170 {
   1171     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   1172     int nRet                                    = 0;
   1173     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   1174     char* szCommandType                         = NULL;
   1175     char* szParam                               = NULL;
   1176     OMX_PARAM_PORTDEFINITIONTYPE* pPortDefIn    = NULL;
   1177     OMX_PARAM_PORTDEFINITIONTYPE* pPortDefOut   = NULL;
   1178     VIDENC_NODE* pMemoryListHead                = NULL;
   1179 
   1180     OMX_CONF_CHECK_CMD(hComponent, ((OMX_COMPONENTTYPE *) hComponent)->pComponentPrivate, 1);
   1181 
   1182     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   1183     if (Cmd == OMX_CommandMarkBuffer)
   1184     {
   1185         OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, pCmdData, 1, 1);
   1186     }
   1187 
   1188     if (pComponentPrivate->eState == OMX_StateInvalid)
   1189     {
   1190         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   1191                                pComponentPrivate->dbg, OMX_PRSTATE3,
   1192                                "Component is in invalid state.\n");
   1193     }
   1194 
   1195     pMemoryListHead = pComponentPrivate->pMemoryListHead;
   1196 
   1197 #ifdef __PERF_INSTRUMENTATION__
   1198     PERF_SendingCommand(pComponentPrivate->pPERF,
   1199                         Cmd,
   1200                         (Cmd == OMX_CommandMarkBuffer) ? ((OMX_U32) pCmdData) : nParam1,
   1201                         PERF_ModuleComponent);
   1202 #endif
   1203 
   1204     switch (Cmd)
   1205     {
   1206         case OMX_CommandStateSet:
   1207             /* Add a pending transition */
   1208             if(AddStateTransition(pComponentPrivate) != OMX_ErrorNone) {
   1209                return OMX_ErrorUndefined;
   1210            }
   1211 
   1212 #ifdef __KHRONOS_CONF__
   1213             if(nParam1 == OMX_StateLoaded &&
   1214                pComponentPrivate->eState == OMX_StateIdle)
   1215             {
   1216                 pComponentPrivate->bPassingIdleToLoaded = OMX_TRUE;
   1217             }
   1218 #endif
   1219         OMX_PRCOMM2(pComponentPrivate->dbg, "Write to cmd pipe!\n");
   1220             nRet = write(pComponentPrivate->nCmdPipe[1], &Cmd, sizeof(Cmd));
   1221             if (nRet == -1) {
   1222                  /* Decrement reference count without generating any signal */
   1223                  if(RemoveStateTransition(pComponentPrivate, 0) != OMX_ErrorNone) {
   1224                      return OMX_ErrorUndefined;
   1225                  }
   1226             }
   1227             nRet = write(pComponentPrivate->nCmdDataPipe[1],
   1228                          &nParam1,
   1229                          sizeof(nParam1));
   1230             if (nRet == -1) {
   1231                  /* Decrement reference count without generating any signal */
   1232                  if(RemoveStateTransition(pComponentPrivate, 0) != OMX_ErrorNone) {
   1233                      return OMX_ErrorUndefined;
   1234                  }
   1235             }
   1236             break;
   1237         case OMX_CommandFlush:
   1238             if (nParam1 > 1 && nParam1 != (OMX_U32)-1)
   1239             {
   1240             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadPortIndex,
   1241                                    pComponentPrivate->dbg, OMX_PRBUFFER4,
   1242                                    "Invalid flush nParam1 (%lu).\n", nParam1);
   1243             }
   1244             nRet = write(pComponentPrivate->nCmdPipe[1], &Cmd, sizeof(Cmd));
   1245             if (nRet == -1)
   1246             {
   1247             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1248                                    pComponentPrivate->dbg, OMX_PRCOMM4,
   1249                                    "Failed to write to cmd pipe.\n");
   1250             }
   1251             nRet = write(pComponentPrivate->nCmdDataPipe[1],
   1252                        &nParam1,
   1253                        sizeof(nParam1));
   1254             if (nRet == -1)
   1255             {
   1256             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1257                                    pComponentPrivate->dbg, OMX_PRCOMM4,
   1258                                    "Failed to write to cmd pipe.\n");
   1259             }
   1260             break;
   1261         case OMX_CommandPortDisable:
   1262 
   1263             pPortDefIn = pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pPortDef;
   1264             pPortDefOut = pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pPortDef;
   1265 
   1266             if (nParam1 == VIDENC_INPUT_PORT ||
   1267                 nParam1 == VIDENC_OUTPUT_PORT ||
   1268                 nParam1 == (OMX_U32)-1)
   1269             {
   1270                 if (nParam1 == VIDENC_INPUT_PORT || nParam1 == (OMX_U32)-1)
   1271                 {
   1272 
   1273                     pPortDefIn->bEnabled = OMX_FALSE;
   1274                 }
   1275                 if (nParam1 == VIDENC_OUTPUT_PORT || nParam1 == (OMX_U32)-1)
   1276                 {
   1277 
   1278                     pPortDefOut->bEnabled = OMX_FALSE;
   1279                 }
   1280             }
   1281             else
   1282             {
   1283             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter,
   1284                                    pComponentPrivate->dbg, OMX_PRBUFFER4,
   1285                                    "Invalid port disable nParam1 (%lu).\n", nParam1);
   1286             }
   1287 
   1288             nRet = write(pComponentPrivate->nCmdPipe[1], &Cmd, sizeof(Cmd));
   1289             if (nRet == -1)
   1290             {
   1291             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1292                                    pComponentPrivate->dbg, OMX_PRCOMM4,
   1293                                    "Failed to write to cmd pipe.\n");
   1294             }
   1295             nRet = write(pComponentPrivate->nCmdDataPipe[1],
   1296                          &nParam1,
   1297                          sizeof(nParam1));
   1298             if (nRet == -1)
   1299             {
   1300             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1301                                    pComponentPrivate->dbg, OMX_PRCOMM4,
   1302                                    "Failed to write to cmd pipe.\n");
   1303             }
   1304             break;
   1305         case OMX_CommandPortEnable:
   1306             pPortDefIn = pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pPortDef;
   1307             pPortDefOut = pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pPortDef;
   1308 
   1309             if (nParam1 == VIDENC_INPUT_PORT ||
   1310                 nParam1 == VIDENC_OUTPUT_PORT ||
   1311                 nParam1 == (OMX_U32)-1)
   1312             {
   1313                 if (nParam1 == VIDENC_INPUT_PORT || nParam1 == (OMX_U32)-1)
   1314                 {
   1315                     pPortDefIn->bEnabled = OMX_TRUE;
   1316                 }
   1317                 if (nParam1 == VIDENC_OUTPUT_PORT || nParam1 == (OMX_U32)-1)
   1318                 {
   1319                     pPortDefOut->bEnabled = OMX_TRUE;
   1320                 }
   1321             }
   1322             else
   1323             {
   1324             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter,
   1325                                    pComponentPrivate->dbg, OMX_PRBUFFER4,
   1326                                    "Invalid port enable nParam1 (%lu).\n", nParam1);
   1327             }
   1328 
   1329             nRet = write(pComponentPrivate->nCmdPipe[1], &Cmd, sizeof(Cmd));
   1330             if (nRet == -1)
   1331             {
   1332             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1333                                    pComponentPrivate->dbg, OMX_PRCOMM4,
   1334                                    "Failed to write to cmd pipe.\n");
   1335             }
   1336             nRet = write(pComponentPrivate->nCmdDataPipe[1],
   1337                          &nParam1,
   1338                          sizeof(nParam1));
   1339             if (nRet == -1)
   1340             {
   1341             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1342                                    pComponentPrivate->dbg, OMX_PRCOMM4,
   1343                                    "Failed to write to cmd pipe.\n");
   1344             }
   1345             break;
   1346         case OMX_CommandMarkBuffer:
   1347             if (nParam1 > 0)
   1348             {
   1349             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadPortIndex,
   1350                                    pComponentPrivate->dbg, OMX_PRBUFFER4,
   1351                                    "Invalid port number (%lu).\n", nParam1);
   1352             }
   1353             nRet = write(pComponentPrivate->nCmdPipe[1], &Cmd, sizeof(Cmd));
   1354             if (nRet == -1)
   1355             {
   1356             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1357                                    pComponentPrivate->dbg, OMX_PRCOMM4,
   1358                                    "Failed to write to cmd pipe.\n");
   1359             }
   1360             nRet = write(pComponentPrivate->nCmdDataPipe[1],
   1361                          &pCmdData,
   1362                          sizeof(pCmdData));
   1363             if (nRet == -1)
   1364             {
   1365             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1366                                    pComponentPrivate->dbg, OMX_PRCOMM4,
   1367                                    "Failed to write to cmd pipe.\n");
   1368             }
   1369             break;
   1370         case OMX_CommandMax:
   1371             break;
   1372         default:
   1373         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1374                                pComponentPrivate->dbg, OMX_PRCOMM4,
   1375                                "Invalid command (%x).\n", Cmd);
   1376     }
   1377 
   1378     OMX_CONVERT_CMD(szCommandType, Cmd);
   1379     if (Cmd == OMX_CommandStateSet)
   1380     {
   1381         OMX_CONVERT_STATE(szParam, nParam1);
   1382         OMX_PRSTATE2(pComponentPrivate->dbg, "%s -> %s\n", szCommandType, szParam);
   1383     }
   1384 
   1385 OMX_CONF_CMD_BAIL:
   1386     return eError;
   1387 }
   1388 
   1389 /*----------------------------------------------------------------------------*/
   1390 /**
   1391   *  GetParameter() Sets application callbacks to the component
   1392   *
   1393   * This method will update application callbacks
   1394   * the application.
   1395   *
   1396   * @param pComp         handle for this instance of the component
   1397   * @param pCallBacks    application callbacks
   1398   * @param ptr
   1399   *
   1400   * @retval OMX_NoError              Success, ready to roll
   1401   *         OMX_Error_BadParameter   The input parameter pointer is null
   1402   **/
   1403 /*----------------------------------------------------------------------------*/
   1404 
   1405 static OMX_ERRORTYPE GetParameter (OMX_IN OMX_HANDLETYPE hComponent,
   1406                                    OMX_IN OMX_INDEXTYPE nParamIndex,
   1407                                    OMX_INOUT OMX_PTR ComponentParameterStructure)
   1408 {
   1409     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   1410     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   1411     OMX_U32* pTmp                               = NULL;
   1412     VIDEOENC_PORT_TYPE* pCompPortIn             = NULL;
   1413     VIDEOENC_PORT_TYPE* pCompPortOut            = NULL;
   1414 
   1415     OMX_CONF_CHECK_CMD(hComponent, ((OMX_COMPONENTTYPE *) hComponent)->pComponentPrivate, 1);
   1416 
   1417     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   1418     OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, ComponentParameterStructure, 1, 1);
   1419 
   1420     if (pComponentPrivate->eState == OMX_StateInvalid)
   1421     {
   1422         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   1423                                pComponentPrivate->dbg, OMX_PRSTATE3,
   1424                                "Component is in invalid state.\n");
   1425     }
   1426 
   1427     pCompPortIn     = pComponentPrivate->pCompPort[VIDENC_INPUT_PORT];
   1428     pCompPortOut    = pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT];
   1429 
   1430     switch (nParamIndex)
   1431     {
   1432         case OMX_IndexParamVideoInit:
   1433             pTmp = memcpy(ComponentParameterStructure,
   1434                           pComponentPrivate->pPortParamType,
   1435                           sizeof(OMX_PORT_PARAM_TYPE));
   1436             if (pTmp == NULL)
   1437             {
   1438             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1439                                    pComponentPrivate->dbg, OMX_TRACE4,
   1440                                    "Failed to copy parameter.\n");
   1441             }
   1442             break;
   1443 #ifdef __KHRONOS_CONF_1_1__
   1444 
   1445         case OMX_IndexParamImageInit:
   1446             pTmp = memcpy(ComponentParameterStructure,
   1447                           pComponentPrivate->pPortImageType,
   1448                           sizeof(OMX_PORT_PARAM_TYPE));
   1449             if (pTmp == NULL)
   1450             {
   1451             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1452                                    pComponentPrivate->dbg, OMX_TRACE4,
   1453                                    "Failed to copy parameter.\n");
   1454             }
   1455             break;
   1456 
   1457         case OMX_IndexParamAudioInit:
   1458             pTmp = memcpy(ComponentParameterStructure,
   1459                           pComponentPrivate->pPortAudioType,
   1460                           sizeof(OMX_PORT_PARAM_TYPE));
   1461             if (pTmp == NULL)
   1462             {
   1463             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1464                                    pComponentPrivate->dbg, OMX_TRACE4,
   1465                                    "Failed to copy parameter.\n");
   1466             }
   1467             break;
   1468 
   1469         case OMX_IndexParamOtherInit:
   1470             pTmp = memcpy(ComponentParameterStructure,
   1471                           pComponentPrivate->pPortOtherType,
   1472                           sizeof(OMX_PORT_PARAM_TYPE));
   1473             if (pTmp == NULL)
   1474             {
   1475             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1476                                    pComponentPrivate->dbg, OMX_TRACE4,
   1477                                    "Failed to copy parameter.\n");
   1478             }
   1479             break;
   1480 
   1481 #endif
   1482 
   1483         case OMX_IndexParamPortDefinition:
   1484         {
   1485             OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = (OMX_PARAM_PORTDEFINITIONTYPE*)(ComponentParameterStructure);
   1486             if (pPortDef->nPortIndex == pCompPortIn->pPortDef->nPortIndex)
   1487             {
   1488                 pTmp = memcpy(ComponentParameterStructure,
   1489                               pCompPortIn->pPortDef,
   1490                               sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
   1491                 if (pTmp == NULL)
   1492                 {
   1493                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1494                                            pComponentPrivate->dbg, OMX_TRACE4,
   1495                                            "Failed to copy parameter.\n");
   1496                 }
   1497             }
   1498             else if (pPortDef->nPortIndex == pCompPortOut->pPortDef->nPortIndex)
   1499             {
   1500                 pTmp = memcpy(ComponentParameterStructure,
   1501                               pCompPortOut->pPortDef,
   1502                               sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
   1503                 if (pTmp == NULL)
   1504                 {
   1505                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1506                                            pComponentPrivate->dbg, OMX_TRACE4,
   1507                                            "Failed to copy parameter.\n");
   1508                 }
   1509             }
   1510             else
   1511             {
   1512                 eError = OMX_ErrorBadPortIndex;
   1513             }
   1514             break;
   1515             }
   1516         case OMX_IndexParamVideoPortFormat:
   1517             if (((OMX_VIDEO_PARAM_PORTFORMATTYPE*)(ComponentParameterStructure))->nPortIndex ==
   1518                 pCompPortIn->pPortFormat->nPortIndex)
   1519         {
   1520                 if (((OMX_VIDEO_PARAM_PORTFORMATTYPE*)(ComponentParameterStructure))->nIndex < 3)
   1521                 {
   1522                     ((OMX_VIDEO_PARAM_PORTFORMATTYPE*)(ComponentParameterStructure))->eColorFormat =
   1523                     pComponentPrivate->colorFormats[((OMX_VIDEO_PARAM_PORTFORMATTYPE*)(ComponentParameterStructure))->nIndex];
   1524                     eError = OMX_ErrorNone;
   1525                 }
   1526                 else
   1527                 {
   1528                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorNoMore,
   1529                                            pComponentPrivate->dbg, OMX_TRACE4,
   1530                                            "No such index.\n");
   1531                 }
   1532             }
   1533             else if (((OMX_VIDEO_PARAM_PORTFORMATTYPE*)(ComponentParameterStructure))->nPortIndex ==
   1534                      pCompPortOut->pPortFormat->nPortIndex)
   1535             {
   1536                 if (((OMX_VIDEO_PARAM_PORTFORMATTYPE*)(ComponentParameterStructure))->nIndex < 3)
   1537                 {
   1538                     ((OMX_VIDEO_PARAM_PORTFORMATTYPE*)(ComponentParameterStructure))->eCompressionFormat =
   1539                     pComponentPrivate->compressionFormats[((OMX_VIDEO_PARAM_PORTFORMATTYPE*)(ComponentParameterStructure))->nIndex];
   1540                     eError = OMX_ErrorNone;
   1541                 }
   1542                 else
   1543                 {
   1544                     /*OMX_TRACE("OMX_IndexParamVideoPortFormat OMX_ErrorNoMore, no such index\n");*/
   1545                     OMX_CONF_SET_ERROR_BAIL(eError, OMX_ErrorNoMore);
   1546                 }
   1547             }
   1548             else
   1549         {
   1550                 eError = OMX_ErrorBadPortIndex;
   1551             }
   1552             break;
   1553         case OMX_IndexParamPriorityMgmt:
   1554             pTmp = memcpy(ComponentParameterStructure,
   1555                           pComponentPrivate->pPriorityMgmt,
   1556                           sizeof(OMX_PRIORITYMGMTTYPE));
   1557             if (pTmp == NULL)
   1558             {
   1559             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1560                                    pComponentPrivate->dbg, OMX_TRACE4,
   1561                                    "Failed to copy parameter.\n");
   1562             }
   1563             break;
   1564         case OMX_IndexParamVideoAvc:
   1565             if (((OMX_VIDEO_PARAM_AVCTYPE*)(ComponentParameterStructure))->nPortIndex ==
   1566                 pComponentPrivate->pH264->nPortIndex)
   1567             {
   1568                 pTmp = memcpy(ComponentParameterStructure,
   1569                               pComponentPrivate->pH264,
   1570                               sizeof(OMX_VIDEO_PARAM_AVCTYPE));
   1571                 if (pTmp == NULL)
   1572                 {
   1573                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1574                                        pComponentPrivate->dbg, OMX_TRACE4,
   1575                                        "Failed to copy parameter.\n");
   1576                 }
   1577             }
   1578             else
   1579             {
   1580                 eError = OMX_ErrorBadPortIndex;
   1581             }
   1582             break;
   1583         case OMX_IndexParamVideoMpeg4:
   1584             if (((OMX_VIDEO_PARAM_MPEG4TYPE*)(ComponentParameterStructure))->nPortIndex ==
   1585                 pComponentPrivate->pMpeg4->nPortIndex)
   1586             {
   1587                 pTmp = memcpy(ComponentParameterStructure,
   1588                               pComponentPrivate->pMpeg4,
   1589                               sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
   1590                 if (pTmp == NULL)
   1591                 {
   1592                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1593                                        pComponentPrivate->dbg, OMX_TRACE4,
   1594                                        "Failed to copy parameter.\n");
   1595                 }
   1596             }
   1597             else
   1598             {
   1599                 eError = OMX_ErrorBadPortIndex;
   1600             }
   1601             break;
   1602         case OMX_IndexParamCompBufferSupplier:
   1603         {
   1604             OMX_PARAM_BUFFERSUPPLIERTYPE* pBuffSupplierParam = (OMX_PARAM_BUFFERSUPPLIERTYPE*)ComponentParameterStructure;
   1605             if (pBuffSupplierParam->nPortIndex == VIDENC_INPUT_PORT)
   1606             {
   1607                 pBuffSupplierParam->eBufferSupplier = pCompPortIn->eSupplierSetting;
   1608             }
   1609             else if (pBuffSupplierParam->nPortIndex == VIDENC_OUTPUT_PORT)
   1610             {
   1611                 pBuffSupplierParam->eBufferSupplier = pCompPortOut->eSupplierSetting;
   1612             }
   1613             else
   1614             {
   1615                 eError = OMX_ErrorBadPortIndex;
   1616             }
   1617             break;
   1618         }
   1619 
   1620         case OMX_IndexParamVideoBitrate:
   1621             if (((OMX_VIDEO_PARAM_BITRATETYPE*)(ComponentParameterStructure))->nPortIndex ==
   1622             pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pBitRateType->nPortIndex)
   1623             {
   1624                 pTmp = memcpy(ComponentParameterStructure,
   1625                               pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pBitRateType,
   1626                               sizeof(OMX_VIDEO_PARAM_BITRATETYPE));
   1627                 if (pTmp == NULL)
   1628                 {
   1629                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1630                                        pComponentPrivate->dbg, OMX_TRACE4,
   1631                                        "Failed to copy parameter.\n");
   1632                 }
   1633             }
   1634             else
   1635             {
   1636                 eError = OMX_ErrorBadPortIndex;
   1637             }
   1638             break;
   1639 
   1640         case OMX_IndexParamVideoH263:
   1641             if (((OMX_VIDEO_PARAM_H263TYPE*)(ComponentParameterStructure))->nPortIndex ==
   1642                 pComponentPrivate->pH263->nPortIndex)
   1643             {
   1644                 pTmp = memcpy(ComponentParameterStructure,
   1645                               pComponentPrivate->pH263,
   1646                               sizeof(OMX_VIDEO_PARAM_H263TYPE));
   1647                 if (pTmp == NULL)
   1648                 {
   1649                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1650                                        pComponentPrivate->dbg, OMX_TRACE4,
   1651                                        "Failed to copy parameter.\n");
   1652                 }
   1653             }
   1654             else
   1655             {
   1656                 eError = OMX_ErrorBadPortIndex;
   1657             }
   1658             break;
   1659         case OMX_IndexParamVideoQuantization:
   1660             if (((OMX_VIDEO_PARAM_QUANTIZATIONTYPE*)(ComponentParameterStructure))->nPortIndex ==
   1661                 pComponentPrivate->pQuantization->nPortIndex)
   1662             {
   1663                 pTmp = memcpy(ComponentParameterStructure,
   1664                               pComponentPrivate->pQuantization,
   1665                               sizeof(OMX_VIDEO_PARAM_QUANTIZATIONTYPE));
   1666                 if (pTmp == NULL)
   1667                 {
   1668                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1669                                        pComponentPrivate->dbg, OMX_TRACE4,
   1670                                        "Failed to copy parameter.\n");
   1671                 }
   1672             }
   1673             else
   1674             {
   1675                 eError = OMX_ErrorBadPortIndex;
   1676             }
   1677             break;
   1678 
   1679 
   1680     case OMX_IndexParamVideoProfileLevelQuerySupported:
   1681     {
   1682        VIDEO_PROFILE_LEVEL_TYPE* pProfileLevel = NULL;
   1683         OMX_U32 nNumberOfProfiles = 0;
   1684        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pParamProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)ComponentParameterStructure;
   1685        pParamProfileLevel->nPortIndex = pCompPortOut->pPortDef->nPortIndex;
   1686          /* Choose table based on compression format */
   1687        switch(pCompPortOut->pPortDef->format.video.eCompressionFormat)
   1688        {
   1689           case OMX_VIDEO_CodingH263:
   1690              pProfileLevel = SupportedH263ProfileLevels;
   1691              nNumberOfProfiles = sizeof(SupportedH263ProfileLevels) / sizeof (VIDEO_PROFILE_LEVEL_TYPE);
   1692              break;
   1693           case OMX_VIDEO_CodingMPEG4:
   1694              pProfileLevel = SupportedMPEG4ProfileLevels;
   1695              nNumberOfProfiles = sizeof(SupportedMPEG4ProfileLevels) / sizeof (VIDEO_PROFILE_LEVEL_TYPE);
   1696              break;
   1697            case OMX_VIDEO_CodingAVC:
   1698              pProfileLevel = SupportedAVCProfileLevels;
   1699              nNumberOfProfiles = sizeof(SupportedAVCProfileLevels) / sizeof (VIDEO_PROFILE_LEVEL_TYPE);
   1700              break;
   1701            default:
   1702               eError = OMX_ErrorBadParameter;
   1703               return eError;
   1704         }
   1705         if(pParamProfileLevel->nProfileIndex >= nNumberOfProfiles) {
   1706             return OMX_ErrorBadParameter;
   1707         }
   1708         /* Point to table entry based on index */
   1709         pProfileLevel += pParamProfileLevel->nProfileIndex;
   1710 
   1711         /* -1 indicates end of table */
   1712         if(pProfileLevel->nProfile != -1) {
   1713            pParamProfileLevel->eProfile = pProfileLevel->nProfile;
   1714            pParamProfileLevel->eLevel = pProfileLevel->nLevel;
   1715            eError = OMX_ErrorNone;
   1716         }
   1717         else {
   1718            eError = OMX_ErrorNoMore;
   1719         }
   1720     }
   1721     break;
   1722     case OMX_IndexParamVideoProfileLevelCurrent:
   1723     {
   1724        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pParamProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)  ComponentParameterStructure;
   1725        if (pCompPortOut->pPortDef->format.video.eCompressionFormat == OMX_VIDEO_CodingAVC) {
   1726           pParamProfileLevel->eProfile = pComponentPrivate->pH264->eProfile;
   1727            pParamProfileLevel->eLevel = pComponentPrivate->pH264->eLevel;
   1728        }
   1729        else if (pCompPortOut->pPortDef->format.video.eCompressionFormat == OMX_VIDEO_CodingMPEG4) {
   1730           pParamProfileLevel->eProfile = pComponentPrivate->pMpeg4->eProfile;
   1731           pParamProfileLevel->eLevel = pComponentPrivate->pMpeg4->eLevel;
   1732 
   1733        }
   1734        else if (pCompPortOut->pPortDef->format.video.eCompressionFormat == OMX_VIDEO_CodingH263) {
   1735           pParamProfileLevel->eProfile = pComponentPrivate->pH263->eProfile;
   1736           pParamProfileLevel->eLevel = pComponentPrivate->pH263->eLevel;
   1737        }
   1738        else {
   1739           eError = OMX_ErrorBadParameter;
   1740        }
   1741 
   1742     }
   1743     break;
   1744 
   1745         case OMX_IndexParamVideoErrorCorrection:
   1746                     {
   1747                     if (((OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)(ComponentParameterStructure))->nPortIndex ==
   1748                         VIDENC_OUTPUT_PORT)
   1749                     {
   1750                         pTmp = memcpy(ComponentParameterStructure,
   1751                                       pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pErrorCorrectionType,
   1752                                       sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
   1753                 if (pTmp == NULL)
   1754                 {
   1755                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1756                                            pComponentPrivate->dbg, OMX_TRACE4,
   1757                                            "Failed to copy OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE parameter.\n");
   1758                 }
   1759             }
   1760                     else
   1761                     {
   1762                         eError = OMX_ErrorBadPortIndex;
   1763                     }
   1764                     break;
   1765                 }
   1766 
   1767         case VideoEncodeCustomParamIndexVBVSize:
   1768             (*((OMX_U32*)ComponentParameterStructure)) = (OMX_U32)pComponentPrivate->nVBVSize;
   1769             break;
   1770         case VideoEncodeCustomParamIndexDeblockFilter:
   1771             (*((OMX_BOOL*)ComponentParameterStructure)) = (OMX_BOOL)pComponentPrivate->bDeblockFilter;
   1772             break;
   1773         case VideoEncodeCustomParamIndexEncodingPreset:
   1774             (*((unsigned int*)ComponentParameterStructure)) = (unsigned int)pComponentPrivate->nEncodingPreset;
   1775             break;
   1776         case VideoEncodeCustomConfigIndexUnrestrictedMV:
   1777             (*((OMX_U8*)ComponentParameterStructure)) = (OMX_U8)pComponentPrivate->ucUnrestrictedMV;
   1778             break;
   1779        case VideoEncodeCustomParamIndexNALFormat:
   1780            (*((unsigned int*)ComponentParameterStructure)) = (unsigned int)pComponentPrivate->AVCNALFormat;
   1781            break;
   1782        case PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX:
   1783             pTmp = memcpy(ComponentParameterStructure,
   1784             pComponentPrivate->pCapabilityFlags,
   1785             sizeof(PV_OMXComponentCapabilityFlagsType));
   1786             if (pTmp == NULL)
   1787             {
   1788                 OMX_CONF_SET_ERROR_BAIL(eError, OMX_ErrorUndefined);
   1789             }
   1790             break;
   1791        //not supported yet
   1792        case OMX_IndexConfigCommonRotate:
   1793            break;
   1794         default:
   1795             eError = OMX_ErrorUnsupportedIndex;
   1796             break;
   1797     }
   1798 OMX_CONF_CMD_BAIL:
   1799     return eError;
   1800 }
   1801 
   1802 /*----------------------------------------------------------------------------*/
   1803 /**
   1804   *  SetParameter() Sets application callbacks to the component
   1805   *
   1806   * This method will update application callbacks
   1807   * the application.
   1808   *
   1809   * @param pComp         handle for this instance of the component
   1810   * @param pCallBacks    application callbacks
   1811   * @param ptr
   1812   *
   1813   * @retval OMX_NoError              Success, ready to roll
   1814   *         OMX_Error_BadParameter   The input parameter pointer is null
   1815   **/
   1816 /*----------------------------------------------------------------------------*/
   1817 
   1818 static OMX_ERRORTYPE SetParameter (OMX_IN OMX_HANDLETYPE hComponent,
   1819                                    OMX_IN OMX_INDEXTYPE nParamIndex,
   1820                                    OMX_IN OMX_PTR pCompParam)
   1821 {
   1822     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   1823     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   1824     OMX_U32* pTmp                               = NULL;
   1825     VIDENC_NODE* pMemoryListHead                = NULL;
   1826     VIDEOENC_PORT_TYPE* pCompPortIn             = NULL;
   1827     VIDEOENC_PORT_TYPE* pCompPortOut            = NULL;
   1828 
   1829 #ifdef __KHRONOS_CONF_1_1__
   1830     OMX_PARAM_COMPONENTROLETYPE  *pRole = NULL;
   1831     OMX_VIDEO_PARAM_PROFILELEVELTYPE* sProfileLevel;
   1832 #endif
   1833     OMX_CONF_CHECK_CMD(hComponent, ((OMX_COMPONENTTYPE *) hComponent)->pComponentPrivate, 1);
   1834 
   1835     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   1836     OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, pCompParam, 1, 1);
   1837 
   1838     pMemoryListHead = pComponentPrivate->pMemoryListHead;
   1839     pCompPortIn     = pComponentPrivate->pCompPort[VIDENC_INPUT_PORT];
   1840     pCompPortOut    = pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT];
   1841 
   1842     if ((pComponentPrivate->eState != OMX_StateLoaded) &&
   1843         (pComponentPrivate->eState != OMX_StateWaitForResources) &&
   1844         (nParamIndex != OMX_IndexParamPortDefinition ||
   1845             (pCompPortIn->pPortDef->bEnabled && pCompPortOut->pPortDef->bEnabled)))
   1846     {
   1847         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   1848                                pComponentPrivate->dbg, OMX_PRSTATE3,
   1849                                "Call in an invalid state.\n");
   1850     }
   1851 
   1852     switch (nParamIndex)
   1853     {
   1854         case OMX_IndexParamVideoPortFormat:
   1855         {
   1856             OMX_VIDEO_PARAM_PORTFORMATTYPE* pComponentParam = (OMX_VIDEO_PARAM_PORTFORMATTYPE*)pCompParam;
   1857             if (pComponentParam->nPortIndex == pCompPortIn->pPortFormat->nPortIndex)
   1858             {
   1859                 pTmp = memcpy(pCompPortIn->pPortFormat,
   1860                               pComponentParam,
   1861                               sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
   1862                 if (pTmp == NULL)
   1863                 {
   1864                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1865                                            pComponentPrivate->dbg, OMX_TRACE4,
   1866                                            "Failed to copy parameter.\n");
   1867                 }
   1868             }
   1869             else if (pComponentParam->nPortIndex == pCompPortOut->pPortFormat->nPortIndex)
   1870             {
   1871                 pTmp = memcpy(pCompPortOut->pPortFormat,
   1872                               pComponentParam,
   1873                               sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
   1874                 if (pTmp == NULL)
   1875                 {
   1876                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1877                                            pComponentPrivate->dbg, OMX_TRACE4,
   1878                                            "Failed to copy parameter.\n");
   1879                 }
   1880             }
   1881             else
   1882             {
   1883                 eError = OMX_ErrorBadPortIndex;
   1884             }
   1885             break;
   1886         }
   1887         case OMX_IndexParamVideoInit:
   1888             pTmp = memcpy(pComponentPrivate->pPortParamType,
   1889                           (OMX_PORT_PARAM_TYPE*)pCompParam,
   1890                           sizeof(OMX_PORT_PARAM_TYPE));
   1891             if (pTmp == NULL)
   1892             {
   1893             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1894                                    pComponentPrivate->dbg, OMX_TRACE4,
   1895                                    "Failed to copy parameter.\n");
   1896             }
   1897             break;
   1898         case OMX_IndexParamPortDefinition:
   1899         {
   1900             OMX_PARAM_PORTDEFINITIONTYPE* pComponentParam = (OMX_PARAM_PORTDEFINITIONTYPE*)pCompParam;
   1901             eError = IsResolutionPlayable(pCompPortIn->pPortDef->format.video.nFrameWidth, pCompPortIn->pPortDef->format.video.nFrameHeight);
   1902             if (eError != OMX_ErrorNone)
   1903             {
   1904                 /* OMX components co-existance, if resolution is 720p or higher let the 720p OMX
   1905                  * component to take care of them */
   1906                 return OMX_ErrorBadParameter;
   1907             }
   1908             if (pComponentParam->nPortIndex == pCompPortIn->pPortDef->nPortIndex)
   1909             {
   1910                 pTmp = memcpy(pCompPortIn->pPortDef,
   1911                               pComponentParam,
   1912                               sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
   1913                 if (pTmp == NULL)
   1914                 {
   1915                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1916                                            pComponentPrivate->dbg, OMX_TRACE4,
   1917                                            "Failed to copy parameter.\n");
   1918                 }
   1919                 CalculateBufferSize(pCompPortIn->pPortDef, pComponentPrivate);
   1920             }
   1921             else if (pComponentParam->nPortIndex == pCompPortOut->pPortDef->nPortIndex)
   1922             {
   1923                 pTmp = memcpy(pCompPortOut->pPortDef,
   1924                               pComponentParam,
   1925                               sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
   1926                 if (pTmp == NULL)
   1927                 {
   1928                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1929                                            pComponentPrivate->dbg, OMX_TRACE4,
   1930                                            "Failed to copy parameter.\n");
   1931                 }
   1932                 CalculateBufferSize(pCompPortOut->pPortDef, pComponentPrivate);
   1933                 if(!pCompPortOut->pPortDef->format.video.nBitrate)
   1934                 {
   1935                     pCompPortOut->pPortDef->format.video.nBitrate = OMX_VIDENC_GetDefaultBitRate(pComponentPrivate);
   1936                 }
   1937                 pCompPortOut->pBitRateTypeConfig->nEncodeBitrate =
   1938                 pCompPortOut->pBitRateType->nTargetBitrate =
   1939                 pCompPortOut->pPortDef->format.video.nBitrate;
   1940             }
   1941             else
   1942             {
   1943                 eError = OMX_ErrorBadPortIndex;
   1944             }
   1945             break;
   1946         }
   1947         case OMX_IndexParamVideoAvc:
   1948         {
   1949             OMX_VIDEO_PARAM_AVCTYPE* pComponentParam = (OMX_VIDEO_PARAM_AVCTYPE*)pCompParam;
   1950             if (pComponentParam->nPortIndex == pComponentPrivate->pH264->nPortIndex)
   1951             {
   1952                 pTmp = memcpy(pComponentPrivate->pH264,
   1953                               pCompParam,
   1954                               sizeof(OMX_VIDEO_PARAM_AVCTYPE));
   1955                 if (pTmp == NULL)
   1956                 {
   1957                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1958                                            pComponentPrivate->dbg, OMX_TRACE4,
   1959                                            "Failed to copy parameter.\n");
   1960                 }
   1961                 CalculateBufferSize(pCompPortOut->pPortDef, pComponentPrivate);
   1962             }
   1963             else
   1964             {
   1965                 eError = OMX_ErrorBadPortIndex;
   1966             }
   1967             break;
   1968         }
   1969         case OMX_IndexParamVideoMpeg4:
   1970         {
   1971             OMX_VIDEO_PARAM_MPEG4TYPE* pComponentParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)pCompParam;
   1972             if (pComponentParam->nPortIndex == pComponentPrivate->pMpeg4->nPortIndex)
   1973             {
   1974                 pTmp = memcpy(pComponentPrivate->pMpeg4,
   1975                               pCompParam,
   1976                               sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
   1977                 if (pTmp == NULL)
   1978                 {
   1979                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1980                                            pComponentPrivate->dbg, OMX_TRACE4,
   1981                                            "Failed to copy parameter.\n");
   1982                 }
   1983             }
   1984             else
   1985             {
   1986                 eError = OMX_ErrorBadPortIndex;
   1987             }
   1988             break;
   1989         }
   1990         case OMX_IndexParamPriorityMgmt:
   1991             pTmp = memcpy(pComponentPrivate->pPriorityMgmt,
   1992                           (OMX_PRIORITYMGMTTYPE*)pCompParam,
   1993                           sizeof(OMX_PRIORITYMGMTTYPE));
   1994             if (pTmp == NULL)
   1995             {
   1996             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   1997                                    pComponentPrivate->dbg, OMX_TRACE4,
   1998                                    "Failed to copy parameter.\n");
   1999             }
   2000             break;
   2001         case OMX_IndexParamCompBufferSupplier:
   2002         {
   2003             OMX_PARAM_BUFFERSUPPLIERTYPE* pBuffSupplierParam = (OMX_PARAM_BUFFERSUPPLIERTYPE*)pCompParam;
   2004             if (pBuffSupplierParam->nPortIndex == VIDENC_INPUT_PORT)
   2005             {
   2006                 pCompPortIn->eSupplierSetting = pBuffSupplierParam->eBufferSupplier;
   2007             }
   2008             else if (pBuffSupplierParam->nPortIndex == VIDENC_OUTPUT_PORT)
   2009             {
   2010                 pCompPortOut->eSupplierSetting = pBuffSupplierParam->eBufferSupplier;
   2011             }
   2012             else
   2013             {
   2014                 eError = OMX_ErrorBadPortIndex;
   2015             }
   2016             break;
   2017         }
   2018         case OMX_IndexParamVideoBitrate:
   2019         {
   2020             OMX_VIDEO_PARAM_BITRATETYPE* pComponentParam = (OMX_VIDEO_PARAM_BITRATETYPE*)pCompParam;
   2021             if (pComponentParam->nPortIndex == pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pBitRateType->nPortIndex)
   2022             {
   2023                 pTmp = memcpy(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pBitRateType,
   2024                               pCompParam,
   2025                               sizeof(OMX_VIDEO_PARAM_BITRATETYPE));
   2026                 if (pTmp == NULL)
   2027                 {
   2028                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   2029                                            pComponentPrivate->dbg, OMX_TRACE4,
   2030                                            "Failed to copy parameter.\n");
   2031                 }
   2032                 if(!pCompPortOut->pBitRateType->nTargetBitrate)
   2033                 {
   2034                     pCompPortOut->pBitRateType->nTargetBitrate = OMX_VIDENC_GetDefaultBitRate(pComponentPrivate);
   2035                 }
   2036                 pCompPortOut->pPortDef->format.video.nBitrate =
   2037                 pCompPortOut->pBitRateTypeConfig->nEncodeBitrate =
   2038                 pCompPortOut->pBitRateType->nTargetBitrate;
   2039             }
   2040             else
   2041             {
   2042                 eError = OMX_ErrorBadPortIndex;
   2043             }
   2044             break;
   2045         }
   2046         case OMX_IndexParamVideoErrorCorrection:
   2047                 {
   2048                        pTmp = memcpy(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pErrorCorrectionType,
   2049                                      pCompParam,
   2050                                      sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
   2051                        if (pTmp == NULL)
   2052                         {
   2053                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   2054                                        pComponentPrivate->dbg, OMX_TRACE4,
   2055                                        "Failed to copy parameter.\n");
   2056                         }
   2057                 }
   2058                 break;
   2059         case OMX_IndexParamVideoH263:
   2060         {
   2061             OMX_VIDEO_PARAM_H263TYPE* pComponentParam = (OMX_VIDEO_PARAM_H263TYPE*)pCompParam;
   2062             if (pComponentParam->nPortIndex == pComponentPrivate->pH263->nPortIndex)
   2063             {
   2064                 pTmp = memcpy(pComponentPrivate->pH263,
   2065                               pCompParam,
   2066                               sizeof(OMX_VIDEO_PARAM_H263TYPE));
   2067                 if (pTmp == NULL)
   2068                 {
   2069                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   2070                                            pComponentPrivate->dbg, OMX_TRACE4,
   2071                                            "Failed to copy parameter.\n");
   2072                 }
   2073             }
   2074             else
   2075             {
   2076                 eError = OMX_ErrorBadPortIndex;
   2077             }
   2078             break;
   2079         }
   2080         case OMX_IndexParamVideoQuantization:
   2081         {
   2082             OMX_VIDEO_PARAM_QUANTIZATIONTYPE* pComponentParam = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE*)pCompParam;
   2083             if (pComponentParam->nPortIndex == pComponentPrivate->pQuantization->nPortIndex)
   2084             {
   2085                 pTmp = memcpy(pComponentPrivate->pQuantization,
   2086                               pCompParam,
   2087                               sizeof(OMX_VIDEO_PARAM_QUANTIZATIONTYPE));
   2088                 if (pTmp == NULL)
   2089                 {
   2090                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   2091                                            pComponentPrivate->dbg, OMX_TRACE4,
   2092                                            "Failed to copy parameter.\n");
   2093                 }
   2094             }
   2095             else
   2096             {
   2097                 eError = OMX_ErrorBadPortIndex;
   2098             }
   2099             break;
   2100         }
   2101         case VideoEncodeCustomParamIndexVBVSize:
   2102             pComponentPrivate->nVBVSize = (OMX_U32)(*((OMX_U32*)pCompParam));
   2103             break;
   2104         case VideoEncodeCustomParamIndexDeblockFilter:
   2105             pComponentPrivate->bDeblockFilter = (OMX_BOOL)(*((OMX_BOOL*)pCompParam));
   2106             break;
   2107 
   2108 #ifdef __KHRONOS_CONF_1_1__
   2109     case OMX_IndexParamStandardComponentRole:
   2110         if (pCompParam)
   2111         {
   2112             pRole = (OMX_PARAM_COMPONENTROLETYPE *)pCompParam;
   2113             memcpy(&(pComponentPrivate->componentRole), (void *)pRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
   2114             if (strcmp((char *)pRole->cRole,"video_encoder.mpeg4")==0)
   2115             {
   2116                 pCompPortOut->pPortDef->format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
   2117                 pCompPortOut->pPortFormat->eCompressionFormat = OMX_VIDEO_CodingMPEG4;
   2118                 pCompPortOut->pPortDef->format.video.nBitrate = VIDENC_STRUCT_MPEG4DEFBITRATE[0][1];
   2119             }
   2120             else if (strcmp((char *)pRole->cRole,"video_encoder.h263")==0)
   2121             {
   2122                 pCompPortOut->pPortDef->format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
   2123                 pCompPortOut->pPortFormat->eCompressionFormat = OMX_VIDEO_CodingH263;
   2124                 pCompPortOut->pPortDef->format.video.nBitrate = VIDENC_STRUCT_H263DEFBITRATE[0][1];
   2125             }
   2126             else if (strcmp((char *)pRole->cRole,"video_encoder.avc")==0)
   2127             {
   2128                 pCompPortOut->pPortDef->format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
   2129                 pCompPortOut->pPortFormat->eCompressionFormat= OMX_VIDEO_CodingAVC;
   2130                 pCompPortOut->pPortDef->format.video.nBitrate = VIDENC_STRUCT_H264DEFBITRATE[0][1];
   2131             }
   2132 
   2133             pCompPortOut->pPortFormat->eColorFormat = OMX_COLOR_FormatUnused;
   2134             pCompPortOut->pPortDef->eDomain = OMX_PortDomainVideo;
   2135             pCompPortOut->pPortDef->format.video.eColorFormat = OMX_COLOR_FormatUnused;
   2136             pCompPortOut->pPortDef->format.video.nFrameWidth = 176;
   2137             pCompPortOut->pPortDef->format.video.nFrameHeight = 144;
   2138             pCompPortOut->pPortDef->format.video.xFramerate = fToQ16(15.0);
   2139         }
   2140         else
   2141         {
   2142             eError = OMX_ErrorBadParameter;
   2143         }
   2144         break;
   2145 
   2146     case OMX_IndexParamVideoProfileLevelCurrent:
   2147         {
   2148            VIDEO_PROFILE_LEVEL_TYPE* pProfileLevel = NULL;
   2149            OMX_VIDEO_PARAM_PROFILELEVELTYPE *pParamProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pCompParam;
   2150 
   2151            /* Choose table based on compression format */
   2152            switch(pCompPortOut->pPortDef->format.video.eCompressionFormat)
   2153 
   2154             {
   2155               case OMX_VIDEO_CodingH263:
   2156                  pProfileLevel = &SupportedH263ProfileLevels;
   2157                  break;
   2158               case OMX_VIDEO_CodingMPEG4:
   2159                  pProfileLevel = &SupportedMPEG4ProfileLevels;
   2160                  break;
   2161               case OMX_VIDEO_CodingAVC:
   2162                  pProfileLevel = &SupportedAVCProfileLevels;
   2163                  break;
   2164               default:
   2165                  eError = OMX_ErrorBadParameter;
   2166                  return eError;
   2167             }
   2168             /* Check validity of profile & level parameters */
   2169             while((pProfileLevel->nProfile != (OMX_S32)pParamProfileLevel->eProfile) ||
   2170                (pProfileLevel->nLevel != (OMX_S32)pParamProfileLevel->eLevel)) {
   2171                pProfileLevel++;
   2172                if(pProfileLevel->nProfile == -1) break;
   2173             }
   2174             if(pProfileLevel->nProfile != -1) {
   2175             /* Update profile & level values in the compression format specific structure */
   2176                switch(pCompPortOut->pPortDef->format.video.eCompressionFormat) {
   2177                   case OMX_VIDEO_CodingH263:
   2178                      pComponentPrivate->pH263->eProfile = pParamProfileLevel->eProfile;
   2179                      pComponentPrivate->pH263->eLevel = pParamProfileLevel->eLevel;
   2180                      break;
   2181                   case OMX_VIDEO_CodingMPEG4:
   2182                      pComponentPrivate->pMpeg4->eProfile = pParamProfileLevel->eProfile;
   2183                      pComponentPrivate->pMpeg4->eLevel = pParamProfileLevel->eLevel;
   2184                      break;
   2185                   case OMX_VIDEO_CodingAVC:
   2186                      pComponentPrivate->pH264->eProfile = pParamProfileLevel->eProfile;
   2187                      pComponentPrivate->pH264->eLevel = pParamProfileLevel->eLevel;
   2188                   default:
   2189                      eError = OMX_ErrorBadParameter;
   2190                      return eError;
   2191                 }
   2192                 eError = OMX_ErrorNone;
   2193             }
   2194             else {
   2195                eError = OMX_ErrorBadParameter;
   2196             }
   2197         }
   2198         break;
   2199 #endif
   2200         /*valid for H264 only*/
   2201         case VideoEncodeCustomParamIndexEncodingPreset:
   2202                 pComponentPrivate->nEncodingPreset = (unsigned int)(*((unsigned int*)pCompParam));
   2203             break;
   2204         case VideoEncodeCustomConfigIndexUnrestrictedMV:
   2205             pComponentPrivate->ucUnrestrictedMV = (OMX_U8)(*((OMX_U8*)pCompParam));
   2206             break;
   2207        case VideoEncodeCustomParamIndexNALFormat:
   2208               pComponentPrivate->AVCNALFormat = (VIDENC_AVC_NAL_FORMAT)(*((unsigned int*)pCompParam));
   2209        break;
   2210        //not supported yet
   2211        case OMX_IndexConfigCommonRotate:
   2212        break;
   2213 
   2214         default:
   2215             eError = OMX_ErrorUnsupportedIndex;
   2216             break;
   2217     }
   2218 OMX_CONF_CMD_BAIL:
   2219     return eError;
   2220 }
   2221 
   2222 /*----------------------------------------------------------------------------*/
   2223 /**
   2224   *  GetConfig() Sets application callbacks to the component
   2225   *
   2226   * This method will update application callbacks
   2227   * the application.
   2228   *
   2229   * @param pComp         handle for this instance of the component
   2230   * @param pCallBacks    application callbacks
   2231   * @param ptr
   2232   *
   2233   * @retval OMX_NoError              Success, ready to roll
   2234   *         OMX_Error_BadParameter   The input parameter pointer is null
   2235   **/
   2236 /*----------------------------------------------------------------------------*/
   2237 
   2238 static OMX_ERRORTYPE GetConfig (OMX_HANDLETYPE hComponent,
   2239                                 OMX_INDEXTYPE nConfigIndex,
   2240                                 OMX_PTR ComponentConfigStructure)
   2241 {
   2242     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   2243     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   2244     VIDENC_NODE* pMemoryListHead                = NULL;
   2245     OMX_U32* pTmp                               = NULL;
   2246 
   2247     OMX_CONF_CHECK_CMD(hComponent, ((OMX_COMPONENTTYPE *) hComponent)->pComponentPrivate, 1);
   2248 
   2249     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   2250     OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, ComponentConfigStructure, 1, 1);
   2251 
   2252     if (pComponentPrivate->eState == OMX_StateInvalid)
   2253     {
   2254         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   2255                                pComponentPrivate->dbg, OMX_PRSTATE3,
   2256                                "Component is in invalid state.\n");
   2257     }
   2258 
   2259     pMemoryListHead = pComponentPrivate->pMemoryListHead;
   2260 
   2261     switch (nConfigIndex)
   2262     {
   2263         case VideoEncodeCustomConfigIndexForceIFrame:
   2264             (*((OMX_BOOL*)ComponentConfigStructure)) = (OMX_BOOL)pComponentPrivate->bForceIFrame;
   2265             break;
   2266         case VideoEncodeCustomConfigIndexIntraFrameInterval:
   2267             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->nIntraFrameInterval;
   2268             break;
   2269         case VideoEncodeCustomConfigIndexTargetFrameRate:
   2270             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->nTargetFrameRate;
   2271             break;
   2272         case VideoEncodeCustomConfigIndexQPI:
   2273             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->nQPI;
   2274             break;
   2275         case VideoEncodeCustomConfigIndexAIRRate:
   2276             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->nAIRRate;
   2277             break;
   2278         /*ASO/FMO*/
   2279         case VideoEncodeCustomConfigIndexNumSliceASO:
   2280             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->numSliceASO;
   2281             break;
   2282         case VideoEncodeCustomConfigIndexAsoSliceOrder:
   2283             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->asoSliceOrder;
   2284             break;
   2285         case VideoEncodeCustomConfigIndexNumSliceGroups:
   2286             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->numSliceGroups;
   2287             break;
   2288         case VideoEncodeCustomConfigIndexSliceGroupMapType:
   2289             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->sliceGroupMapType;
   2290             break;
   2291         case VideoEncodeCustomConfigIndexSliceGroupChangeDirectionFlag:
   2292             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->sliceGroupChangeDirectionFlag;
   2293             break;
   2294         case VideoEncodeCustomConfigIndexSliceGroupChangeRate:
   2295             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->sliceGroupChangeRate;
   2296             break;
   2297         case VideoEncodeCustomConfigIndexSliceGroupChangeCycle:
   2298             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->sliceGroupChangeCycle;
   2299             break;
   2300         case VideoEncodeCustomConfigIndexSliceGroupParams:
   2301             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->sliceGroupParams;
   2302             break;
   2303 
   2304 #ifdef __KHRONOS_CONF_1_1__
   2305     case OMX_IndexConfigVideoFramerate:
   2306             {
   2307 
   2308             pTmp = memcpy(ComponentConfigStructure,
   2309                           pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pFrameRateConfig,
   2310                           sizeof(OMX_CONFIG_FRAMERATETYPE));
   2311             if (pTmp == NULL)
   2312             {
   2313                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   2314                                        pComponentPrivate->dbg, OMX_TRACE4,
   2315                                        "Failed to copy config.\n");
   2316             }
   2317         }
   2318     break;
   2319     case OMX_IndexConfigVideoBitrate:
   2320             {
   2321             pTmp = memcpy(ComponentConfigStructure,
   2322                           pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pBitRateTypeConfig,
   2323                           sizeof(OMX_VIDEO_CONFIG_BITRATETYPE));
   2324             if (pTmp == NULL)
   2325             {
   2326                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   2327                                        pComponentPrivate->dbg, OMX_TRACE4,
   2328                                        "Failed to copy config.\n");
   2329             }
   2330         }
   2331     break;
   2332 #endif
   2333     case OMX_IndexParamVideoMotionVector:
   2334         {
   2335             /* also get parameters in this structure that are tracked outside of it */
   2336             pComponentPrivate->pMotionVector->bFourMV = pComponentPrivate->maxMVperMB >= 4;
   2337             pComponentPrivate->pMotionVector->eAccuracy = OMX_Video_MotionVectorQuarterPel;
   2338 
   2339             pTmp = memcpy(ComponentConfigStructure,
   2340                           pComponentPrivate->pMotionVector,
   2341                           sizeof(OMX_VIDEO_PARAM_MOTIONVECTORTYPE));
   2342             if (pTmp == NULL)
   2343             {
   2344                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   2345                                        pComponentPrivate->dbg, OMX_TRACE4,
   2346                                        "Failed to copy config.\n");
   2347             }
   2348         }
   2349     case OMX_IndexConfigVideoAVCIntraPeriod:
   2350         {
   2351             /* also get parameters in this structure that are tracked outside of it */
   2352             pComponentPrivate->pH264IntraPeriod->nPFrames = pComponentPrivate->nIntraFrameInterval;
   2353             pComponentPrivate->pH264IntraPeriod->nIDRPeriod = 0;
   2354 
   2355             pTmp = memcpy(ComponentConfigStructure,
   2356                           pComponentPrivate->pH264IntraPeriod,
   2357                           sizeof(OMX_VIDEO_CONFIG_AVCINTRAPERIOD));
   2358             if (pTmp == NULL)
   2359             {
   2360                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   2361                                        pComponentPrivate->dbg, OMX_TRACE4,
   2362                                        "Failed to copy structure OMX_VIDEO_CONFIG_AVCINTRAPERIOD.\n");
   2363             }
   2364         }
   2365     case OMX_IndexParamVideoIntraRefresh:
   2366              {
   2367                  pTmp = memcpy(ComponentConfigStructure,
   2368                                pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pIntraRefreshType,
   2369                                sizeof(OMX_VIDEO_PARAM_INTRAREFRESHTYPE));
   2370                  if (pTmp == NULL)
   2371             {
   2372                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   2373                                        pComponentPrivate->dbg, OMX_TRACE4,
   2374                                        "Failed to copy structure OMX_VIDEO_PARAM_INTRAREFRESHTYPE.\n");
   2375             }
   2376         }
   2377     break;
   2378     case OMX_IndexParamVideoErrorCorrection:
   2379             {
   2380             if (((OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)(ComponentConfigStructure))->nPortIndex ==
   2381                 VIDENC_OUTPUT_PORT)
   2382             {
   2383                 pTmp = memcpy(ComponentConfigStructure,
   2384                               pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pErrorCorrectionType,
   2385                               sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
   2386                 if (pTmp == NULL)
   2387                 {
   2388                     OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorUndefined,
   2389                                            pComponentPrivate->dbg, OMX_TRACE4,
   2390                                            "Failed to copy structure OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE.\n");
   2391                 }
   2392             }
   2393             else
   2394             {
   2395                 eError = OMX_ErrorBadPortIndex;
   2396             }
   2397             break;
   2398         }
   2399     case VideoEncodeCustomConfigIndexDebug:
   2400         OMX_DBG_GETCONFIG(pComponentPrivate->dbg, ComponentConfigStructure);
   2401         break;
   2402     case VideoEncodeCustomConfigIndexMIRRate:
   2403             (*((OMX_U32*)ComponentConfigStructure)) = (OMX_U32)pComponentPrivate->nMIRRate;
   2404             break;
   2405     case VideoEncodeCustomConfigIndexMVDataEnable:
   2406             (*((OMX_BOOL*)ComponentConfigStructure)) = (OMX_BOOL)pComponentPrivate->bMVDataEnable;
   2407              break;
   2408     case VideoEncodeCustomConfigIndexResyncDataEnable:
   2409             (*((OMX_BOOL*)ComponentConfigStructure)) = (OMX_BOOL)pComponentPrivate->bResyncDataEnable;
   2410              break;
   2411     case VideoEncodeCustomConfigIndexMaxMVperMB:
   2412             (*((OMX_U32*)ComponentConfigStructure))  =  (OMX_U32)pComponentPrivate->maxMVperMB;
   2413             break;
   2414     case VideoEncodeCustomConfigIndexIntra4x4EnableIdc:
   2415             (*((IH264VENC_Intra4x4Params*)ComponentConfigStructure)) = (IH264VENC_Intra4x4Params)pComponentPrivate->intra4x4EnableIdc;
   2416          break;
   2417         default:
   2418             eError = OMX_ErrorUnsupportedIndex;
   2419             break;
   2420     }
   2421 
   2422 OMX_CONF_CMD_BAIL:
   2423     return eError;
   2424 }
   2425 
   2426 /*----------------------------------------------------------------------------*/
   2427 /**
   2428   *  SetConfig() Sets application callbacks to the component
   2429   *
   2430   * This method will update application callbacks
   2431   * the application.
   2432   *
   2433   * @param pComp         handle for this instance of the component
   2434   * @param pCallBacks    application callbacks
   2435   * @param ptr
   2436   *
   2437   * @retval OMX_NoError              Success, ready to roll
   2438   *         OMX_Error_BadParameter   The input parameter pointer is null
   2439   **/
   2440 /*----------------------------------------------------------------------------*/
   2441 
   2442 static OMX_ERRORTYPE SetConfig (OMX_HANDLETYPE hComponent,
   2443                                 OMX_INDEXTYPE nConfigIndex,
   2444                                 OMX_PTR ComponentConfigStructure)
   2445 {
   2446     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   2447     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   2448     VIDENC_NODE* pMemoryListHead                = NULL;
   2449     OMX_U32 i;
   2450 
   2451     OMX_CONF_CHECK_CMD(hComponent, ((OMX_COMPONENTTYPE *) hComponent)->pComponentPrivate, 1);
   2452 
   2453     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   2454     OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, ComponentConfigStructure, 1, 1);
   2455 
   2456     if (pComponentPrivate->eState == OMX_StateInvalid)
   2457     {
   2458         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   2459                                pComponentPrivate->dbg, OMX_PRSTATE3,
   2460                                "Component is in invalid state.\n");
   2461     }
   2462 
   2463     pMemoryListHead = pComponentPrivate->pMemoryListHead;
   2464 
   2465     switch (nConfigIndex)
   2466     {
   2467         case VideoEncodeCustomConfigIndexForceIFrame:
   2468             pComponentPrivate->bForceIFrame = (OMX_BOOL)(*((OMX_BOOL*)ComponentConfigStructure));
   2469             break;
   2470         case VideoEncodeCustomConfigIndexIntraFrameInterval:
   2471             pComponentPrivate->nIntraFrameInterval = (OMX_U32)(*((OMX_U32*)ComponentConfigStructure));
   2472             break;
   2473         case VideoEncodeCustomConfigIndexTargetFrameRate:
   2474             pComponentPrivate->nTargetFrameRate = (OMX_U32)(*((OMX_U32*)ComponentConfigStructure));
   2475             break;
   2476         case VideoEncodeCustomConfigIndexQPI:
   2477             pComponentPrivate->nQPI = (OMX_U32)(*((OMX_U32*)ComponentConfigStructure));
   2478             break;
   2479         case VideoEncodeCustomConfigIndexAIRRate:
   2480             pComponentPrivate->nAIRRate = (OMX_U32)(*((OMX_U32*)ComponentConfigStructure));
   2481             break;
   2482         /*ASO/FMO*/
   2483         case VideoEncodeCustomConfigIndexNumSliceASO:
   2484             pComponentPrivate->numSliceASO = (OMX_U32)(*((OMX_U32*)ComponentConfigStructure));
   2485             break;
   2486         case VideoEncodeCustomConfigIndexAsoSliceOrder:
   2487             for(i=0; i<MAXNUMSLCGPS;i++)
   2488             {
   2489                 pComponentPrivate->asoSliceOrder[i] = (OMX_U32)(*((*((OMX_U32**)ComponentConfigStructure))+i));
   2490             }
   2491             break;
   2492         case VideoEncodeCustomConfigIndexNumSliceGroups:
   2493             pComponentPrivate->numSliceGroups  = (OMX_U32)(*((OMX_U32*)ComponentConfigStructure));
   2494             break;
   2495         case VideoEncodeCustomConfigIndexSliceGroupMapType:
   2496             pComponentPrivate->sliceGroupMapType = (OMX_U32)(*((OMX_U32*)ComponentConfigStructure));
   2497             break;
   2498         case VideoEncodeCustomConfigIndexSliceGroupChangeDirectionFlag:
   2499             pComponentPrivate->sliceGroupChangeDirectionFlag = (OMX_U32)(*((OMX_U32*)ComponentConfigStructure));
   2500             break;
   2501         case VideoEncodeCustomConfigIndexSliceGroupChangeRate:
   2502             pComponentPrivate->sliceGroupChangeRate = (OMX_U32)(*((OMX_U32*)ComponentConfigStructure));
   2503             break;
   2504         case VideoEncodeCustomConfigIndexSliceGroupChangeCycle:
   2505             pComponentPrivate->sliceGroupChangeCycle = (OMX_U32)(*((OMX_U32*)ComponentConfigStructure));
   2506             break;
   2507         case VideoEncodeCustomConfigIndexSliceGroupParams:
   2508             for(i=0; i<MAXNUMSLCGPS;i++)
   2509             {
   2510                 pComponentPrivate->sliceGroupParams[i] = (OMX_U32)(*((*((OMX_U32**)ComponentConfigStructure))+i));
   2511             }
   2512             break;
   2513     case OMX_IndexConfigVideoFramerate:
   2514     {
   2515         memcpy(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pFrameRateConfig,
   2516                ComponentConfigStructure,
   2517                sizeof(OMX_CONFIG_FRAMERATETYPE));
   2518     }
   2519     break;
   2520     case OMX_IndexConfigVideoBitrate:
   2521     {
   2522         memcpy(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pBitRateTypeConfig,
   2523                ComponentConfigStructure,
   2524                sizeof(OMX_VIDEO_CONFIG_BITRATETYPE));
   2525 
   2526         if(!pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pBitRateTypeConfig->nEncodeBitrate)
   2527         {
   2528             pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pBitRateTypeConfig->nEncodeBitrate = OMX_VIDENC_GetDefaultBitRate(pComponentPrivate);
   2529         }
   2530         pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pPortDef->format.video.nBitrate =
   2531         pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pBitRateType->nTargetBitrate =
   2532         pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pBitRateTypeConfig->nEncodeBitrate;
   2533     }
   2534     break;
   2535     case OMX_IndexParamVideoErrorCorrection:
   2536     {
   2537         memcpy(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pErrorCorrectionType,
   2538                ComponentConfigStructure,
   2539                sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
   2540     }
   2541     break;
   2542     case OMX_IndexParamVideoIntraRefresh:
   2543         {
   2544         memcpy(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pIntraRefreshType,
   2545                 ComponentConfigStructure,
   2546                 sizeof(OMX_VIDEO_PARAM_INTRAREFRESHTYPE));
   2547         }
   2548         break;
   2549     case OMX_IndexParamVideoMotionVector:
   2550         {
   2551             memcpy(pComponentPrivate->pMotionVector,
   2552                     ComponentConfigStructure,
   2553                     sizeof(OMX_VIDEO_PARAM_MOTIONVECTORTYPE));
   2554             /* also set parameters set by this structure that are tracked outside of it */
   2555             pComponentPrivate->maxMVperMB = pComponentPrivate->pMotionVector->bFourMV ? 4 : 1;
   2556 
   2557             /* quarter pixel accuracy must be always enabled */
   2558             if (pComponentPrivate->pMotionVector->eAccuracy < OMX_Video_MotionVectorQuarterPel)
   2559                 eError = OMX_ErrorBadParameter;
   2560         }
   2561         break;
   2562     case OMX_IndexConfigVideoAVCIntraPeriod:
   2563         {
   2564             memcpy(pComponentPrivate->pH264IntraPeriod,
   2565                     ComponentConfigStructure,
   2566                     sizeof(OMX_VIDEO_CONFIG_AVCINTRAPERIOD));
   2567             /* also set parameters set by this structure that are tracked outside of it */
   2568             pComponentPrivate->nIntraFrameInterval = pComponentPrivate->pH264IntraPeriod->nPFrames;
   2569         }
   2570         break;
   2571     case VideoEncodeCustomConfigIndexDebug:
   2572         OMX_DBG_SETCONFIG(pComponentPrivate->dbg, ComponentConfigStructure);
   2573         break;
   2574     case VideoEncodeCustomConfigIndexMIRRate:
   2575                 pComponentPrivate->nMIRRate = (OMX_U32)(*((OMX_U32*)ComponentConfigStructure));
   2576         break;
   2577     case VideoEncodeCustomConfigIndexMVDataEnable:
   2578         pComponentPrivate->bMVDataEnable = (OMX_BOOL)(*((OMX_BOOL*)ComponentConfigStructure));
   2579          break;
   2580     case VideoEncodeCustomConfigIndexResyncDataEnable:
   2581         pComponentPrivate->bResyncDataEnable = (OMX_BOOL)(*((OMX_BOOL*)ComponentConfigStructure));
   2582          break;
   2583     case VideoEncodeCustomConfigIndexMaxMVperMB:
   2584         i = (OMX_U32)(*((OMX_U32*)ComponentConfigStructure));
   2585         if (i==1 || i==4)
   2586             pComponentPrivate->maxMVperMB=i;
   2587         else
   2588             eError = OMX_ErrorBadParameter;
   2589          break;
   2590     case VideoEncodeCustomConfigIndexIntra4x4EnableIdc:
   2591         pComponentPrivate->intra4x4EnableIdc = (IH264VENC_Intra4x4Params)(*((IH264VENC_Intra4x4Params*)ComponentConfigStructure));
   2592          break;
   2593     default:
   2594         eError = OMX_ErrorUnsupportedIndex;
   2595          break;
   2596         }
   2597 
   2598 OMX_CONF_CMD_BAIL:
   2599     return eError;
   2600 }
   2601 
   2602 /*----------------------------------------------------------------------------*/
   2603 /**
   2604   *  ExtensionIndex()
   2605   *
   2606   *
   2607   *
   2608   *
   2609   * @param pComponent    handle for this instance of the component
   2610   * @param pCallBacks    application callbacks
   2611   * @param ptr
   2612   *
   2613   * @retval OMX_NoError              Success, ready to roll
   2614   *         OMX_Error_BadParameter   The input parameter pointer is null
   2615   **/
   2616 /*----------------------------------------------------------------------------*/
   2617 
   2618 static OMX_ERRORTYPE ExtensionIndex(OMX_IN OMX_HANDLETYPE hComponent,
   2619                                        OMX_IN OMX_STRING cParameterName,
   2620                                        OMX_OUT OMX_INDEXTYPE* pIndexType)
   2621 {
   2622     VIDENC_CUSTOM_DEFINITION sVideoEncodeCustomIndex[] =
   2623     {
   2624         {"OMX.TI.VideoEncode.Param.VBVSize", VideoEncodeCustomParamIndexVBVSize},
   2625         {"OMX.TI.VideoEncode.Param.DeblockFilter", VideoEncodeCustomParamIndexDeblockFilter},
   2626         {"OMX.TI.VideoEncode.Config.ForceIFrame", VideoEncodeCustomConfigIndexForceIFrame},
   2627         {"OMX.TI.VideoEncode.Config.IntraFrameInterval", VideoEncodeCustomConfigIndexIntraFrameInterval},
   2628         {"OMX.TI.VideoEncode.Config.TargetFrameRate", VideoEncodeCustomConfigIndexTargetFrameRate},
   2629         {"OMX.TI.VideoEncode.Config.QPI", VideoEncodeCustomConfigIndexQPI},
   2630         {"OMX.TI.VideoEncode.Config.AIRRate", VideoEncodeCustomConfigIndexAIRRate},
   2631         {"OMX.TI.VideoEncode.Config.UnrestrictedMV", VideoEncodeCustomConfigIndexUnrestrictedMV},
   2632 
   2633         /*Segment mode Metadata*/
   2634         {"OMX.TI.VideoEncode.Config.MVDataEnable", VideoEncodeCustomConfigIndexMVDataEnable},
   2635         {"OMX.TI.VideoEncode.Config.ResyncDataEnable", VideoEncodeCustomConfigIndexResyncDataEnable},
   2636 
   2637         /*ASO*/
   2638         {"OMX.TI.VideoEncode.Config.NumSliceASO", VideoEncodeCustomConfigIndexNumSliceASO},
   2639         {"OMX.TI.VideoEncode.Config.AsoSliceOrder", VideoEncodeCustomConfigIndexAsoSliceOrder},
   2640         /*FMO*/
   2641         {"OMX.TI.VideoEncode.Config.NumSliceGroups", VideoEncodeCustomConfigIndexNumSliceGroups},
   2642         {"OMX.TI.VideoEncode.Config.SliceGroupMapType", VideoEncodeCustomConfigIndexSliceGroupMapType},
   2643         {"OMX.TI.VideoEncode.Config.SliceGroupChangeDirectionFlag", VideoEncodeCustomConfigIndexSliceGroupChangeDirectionFlag},
   2644         {"OMX.TI.VideoEncode.Config.SliceGroupChangeRate", VideoEncodeCustomConfigIndexSliceGroupChangeRate},
   2645         {"OMX.TI.VideoEncode.Config.SliceGroupChangeCycle", VideoEncodeCustomConfigIndexSliceGroupChangeCycle},
   2646         {"OMX.TI.VideoEncode.Config.SliceGroupParams", VideoEncodeCustomConfigIndexSliceGroupParams},
   2647         /**/
   2648         {"OMX.TI.VideoEncode.Config.MIRRate", VideoEncodeCustomConfigIndexMIRRate},
   2649         {"OMX.TI.VideoEncode.Config.MaxMVperMB", VideoEncodeCustomConfigIndexMaxMVperMB},
   2650         {"OMX.TI.VideoEncode.Config.Intra4x4EnableIdc", VideoEncodeCustomConfigIndexIntra4x4EnableIdc},
   2651         {"OMX.TI.VideoEncode.Config.EncodingPreset", VideoEncodeCustomParamIndexEncodingPreset},
   2652         {"OMX.TI.VideoEncode.Config.NALFormat", VideoEncodeCustomParamIndexNALFormat},
   2653         {"OMX.TI.VideoEncode.Debug", VideoEncodeCustomConfigIndexDebug}
   2654     };
   2655     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2656     int nIndex = 0;
   2657     const int nNumberIndices = sizeof(sVideoEncodeCustomIndex)/sizeof(sVideoEncodeCustomIndex[0]);
   2658 
   2659     if (!hComponent || !pIndexType)
   2660     {
   2661         eError = OMX_ErrorBadParameter;
   2662         goto OMX_CONF_CMD_BAIL;
   2663     }
   2664 
   2665     for (nIndex = 0; nIndex < nNumberIndices; nIndex++)
   2666     {
   2667         if (!strcmp((const char*)cParameterName, (const char*)(&(sVideoEncodeCustomIndex[nIndex].cCustomName))))
   2668         {
   2669             *pIndexType = sVideoEncodeCustomIndex[nIndex].nCustomIndex;
   2670             eError = OMX_ErrorNone;
   2671             break;
   2672         }
   2673     }
   2674 
   2675 OMX_CONF_CMD_BAIL:
   2676     return eError;
   2677 }
   2678 
   2679 /*----------------------------------------------------------------------------*/
   2680 /**
   2681   *  GetState() Sets application callbacks to the component
   2682   *
   2683   * This method will update application callbacks
   2684   * the application.
   2685   *
   2686   * @param pComp         handle for this instance of the component
   2687   * @param pCallBacks    application callbacks
   2688   * @param ptr
   2689   *
   2690   * @retval OMX_NoError              Success, ready to roll
   2691   *         OMX_Error_BadParameter   The input parameter pointer is null
   2692   **/
   2693 /*----------------------------------------------------------------------------*/
   2694 
   2695 static OMX_ERRORTYPE GetState (OMX_IN OMX_HANDLETYPE hComponent,
   2696                                OMX_OUT OMX_STATETYPE* pState)
   2697 {
   2698     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   2699     OMX_COMPONENTTYPE* pHandle = NULL;
   2700     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   2701     struct timespec abs_time = {0,0};
   2702     int nPendingStateChangeRequests = 0;
   2703     int ret = 0;
   2704     /* Set to sufficiently high value */
   2705     int mutex_timeout = 3;
   2706 
   2707     if(hComponent == NULL || pState == NULL) {
   2708         return OMX_ErrorBadParameter;
   2709     }
   2710 
   2711     pHandle = (OMX_COMPONENTTYPE*)hComponent;
   2712     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate;
   2713 
   2714     /* Retrieve current state */
   2715     if (pHandle && pHandle->pComponentPrivate) {
   2716         /* Check for any pending state transition requests */
   2717         if(pthread_mutex_lock(&pComponentPrivate->mutexStateChangeRequest)) {
   2718             return OMX_ErrorUndefined;
   2719         }
   2720         nPendingStateChangeRequests = pComponentPrivate->nPendingStateChangeRequests;
   2721         if(!nPendingStateChangeRequests) {
   2722            if(pthread_mutex_unlock(&pComponentPrivate->mutexStateChangeRequest)) {
   2723                return OMX_ErrorUndefined;
   2724            }
   2725 
   2726            /* No pending state transitions */
   2727            *pState = ((VIDENC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate)->eState;
   2728            eError = OMX_ErrorNone;
   2729         }
   2730         else {
   2731                   /* Wait for component to complete state transition */
   2732            clock_gettime(CLOCK_REALTIME, &abs_time);
   2733            abs_time.tv_sec += mutex_timeout;
   2734            abs_time.tv_nsec = 0;
   2735           ret = pthread_cond_timedwait(&(pComponentPrivate->StateChangeCondition), &(pComponentPrivate->mutexStateChangeRequest), &abs_time);
   2736            if (!ret) {
   2737               /* Component has completed state transitions*/
   2738               *pState = ((VIDENC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate)->eState;
   2739               if(pthread_mutex_unlock(&pComponentPrivate->mutexStateChangeRequest)) {
   2740                  return OMX_ErrorUndefined;
   2741               }
   2742               eError = OMX_ErrorNone;
   2743            }
   2744            else if(ret == ETIMEDOUT) {
   2745               /* Unlock mutex in case of timeout */
   2746               OMX_ERROR4(pComponentPrivate->dbg, "GetState timed out\n");
   2747               pthread_mutex_unlock(&pComponentPrivate->mutexStateChangeRequest);
   2748               *pState = OMX_StateInvalid;
   2749               return OMX_ErrorNone;
   2750            }
   2751         }
   2752     }
   2753      else {
   2754         eError = OMX_ErrorInvalidComponent;
   2755         *pState = OMX_StateInvalid;
   2756     }
   2757 
   2758     return eError;
   2759 }
   2760 
   2761 /*----------------------------------------------------------------------------*/
   2762 /**
   2763   *  EmptyThisBuffer() Sets application callbacks to the component
   2764   *
   2765   * This method will update application callbacks
   2766   * the application.
   2767   *
   2768   * @param pComp         handle for this instance of the component
   2769   * @param pCallBacks    application callbacks
   2770   * @param ptr
   2771   *
   2772   * @retval OMX_NoError              Success, ready to roll
   2773   *         OMX_Error_BadParameter   The input parameter pointer is null
   2774   **/
   2775 /*----------------------------------------------------------------------------*/
   2776 
   2777 static OMX_ERRORTYPE EmptyThisBuffer (OMX_IN OMX_HANDLETYPE hComponent,
   2778                                       OMX_IN OMX_BUFFERHEADERTYPE* pBufHead)
   2779 {
   2780     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   2781     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   2782     int nRet                                    = 0;
   2783     OMX_HANDLETYPE hTunnelComponent             = NULL;
   2784     VIDENC_BUFFER_PRIVATE* pBufferPrivate       = NULL;
   2785     VIDENC_NODE* pMemoryListHead                = NULL;
   2786     OMX_PARAM_PORTDEFINITIONTYPE* pPortDefIn    = NULL;
   2787 
   2788     OMX_CONF_CHECK_CMD(hComponent, ((OMX_COMPONENTTYPE *) hComponent)->pComponentPrivate, 1);
   2789 
   2790     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   2791     OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, pBufHead, 1, 1);
   2792 
   2793     hTunnelComponent = pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->hTunnelComponent;
   2794 
   2795     pComponentPrivate->pMarkData = pBufHead->pMarkData;
   2796     pComponentPrivate->hMarkTargetComponent = pBufHead->hMarkTargetComponent;
   2797     pPortDefIn = pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pPortDef;
   2798     if (!(pPortDefIn->bEnabled))
   2799     {
   2800         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   2801                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   2802                                "Emptying buffer on disabled port.\n");
   2803     }
   2804 
   2805     if(!hTunnelComponent)
   2806     {
   2807         if (pBufHead->nInputPortIndex != 0x0  ||
   2808             pBufHead->nOutputPortIndex != OMX_NOPORT)
   2809         {
   2810             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadPortIndex,
   2811                                    pComponentPrivate->dbg, OMX_PRBUFFER4,
   2812                                    "Emptying buffer on invalid port.\n");
   2813         }
   2814 
   2815         if (pComponentPrivate->eState != OMX_StateExecuting &&
   2816             pComponentPrivate->eState != OMX_StatePause)
   2817         {
   2818             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   2819                                    pComponentPrivate->dbg, OMX_PRBUFFER4,
   2820                                    "Emptying buffer in invalid state (%d).\n", pComponentPrivate->eState);
   2821         }
   2822     }
   2823 
   2824     OMX_CONF_CHK_VERSION(pBufHead, OMX_BUFFERHEADERTYPE, eError);
   2825     pMemoryListHead = pComponentPrivate->pMemoryListHead;
   2826 
   2827 
   2828 #ifdef __PERF_INSTRUMENTATION__
   2829     PERF_ReceivedFrame(pComponentPrivate->pPERF,
   2830                        pBufHead->pBuffer,
   2831                        pBufHead->nFilledLen,
   2832                        PERF_ModuleHLMM);
   2833 #endif
   2834 
   2835 #ifndef UNDER_CE
   2836     if (pthread_mutex_lock(&(pComponentPrivate->mVideoEncodeBufferMutex)) != 0)
   2837     {
   2838         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorHardware,
   2839                                pComponentPrivate->dbg, OMX_TRACE4,
   2840                                "pthread_mutex_lock() failed.\n");
   2841     }
   2842     pBufferPrivate = pBufHead->pInputPortPrivate;
   2843 
   2844 
   2845     pBufferPrivate->eBufferOwner = VIDENC_BUFFER_WITH_COMPONENT;
   2846     pBufferPrivate->bReadFromPipe = OMX_FALSE;
   2847     /* Check if frame rate needs to be updated */
   2848     pComponentPrivate->nFrameCount++;
   2849     pComponentPrivate->nVideoTime = pBufHead->nTimeStamp - pComponentPrivate->nLastUpdateTime;
   2850 
   2851     if (pComponentPrivate->nFrameCount == pComponentPrivate->nFrameRateUpdateInterval) {
   2852 
   2853          if(pComponentPrivate->nVideoTime <= 0) {
   2854             /* Incorrect time stamps */
   2855             return OMX_ErrorBadParameter;
   2856          }
   2857 
   2858         /* Timestamps are in micro seconds  */
   2859         pComponentPrivate->nTargetFrameRate = pComponentPrivate->nFrameCount * 1000000 / pComponentPrivate->nVideoTime;
   2860 
   2861         if(pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pPortDef->format.video.eCompressionFormat == OMX_VIDEO_CodingAVC) {
   2862              /* H.264 Socket Node expects frame rate to be multiplied by 1000 */
   2863              pComponentPrivate->nTargetFrameRate *= 1000;
   2864 
   2865              if((pComponentPrivate->nPrevTargetFrameRate) &&
   2866                 (pComponentPrivate->nTargetFrameRate ==  pComponentPrivate->nPrevTargetFrameRate)) {
   2867                   pComponentPrivate->bForceIFrame = OMX_TRUE;
   2868              }
   2869              else {
   2870                   pComponentPrivate->nPrevTargetFrameRate = pComponentPrivate->nTargetFrameRate;
   2871                   pComponentPrivate->bForceIFrame = OMX_FALSE;
   2872              }
   2873         }
   2874         pComponentPrivate->nLastUpdateTime = pBufHead->nTimeStamp;
   2875         pComponentPrivate->nFrameCount = 0;
   2876     }
   2877 
   2878     nRet = write(pComponentPrivate->nFilled_iPipe[1],
   2879                  &(pBufHead),
   2880                  sizeof(pBufHead));
   2881     if (nRet == -1)
   2882     {
   2883         pthread_mutex_unlock(&(pComponentPrivate->mVideoEncodeBufferMutex));
   2884         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorHardware,
   2885                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   2886                                "failed to write to nFilled_iPipe.\n");
   2887     } else {
   2888         OMX_VIDENC_IncrementBufferCountByOne(&pComponentPrivate->EmptythisbufferCount);
   2889     }
   2890     if (pthread_mutex_unlock(&(pComponentPrivate->mVideoEncodeBufferMutex)) != 0)
   2891     {
   2892         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorHardware,
   2893                                pComponentPrivate->dbg, OMX_TRACE4,
   2894                                "pthread_mutex_unlock() failed.\n");
   2895     }
   2896 #else
   2897     pBufferPrivate->eBufferOwner = VIDENC_BUFFER_WITH_COMPONENT;
   2898     pBufferPrivate->bReadFromPipe = OMX_FALSE;
   2899     nRet = write(pComponentPrivate->nFilled_iPipe[1],
   2900                  &(pBufHead),
   2901                  sizeof(pBufHead));
   2902     if (nRet == -1)
   2903     {
   2904         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorHardware,
   2905                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   2906                                "failed to write to nFilled_iPipe.\n");
   2907     }
   2908 #endif
   2909 
   2910 OMX_CONF_CMD_BAIL:
   2911     return eError;
   2912 }
   2913 
   2914 /*----------------------------------------------------------------------------*/
   2915 /**
   2916   *  FillThisBuffer() Sets application callbacks to the component
   2917   *
   2918   * This method will update application callbacks
   2919   * the application.
   2920   *
   2921   * @param pComp         handle for this instance of the component
   2922   * @param pCallBacks    application callbacks
   2923   * @param ptr
   2924   *
   2925   * @retval OMX_NoError              Success, ready to roll
   2926   *         OMX_Error_BadParameter   The input parameter pointer is null
   2927   **/
   2928 /*----------------------------------------------------------------------------*/
   2929 static OMX_ERRORTYPE FillThisBuffer (OMX_IN OMX_HANDLETYPE hComponent,
   2930                                      OMX_IN OMX_BUFFERHEADERTYPE* pBufHead)
   2931 {
   2932     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   2933     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   2934     int nRet                                    = 0;
   2935     VIDENC_BUFFER_PRIVATE* pBufferPrivate       = NULL;
   2936     OMX_HANDLETYPE hTunnelComponent             = NULL;
   2937     OMX_PARAM_PORTDEFINITIONTYPE* pPortDefOut   = NULL;
   2938 
   2939     OMX_CONF_CHECK_CMD(hComponent, ((OMX_COMPONENTTYPE *) hComponent)->pComponentPrivate, 1);
   2940 
   2941     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   2942     OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, pBufHead, 1, 1);
   2943 
   2944 
   2945     hTunnelComponent = pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->hTunnelComponent;
   2946     pPortDefOut = pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pPortDef;
   2947     pBufHead->nFilledLen = 0;
   2948     pBufferPrivate = (VIDENC_BUFFER_PRIVATE*)pBufHead->pOutputPortPrivate;
   2949 
   2950     if (!(pPortDefOut->bEnabled))
   2951     {
   2952         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   2953                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   2954                                "Filling buffer on disabled port.\n");
   2955     }
   2956 
   2957     if(!hTunnelComponent)
   2958     {
   2959         if (pBufHead->nOutputPortIndex != 0x1  ||
   2960             pBufHead->nInputPortIndex != OMX_NOPORT)
   2961         {
   2962             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadPortIndex,
   2963                                    pComponentPrivate->dbg, OMX_PRBUFFER4,
   2964                                    "Filling buffer on invalid port.\n");
   2965         }
   2966 
   2967         if (pComponentPrivate->eState != OMX_StateExecuting &&
   2968             pComponentPrivate->eState != OMX_StatePause)
   2969         {
   2970             OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   2971                                    pComponentPrivate->dbg, OMX_PRBUFFER4,
   2972                                    "Filling buffer in invalid state (%d).\n", pComponentPrivate->eState);
   2973         }
   2974     }
   2975     OMX_CONF_CHK_VERSION(pBufHead, OMX_BUFFERHEADERTYPE, eError);
   2976 #ifdef __PERF_INSTRUMENTATION__
   2977     PERF_ReceivedFrame(pComponentPrivate->pPERF,
   2978                        pBufHead->pBuffer,
   2979                        0,
   2980                        PERF_ModuleHLMM);
   2981 #endif
   2982 
   2983     if (pComponentPrivate->pMarkBuf)
   2984     {
   2985         pBufHead->hMarkTargetComponent = pComponentPrivate->pMarkBuf->hMarkTargetComponent;
   2986         pBufHead->pMarkData = pComponentPrivate->pMarkBuf->pMarkData;
   2987         pComponentPrivate->pMarkBuf = NULL;
   2988     }
   2989 
   2990     if (pComponentPrivate->pMarkData)
   2991     {
   2992         pBufHead->hMarkTargetComponent = pComponentPrivate->hMarkTargetComponent;
   2993         pBufHead->pMarkData = pComponentPrivate->pMarkData;
   2994         pComponentPrivate->pMarkData = NULL;
   2995     }
   2996 
   2997 #ifndef UNDER_CE
   2998     if (pthread_mutex_lock(&(pComponentPrivate->mVideoEncodeBufferMutex)) != 0)
   2999     {
   3000         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorHardware,
   3001                                pComponentPrivate->dbg, OMX_TRACE4,
   3002                                "pthread_mutex_lock() failed.\n");
   3003     }
   3004 
   3005 
   3006     pBufferPrivate->eBufferOwner = VIDENC_BUFFER_WITH_COMPONENT;
   3007     pBufferPrivate->bReadFromPipe = OMX_FALSE;
   3008     nRet = write(pComponentPrivate->nFree_oPipe[1],
   3009                  &(pBufHead),
   3010                  sizeof (pBufHead));
   3011     if (nRet == -1)
   3012     {
   3013         pthread_mutex_unlock(&(pComponentPrivate->mVideoEncodeBufferMutex));
   3014         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorHardware,
   3015                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   3016                                "failed to write to nFree_oPipe.\n");
   3017     } else {
   3018         OMX_VIDENC_IncrementBufferCountByOne(&pComponentPrivate->FillthisbufferCount);
   3019     }
   3020     if (pthread_mutex_unlock(&(pComponentPrivate->mVideoEncodeBufferMutex)) != 0)
   3021     {
   3022         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorHardware,
   3023                                pComponentPrivate->dbg, OMX_TRACE4,
   3024                                "pthread_mutex_unlock() failed.\n");
   3025     }
   3026 #else
   3027 
   3028     pBufferPrivate->eBufferOwner = VIDENC_BUFFER_WITH_COMPONENT;
   3029     pBufferPrivate->bReadFromPipe = OMX_FALSE;
   3030     nRet = write(pComponentPrivate->nFree_oPipe[1],
   3031                  &(pBufHead),
   3032                  sizeof (pBufHead));
   3033     if (nRet == -1)
   3034     {
   3035         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorHardware,
   3036                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   3037                                "failed to write to nFree_oPipe.\n");
   3038     }
   3039 #endif
   3040 OMX_CONF_CMD_BAIL:
   3041     return eError;
   3042 }
   3043 /*----------------------------------------------------------------------------*/
   3044 /**
   3045   * OMX_ComponentDeInit() Sets application callbacks to the component
   3046   *
   3047   * This method will update application callbacks
   3048   * the application.
   3049   *
   3050   * @param pComp         handle for this instance of the component
   3051   * @param pCallBacks    application callbacks
   3052   * @param ptr
   3053   *
   3054   * @retval OMX_NoError              Success, ready to roll
   3055   *         OMX_Error_BadParameter   The input parameter pointer is null
   3056   **/
   3057 /*----------------------------------------------------------------------------*/
   3058 
   3059 static OMX_ERRORTYPE ComponentDeInit(OMX_IN OMX_HANDLETYPE hComponent)
   3060 {
   3061     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   3062     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   3063     LCML_DSP_INTERFACE* pLcmlHandle             = NULL;
   3064     VIDENC_NODE* pMemoryListHead                = NULL;
   3065     OMX_ERRORTYPE eErr  = OMX_ErrorNone;
   3066     OMX_S32 nRet        = -1;
   3067     OMX_S32 nStop       = -1;
   3068     OMX_U32 nTimeout    = 0;
   3069     struct OMX_TI_Debug dbg;
   3070 
   3071     OMX_CONF_CHECK_CMD(hComponent, ((OMX_COMPONENTTYPE *) hComponent)->pComponentPrivate, 1);
   3072     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   3073 
   3074     dbg = pComponentPrivate->dbg;
   3075 
   3076     pMemoryListHead=pComponentPrivate->pMemoryListHead;
   3077 
   3078 #ifdef __PERF_INSTRUMENTATION__
   3079     PERF_Boundary(pComponentPrivate->pPERF,
   3080                   PERF_BoundaryStart | PERF_BoundaryCleanup);
   3081 #endif
   3082     while(1)
   3083     {
   3084         if(!(pComponentPrivate->bHandlingFatalError))
   3085         {
   3086             if(!(pComponentPrivate->bErrorLcmlHandle) &&
   3087                !(pComponentPrivate->bUnresponsiveDsp))
   3088             { /* Add for ResourceExhaustionTest*/
   3089                 pLcmlHandle = pComponentPrivate->pLCML;
   3090                 if (pLcmlHandle != NULL)
   3091                 {
   3092                     if (pComponentPrivate->bCodecStarted == OMX_TRUE ||
   3093                     pComponentPrivate->bCodecLoaded == OMX_TRUE)
   3094                     {
   3095                         eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   3096                                                    EMMCodecControlDestroy,
   3097                                                    NULL);
   3098                         if (eError != OMX_ErrorNone)
   3099                         {
   3100                             OMX_PRDSP4(dbg, "error when requesting EMMCodecControlDestroy");
   3101                             eError = OMX_ErrorUndefined;
   3102                         }
   3103 
   3104 #ifdef UNDER_CE
   3105                         FreeLibrary(g_hLcmlDllHandle);
   3106                         g_hLcmlDllHandle = NULL;
   3107 #endif
   3108                     }
   3109                 }
   3110             }
   3111             break;
   3112         }
   3113         if(nTimeout++ > VIDENC_MAX_COMPONENT_TIMEOUT)
   3114         {
   3115             OMX_ERROR5(dbg, "TimeOut in HandlingFatalError!\n");
   3116             break;
   3117         }
   3118         sched_yield();
   3119     }
   3120 
   3121 
   3122         /*Unload LCML */
   3123     if(pComponentPrivate->pModLcml != NULL)
   3124     {
   3125 #ifndef UNDER_CE
   3126         dlclose(pComponentPrivate->pModLcml);
   3127 #else
   3128         FreeLibrary(pComponentPrivate->pModLcml);
   3129 #endif
   3130        pComponentPrivate->pModLcml = NULL;
   3131        pComponentPrivate->pLCML = NULL;
   3132     }
   3133 
   3134 
   3135     pComponentPrivate->bCodecStarted = OMX_FALSE;
   3136 
   3137     nStop = -1;
   3138 #ifdef __PERF_INSTRUMENTATION__
   3139     PERF_SendingCommand(pComponentPrivate->pPERF, nStop, 0, PERF_ModuleComponent);
   3140 #endif
   3141     OMX_PRCOMM2(dbg, "eCmd: -1 Send\n");
   3142     nRet = write(pComponentPrivate->nCmdPipe[1],
   3143                  &nStop,
   3144                  sizeof(OMX_COMMANDTYPE));
   3145 
   3146     /*Join the component thread*/
   3147     /*pthread_cancel(ComponentThread);*/
   3148 #ifdef UNDER_CE
   3149     eErr = pthread_join(ComponentThread, NULL);
   3150 #else
   3151     eErr = pthread_join(pComponentPrivate->ComponentThread, NULL);
   3152 #endif
   3153     if (eErr != 0)
   3154     {
   3155         eError = OMX_ErrorHardware;
   3156         OMX_TRACE4(dbg, "Error pthread_join (%d).\n", eErr);
   3157     }
   3158 
   3159     /*close the data pipe handles*/
   3160     eErr = close(pComponentPrivate->nFree_oPipe[0]);
   3161     if (0 != eErr && OMX_ErrorNone == eError)
   3162     {
   3163         eError = OMX_ErrorHardware;
   3164         OMX_PRBUFFER4(dbg, "Error while closing data pipe (%d).\n", eErr);
   3165     }
   3166 
   3167     eErr = close(pComponentPrivate->nFilled_iPipe[0]);
   3168     if (0 != eErr && OMX_ErrorNone == eError)
   3169     {
   3170         eError = OMX_ErrorHardware;
   3171         OMX_PRBUFFER4(dbg, "Error while closing data pipe (%d).\n", eErr);
   3172     }
   3173 
   3174     eErr = close(pComponentPrivate->nFree_oPipe[1]);
   3175     if (0 != eErr && OMX_ErrorNone == eError)
   3176     {
   3177         eError = OMX_ErrorHardware;
   3178         OMX_PRBUFFER4(dbg, "Error while closing data pipe (%d).\n", eErr);
   3179     }
   3180 
   3181     eErr = close(pComponentPrivate->nFilled_iPipe[1]);
   3182     if (0 != eErr && OMX_ErrorNone == eError)
   3183     {
   3184         eError = OMX_ErrorHardware;
   3185         OMX_PRBUFFER4(dbg, "Error while closing data pipe (%d).\n", eErr);
   3186     }
   3187 
   3188     /*Close the command pipe handles*/
   3189     eErr = close(pComponentPrivate->nCmdPipe[0]);
   3190     if (0 != eErr && OMX_ErrorNone == eError)
   3191     {
   3192         eError = OMX_ErrorHardware;
   3193         OMX_PRCOMM4(dbg, "Error while closing data pipe (%d).\n", eErr);
   3194     }
   3195 
   3196     eErr = close(pComponentPrivate->nCmdPipe[1]);
   3197     if (0 != eErr && OMX_ErrorNone == eError)
   3198     {
   3199         eError = OMX_ErrorHardware;
   3200         OMX_PRCOMM4(dbg, "Error while closing data pipe (%d).\n", eErr);
   3201     }
   3202     /*Close the command data pipe handles*/
   3203     eErr = close(pComponentPrivate->nCmdDataPipe[0]);
   3204     if (0 != eErr && OMX_ErrorNone == eError)
   3205     {
   3206         eError = OMX_ErrorHardware;
   3207         OMX_PRCOMM4(dbg, "Error while closing data pipe (%d).\n", eErr);
   3208     }
   3209 
   3210     eErr = close(pComponentPrivate->nCmdDataPipe[1]);
   3211     if (0 != eErr && OMX_ErrorNone == eError)
   3212     {
   3213         eError = OMX_ErrorHardware;
   3214         OMX_PRCOMM4(dbg, "Error while closing data pipe (%d).\n", eErr);
   3215     }
   3216 
   3217     OMX_PRINT2(dbg, "pipes closed...\n");
   3218 
   3219 #ifndef UNDER_CE
   3220     OMX_TRACE2(dbg, "destroy mVideoEncodeBufferMutex -> %p\n",
   3221               &(pComponentPrivate->mVideoEncodeBufferMutex));
   3222     /* Destroy Mutex for Buffer Tracking */
   3223     nRet = pthread_mutex_destroy(&(pComponentPrivate->mVideoEncodeBufferMutex));
   3224     while (nRet == EBUSY)
   3225     {
   3226         /* The mutex is busy. We need to unlock it, then destroy it. */
   3227         OMX_TRACE2(dbg, "destroy status = EBUSY\n");
   3228         pthread_mutex_unlock(&(pComponentPrivate->mVideoEncodeBufferMutex));
   3229         nRet = pthread_mutex_destroy(&(pComponentPrivate->mVideoEncodeBufferMutex));
   3230     }
   3231 #else
   3232     /* Add WinCE critical section API here... */
   3233 #endif
   3234 #ifndef UNDER_CE
   3235     pthread_mutex_destroy(&pComponentPrivate->videoe_mutex);
   3236     pthread_cond_destroy(&pComponentPrivate->populate_cond);
   3237     pthread_mutex_destroy(&pComponentPrivate->videoe_mutex_app);
   3238     pthread_cond_destroy(&pComponentPrivate->unpopulate_cond);
   3239     pthread_cond_destroy(&pComponentPrivate->flush_cond);
   3240     pthread_cond_destroy(&pComponentPrivate->stop_cond);
   3241     pthread_mutex_destroy(&bufferReturned_mutex);
   3242     pthread_cond_destroy(&bufferReturned_condition);
   3243 #else
   3244     OMX_DestroyEvent(&(pComponentPrivate->InLoaded_event));
   3245     OMX_DestroyEvent(&(pComponentPrivate->InIdle_event));
   3246 #endif
   3247 
   3248 #ifdef RESOURCE_MANAGER_ENABLED
   3249     /* Deinitialize Resource Manager */
   3250     eError = RMProxy_DeinitalizeEx(OMX_COMPONENTTYPE_VIDEO);
   3251     if (eError != OMX_ErrorNone)
   3252     {
   3253         OMX_PRMGR4(dbg, "Error returned from destroy ResourceManagerProxy thread\n");
   3254         eError = OMX_ErrorUndefined;
   3255     }
   3256 #endif
   3257 
   3258 #ifdef __PERF_INSTRUMENTATION__
   3259     PERF_Boundary(pComponentPrivate->pPERF,
   3260                   PERF_BoundaryComplete | PERF_BoundaryCleanup);
   3261     PERF_Done(pComponentPrivate->pPERF);
   3262 #endif
   3263 
   3264     pthread_mutex_destroy(&pComponentPrivate->mutexStateChangeRequest);
   3265     pthread_cond_destroy(&pComponentPrivate->StateChangeCondition);
   3266 
   3267     if (pComponentPrivate != NULL)
   3268     {
   3269         VIDENC_FREE(pComponentPrivate, pMemoryListHead, dbg);
   3270     }
   3271 
   3272     /* Free Resources */
   3273     OMX_VIDENC_ListDestroy(&dbg, pMemoryListHead);
   3274 
   3275     OMX_DBG_CLOSE(dbg);
   3276 
   3277 OMX_CONF_CMD_BAIL:
   3278     return eError;
   3279 }
   3280 
   3281 /*----------------------------------------------------------------------------*/
   3282 /**
   3283   *  UseBuffer()
   3284   *
   3285   *
   3286   *
   3287   *
   3288   * @param
   3289   * @param
   3290   * @param
   3291   *
   3292   * @retval OMX_NoError              Success, ready to roll
   3293   *         OMX_Error_BadParameter   The input parameter pointer is null
   3294   **/
   3295 /*----------------------------------------------------------------------------*/
   3296 
   3297 OMX_ERRORTYPE UseBuffer(OMX_IN OMX_HANDLETYPE hComponent,
   3298                         OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
   3299                         OMX_IN OMX_U32 nPortIndex,
   3300                         OMX_IN OMX_PTR pAppPrivate,
   3301                         OMX_IN OMX_U32 nSizeBytes,
   3302                         OMX_IN OMX_U8* pBuffer)
   3303 {
   3304     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   3305     OMX_PARAM_PORTDEFINITIONTYPE* pPortDef      = NULL;
   3306     VIDEOENC_PORT_TYPE* pCompPort               = NULL;
   3307     VIDENC_BUFFER_PRIVATE* pBufferPrivate       = NULL;
   3308     OMX_U32 nBufferCnt      = -1;
   3309     OMX_ERRORTYPE eError    = OMX_ErrorNone;
   3310     OMX_HANDLETYPE hTunnelComponent = NULL;
   3311     VIDENC_NODE* pMemoryListHead    = NULL;
   3312 
   3313     OMX_CONF_CHECK_CMD(hComponent, ((OMX_COMPONENTTYPE *) hComponent)->pComponentPrivate, 1);
   3314 
   3315     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   3316     OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, ppBufferHdr, pBuffer, 1);
   3317 
   3318     if (nPortIndex == VIDENC_INPUT_PORT)
   3319     {
   3320        pPortDef = pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pPortDef;
   3321     }
   3322     else if (nPortIndex == VIDENC_OUTPUT_PORT)
   3323     {
   3324         pPortDef = pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pPortDef;
   3325     }
   3326     else
   3327     {
   3328         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter,
   3329                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   3330                                "Using buffer on invalid port index.\n");
   3331     }
   3332 
   3333     if (!pPortDef->bEnabled)
   3334     {
   3335         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   3336                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   3337                                "Using buffer on disabled port.\n");
   3338     }
   3339 
   3340     if (pPortDef->bPopulated)
   3341     {
   3342         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter,
   3343                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   3344                                "Allocating duplicate buffer\n");
   3345     }
   3346     if (nSizeBytes < pPortDef->nBufferSize)
   3347     {
   3348         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter,
   3349             pComponentPrivate->dbg, OMX_PRBUFFER4,
   3350             "Allocating invalid size buffer: nBufferSize: %lu nSizeBytes: %lu\n", pPortDef->nBufferSize, nSizeBytes);
   3351     }
   3352 
   3353 
   3354     if (pComponentPrivate->eState == OMX_StateInvalid)
   3355     {
   3356         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorInvalidState,
   3357                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   3358                                "Using buffer in invalid state.\n");
   3359     }
   3360 
   3361     pMemoryListHead=pComponentPrivate->pMemoryListHead;
   3362 
   3363 
   3364 #ifdef __PERF_INSTRUMENTATION__
   3365     PERF_ReceivedBuffer(pComponentPrivate->pPERF,
   3366                         pBuffer, nSizeBytes,
   3367                         PERF_ModuleHLMM);
   3368 #endif
   3369 
   3370     nBufferCnt       = pComponentPrivate->pCompPort[nPortIndex]->nBufferCnt;
   3371     hTunnelComponent = pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->hTunnelComponent;
   3372     pCompPort        = pComponentPrivate->pCompPort[nPortIndex];
   3373     pBufferPrivate   = pCompPort->pBufferPrivate[nBufferCnt];
   3374 
   3375     VIDENC_MALLOC(pBufferPrivate->pBufferHdr,
   3376                   sizeof(OMX_BUFFERHEADERTYPE),
   3377                   OMX_BUFFERHEADERTYPE, pMemoryListHead, pComponentPrivate->dbg);
   3378 
   3379     pBufferPrivate->pBufferHdr->nSize       = sizeof(OMX_BUFFERHEADERTYPE);
   3380     pBufferPrivate->pBufferHdr->nVersion    = pPortDef->nVersion;
   3381     pBufferPrivate->pBufferHdr->pBuffer     = pBuffer;
   3382     pBufferPrivate->pBufferHdr->pAppPrivate = pAppPrivate;
   3383     pBufferPrivate->pBufferHdr->nAllocLen   = nSizeBytes;
   3384 
   3385     if (hTunnelComponent != NULL)
   3386     {
   3387         /* set direction dependent fields */
   3388         if (pPortDef->eDir == OMX_DirInput)
   3389         {
   3390             pBufferPrivate->pBufferHdr->nInputPortIndex  = nPortIndex;
   3391             pBufferPrivate->pBufferHdr->nOutputPortIndex = pCompPort->nTunnelPort;
   3392         }
   3393         else
   3394         {
   3395             pBufferPrivate->pBufferHdr->nInputPortIndex  = pCompPort->nTunnelPort;
   3396             pBufferPrivate->pBufferHdr->nOutputPortIndex = nPortIndex;
   3397         }
   3398     }
   3399     else
   3400     {
   3401         if (nPortIndex == VIDENC_INPUT_PORT)
   3402         {
   3403             pBufferPrivate->pBufferHdr->nInputPortIndex  = VIDENC_INPUT_PORT;
   3404             pBufferPrivate->pBufferHdr->nOutputPortIndex = OMX_NOPORT;
   3405         }
   3406         else
   3407         {
   3408             pBufferPrivate->pBufferHdr->nInputPortIndex  = OMX_NOPORT;
   3409             pBufferPrivate->pBufferHdr->nOutputPortIndex = VIDENC_OUTPUT_PORT;
   3410         }
   3411     }
   3412     *ppBufferHdr = pBufferPrivate->pBufferHdr;
   3413     pBufferPrivate->pBufferHdr = pBufferPrivate->pBufferHdr;
   3414 
   3415     if (nPortIndex == VIDENC_INPUT_PORT)
   3416     {
   3417         pBufferPrivate->pBufferHdr->pInputPortPrivate = pBufferPrivate;
   3418         if(!pComponentPrivate->nInBufferSize || (pComponentPrivate->nInBufferSize > nSizeBytes)) {
   3419             pComponentPrivate->nInBufferSize = nSizeBytes;
   3420         }
   3421     }
   3422     else
   3423     {
   3424        pBufferPrivate->pBufferHdr->pOutputPortPrivate = pBufferPrivate;
   3425         if(!pComponentPrivate->nOutBufferSize || (pComponentPrivate->nOutBufferSize > nSizeBytes)) {
   3426             pComponentPrivate->nOutBufferSize = nSizeBytes;
   3427         }
   3428     }
   3429     pBufferPrivate->bAllocByComponent = OMX_FALSE;
   3430 
   3431     if (hTunnelComponent != NULL)
   3432     {
   3433         pBufferPrivate->eBufferOwner = VIDENC_BUFFER_WITH_TUNNELEDCOMP;
   3434     }
   3435     else
   3436     {
   3437         pBufferPrivate->eBufferOwner = VIDENC_BUFFER_WITH_CLIENT;
   3438     }
   3439 
   3440     eError = OMX_VIDENC_Allocate_DSPResources(pComponentPrivate, nPortIndex);
   3441     OMX_DBG_BAIL_IF_ERROR(eError, pComponentPrivate->dbg, OMX_PRDSP4,
   3442                           "Failed to allocate DSP resources.\n");
   3443 
   3444     OMX_CONF_CIRCULAR_BUFFER_ADD_NODE(pComponentPrivate,
   3445                                       pComponentPrivate->sCircularBuffer);
   3446     pCompPort->nBufferCnt++;
   3447     if(pCompPort->nBufferCnt == pPortDef->nBufferCountActual)
   3448     {
   3449 #ifndef UNDER_CE
   3450         pthread_mutex_lock(&pComponentPrivate->videoe_mutex_app);
   3451         pPortDef->bPopulated = OMX_TRUE;
   3452         pthread_cond_signal(&pComponentPrivate->populate_cond);
   3453         pthread_mutex_unlock(&pComponentPrivate->videoe_mutex_app);
   3454 #else
   3455         pPortDef->bPopulated = OMX_TRUE;
   3456         OMX_SignalEvent(&(pComponentPrivate->InLoaded_event));
   3457 #endif
   3458     }
   3459 OMX_CONF_CMD_BAIL:
   3460     return eError;
   3461 }
   3462 
   3463 /*----------------------------------------------------------------------------*/
   3464 /**
   3465   *  FreeBuffer()
   3466   *
   3467   *
   3468   *
   3469   *
   3470   * @param
   3471   * @param
   3472   * @param
   3473   *
   3474   * @retval OMX_NoError              Success, ready to roll
   3475   *         OMX_Error_BadParameter   The input parameter pointer is null
   3476   **/
   3477 /*----------------------------------------------------------------------------*/
   3478 
   3479 OMX_ERRORTYPE FreeBuffer(OMX_IN  OMX_HANDLETYPE hComponent,
   3480                          OMX_IN  OMX_U32 nPortIndex,
   3481                          OMX_IN  OMX_BUFFERHEADERTYPE* pBufHead)
   3482 {
   3483     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   3484     OMX_COMPONENTTYPE* pHandle                  = NULL;
   3485     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   3486     char* pTemp                                 = NULL;
   3487     VIDEOENC_PORT_TYPE* pCompPort               = NULL;
   3488     OMX_PARAM_PORTDEFINITIONTYPE* pPortDef      = NULL;
   3489     OMX_PARAM_PORTDEFINITIONTYPE* pPortDefOut   = NULL;
   3490     OMX_VIDEO_CODINGTYPE eCompressionFormat     = -1;
   3491     OMX_U32 nBufferCnt                          = -1;
   3492     OMX_U8 nCount                               = 0;
   3493     VIDENC_BUFFER_PRIVATE* pBufferPrivate       = NULL;
   3494     VIDENC_NODE* pMemoryListHead                = NULL;
   3495 
   3496     OMX_CONF_CHECK_CMD(hComponent, ((OMX_COMPONENTTYPE *) hComponent)->pComponentPrivate, 1);
   3497 
   3498     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   3499     OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, pBufHead, 1, 1);
   3500     /*OMX_CONF_CHK_VERSION(pBufHead, OMX_BUFFERHEADERTYPE, eError); Makes CONF_FlushTest Fail*/
   3501 
   3502     pHandle = (OMX_COMPONENTTYPE*)hComponent;
   3503 
   3504     pMemoryListHead = pComponentPrivate->pMemoryListHead;
   3505     pCompPort = pComponentPrivate->pCompPort[nPortIndex];
   3506     pPortDefOut = pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pPortDef;
   3507     pPortDef = pComponentPrivate->pCompPort[nPortIndex]->pPortDef;
   3508     nBufferCnt = pComponentPrivate->pCompPort[nPortIndex]->nBufferCnt;
   3509 
   3510     eCompressionFormat = pPortDefOut->format.video.eCompressionFormat;
   3511 
   3512     if (nPortIndex == VIDENC_INPUT_PORT)
   3513     {
   3514         pBufferPrivate = pBufHead->pInputPortPrivate;
   3515         if (pBufferPrivate != NULL)
   3516         {
   3517             if (pBufferPrivate->pUalgParam != NULL)
   3518             {
   3519                 pTemp = (char*)pBufferPrivate->pUalgParam;
   3520                 pTemp -= 128;
   3521                 if (eCompressionFormat == OMX_VIDEO_CodingAVC)
   3522                 {
   3523                     pBufferPrivate->pUalgParam = (H264VE_GPP_SN_UALGInputParams*)pTemp;
   3524                 }
   3525                 else if (eCompressionFormat == OMX_VIDEO_CodingMPEG4 ||
   3526                          eCompressionFormat ==OMX_VIDEO_CodingH263)
   3527                 {
   3528                     pBufferPrivate->pUalgParam = (MP4VE_GPP_SN_UALGInputParams*)pTemp;
   3529                 }
   3530             }
   3531             VIDENC_FREE(pBufferPrivate->pUalgParam, pMemoryListHead, pComponentPrivate->dbg);
   3532         }
   3533     }
   3534     else if (nPortIndex == VIDENC_OUTPUT_PORT)
   3535     {
   3536         pBufferPrivate = pBufHead->pOutputPortPrivate;
   3537         if (pBufferPrivate != NULL)
   3538         {
   3539             if (pBufferPrivate->pUalgParam != NULL)
   3540             {
   3541                 pTemp = (char*)pBufferPrivate->pUalgParam;
   3542                 pTemp -= 128;
   3543                 if (eCompressionFormat == OMX_VIDEO_CodingAVC)
   3544                 {
   3545                     pBufferPrivate->pUalgParam = (H264VE_GPP_SN_UALGOutputParams*)pTemp;
   3546                 }
   3547                 else if (eCompressionFormat == OMX_VIDEO_CodingMPEG4 ||
   3548                          eCompressionFormat ==OMX_VIDEO_CodingH263)
   3549                 {
   3550                     pBufferPrivate->pUalgParam = (MP4VE_GPP_SN_UALGOutputParams*)pTemp;
   3551                 }
   3552             }
   3553             VIDENC_FREE(pBufferPrivate->pUalgParam, pMemoryListHead, pComponentPrivate->dbg);
   3554         }
   3555     }
   3556     else
   3557     {
   3558         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadPortIndex,
   3559                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   3560                                "Freeing buffer on invalid port index.\n");
   3561     }
   3562 
   3563     if (pPortDef->bEnabled && pComponentPrivate->eState != OMX_StateIdle && pComponentPrivate->eState != OMX_StateInvalid)
   3564     {
   3565         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   3566                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   3567                                "Freeing buffer in invalid state or on a disabled port.\n");
   3568     }
   3569     OMX_CONF_CHECK_CMD(pBufferPrivate, 1, 1);
   3570 
   3571 #ifdef __PERF_INSTRUMENTATION__
   3572     PERF_SendingBuffer(pComponentPrivate->pPERF,
   3573                        pBufHead->pBuffer, pBufHead->nAllocLen,
   3574                        (pBufferPrivate->bAllocByComponent == OMX_TRUE) ?
   3575                        PERF_ModuleMemory :
   3576                        PERF_ModuleHLMM);
   3577 #endif
   3578 
   3579     if (pBufferPrivate->bAllocByComponent == OMX_TRUE)
   3580     {
   3581         if (pBufHead->pBuffer != NULL)
   3582         {
   3583             pBufHead->pBuffer -= 128;
   3584             pBufHead->pBuffer = (unsigned char*)pBufHead->pBuffer;
   3585             VIDENC_FREE(pBufHead->pBuffer, pMemoryListHead, pComponentPrivate->dbg);
   3586         }
   3587     }
   3588 
   3589     while (1)
   3590     {
   3591         if (pCompPort->pBufferPrivate[nCount]->pBufferHdr == pBufHead)
   3592         {
   3593             break;
   3594         }
   3595         nCount++;
   3596     }
   3597 
   3598     if (pBufHead != NULL)
   3599     {
   3600         VIDENC_FREE(pBufHead, pMemoryListHead, pComponentPrivate->dbg);
   3601     }
   3602 
   3603     OMX_CONF_CIRCULAR_BUFFER_DELETE_NODE(pComponentPrivate,
   3604                                          pComponentPrivate->sCircularBuffer);
   3605     pCompPort->nBufferCnt--;
   3606     if (pCompPort->nBufferCnt == 0)
   3607     {
   3608 
   3609 #ifndef UNDER_CE
   3610        pthread_mutex_lock(&pComponentPrivate->videoe_mutex_app);
   3611        pPortDef->bPopulated = OMX_FALSE;
   3612        pthread_cond_signal(&pComponentPrivate->unpopulate_cond);
   3613        pthread_mutex_unlock(&pComponentPrivate->videoe_mutex_app);
   3614 #else
   3615        pPortDef->bPopulated = OMX_FALSE;
   3616        OMX_SignalEvent(&(pComponentPrivate->InIdle_event));
   3617 #endif
   3618     }
   3619 
   3620     if (pPortDef->bEnabled &&
   3621         (pComponentPrivate->eState == OMX_StateIdle ||
   3622          pComponentPrivate->eState == OMX_StateExecuting  ||
   3623          pComponentPrivate->eState == OMX_StatePause))
   3624     {
   3625 #ifdef  __KHRONOS_CONF__
   3626          if(!pComponentPrivate->bPassingIdleToLoaded)
   3627 #endif
   3628              OMX_VIDENC_EVENT_HANDLER(pComponentPrivate,
   3629                                       OMX_EventError,
   3630                                       OMX_ErrorPortUnpopulated,
   3631                                       nPortIndex,
   3632                                       NULL);
   3633     }
   3634 OMX_CONF_CMD_BAIL:
   3635     return eError;
   3636 }
   3637 
   3638 /*----------------------------------------------------------------------------*/
   3639 /**
   3640   *  AllocateBuffer()
   3641   *
   3642   *
   3643   *
   3644   *
   3645   * @param
   3646   * @param
   3647   * @param
   3648   *
   3649   * @retval OMX_NoError              Success, ready to roll
   3650   *         OMX_Error_BadParameter   The input parameter pointer is null
   3651   **/
   3652 /*----------------------------------------------------------------------------*/
   3653 
   3654 OMX_ERRORTYPE AllocateBuffer(OMX_IN OMX_HANDLETYPE hComponent,
   3655                              OMX_INOUT OMX_BUFFERHEADERTYPE** pBufHead,
   3656                              OMX_IN OMX_U32 nPortIndex,
   3657                              OMX_IN OMX_PTR pAppPrivate,
   3658                              OMX_IN OMX_U32 nSizeBytes)
   3659 {
   3660     OMX_COMPONENTTYPE* pHandle                  = NULL;
   3661     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   3662     OMX_PARAM_PORTDEFINITIONTYPE* pPortDef      = NULL;
   3663     VIDEOENC_PORT_TYPE* pCompPort               = NULL;
   3664     OMX_HANDLETYPE hTunnelComponent             = NULL;
   3665     VIDENC_BUFFER_PRIVATE* pBufferPrivate       = NULL;
   3666     OMX_U32 nBufferCnt                          = -1;
   3667     OMX_ERRORTYPE eError                        = OMX_ErrorNone;
   3668     VIDENC_NODE* pMemoryListHead                = NULL;
   3669 
   3670     OMX_CONF_CHECK_CMD(hComponent, ((OMX_COMPONENTTYPE *) hComponent)->pComponentPrivate, 1);
   3671 
   3672     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   3673     OMX_DBG_CHECK_CMD(pComponentPrivate->dbg, pBufHead, 1, 1);
   3674 
   3675     pHandle = (OMX_COMPONENTTYPE*)hComponent;
   3676 
   3677     if (nPortIndex == VIDENC_INPUT_PORT)
   3678     {
   3679        pPortDef = pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pPortDef;
   3680     }
   3681     else if (nPortIndex == VIDENC_OUTPUT_PORT)
   3682     {
   3683         pPortDef = pComponentPrivate->pCompPort[VIDENC_OUTPUT_PORT]->pPortDef;
   3684     }
   3685     else
   3686     {
   3687         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter,
   3688                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   3689                                "Allocating buffer on invalid port index.\n");
   3690     }
   3691     if (!pPortDef->bEnabled)
   3692     {
   3693         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorIncorrectStateOperation,
   3694                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   3695                                "Allocating buffer on disabled port.\n");
   3696     }
   3697 
   3698     if (pPortDef->bPopulated)
   3699     {
   3700         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter,
   3701                                pComponentPrivate->dbg, OMX_PRBUFFER4,
   3702                                "Allocating duplicate buffer\n");
   3703     }
   3704     if (nSizeBytes < pPortDef->nBufferSize)
   3705     {
   3706         OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter,
   3707             pComponentPrivate->dbg, OMX_PRBUFFER4,
   3708             "Allocating invalid size buffer: nBufferSize: %lu nSizeBytes: %lu\n", pPortDef->nBufferSize, nSizeBytes);
   3709     }
   3710 
   3711     pMemoryListHead = pComponentPrivate->pMemoryListHead;
   3712     pCompPort = pComponentPrivate->pCompPort[nPortIndex];
   3713     nBufferCnt = pComponentPrivate->pCompPort[nPortIndex]->nBufferCnt;
   3714     hTunnelComponent = pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->hTunnelComponent;
   3715     pBufferPrivate = pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCnt];
   3716 
   3717     VIDENC_MALLOC(*pBufHead,
   3718                   sizeof(OMX_BUFFERHEADERTYPE),
   3719                   OMX_BUFFERHEADERTYPE,
   3720                   pMemoryListHead, pComponentPrivate->dbg);
   3721 
   3722     if (nPortIndex == VIDENC_INPUT_PORT)
   3723     {
   3724         (*pBufHead)->nInputPortIndex  = VIDENC_INPUT_PORT;
   3725         (*pBufHead)->nOutputPortIndex = OMX_NOPORT;
   3726     }
   3727     else
   3728     {
   3729         (*pBufHead)->nInputPortIndex  = OMX_NOPORT;
   3730         (*pBufHead)->nOutputPortIndex = VIDENC_OUTPUT_PORT;
   3731     }
   3732 
   3733     VIDENC_MALLOC((*pBufHead)->pBuffer,
   3734                   nSizeBytes + 256,
   3735                   OMX_U8,
   3736                   pMemoryListHead, pComponentPrivate->dbg);
   3737     ((*pBufHead)->pBuffer) += 128;
   3738     ((*pBufHead)->pBuffer) = (unsigned char*)((*pBufHead)->pBuffer);
   3739     (*pBufHead)->nSize       = sizeof(OMX_BUFFERHEADERTYPE);
   3740     (*pBufHead)->nVersion    = pPortDef->nVersion;
   3741     (*pBufHead)->pAppPrivate = pAppPrivate;
   3742     (*pBufHead)->nAllocLen   = nSizeBytes;
   3743     pBufferPrivate->pBufferHdr = *pBufHead;
   3744 
   3745 #ifdef __PERF_INSTRUMENTATION__
   3746     PERF_ReceivedBuffer(pComponentPrivate->pPERF,
   3747                         (*pBufHead)->pBuffer, nSizeBytes,
   3748                         PERF_ModuleMemory);
   3749 #endif
   3750 
   3751     if (nPortIndex == VIDENC_INPUT_PORT)
   3752     {
   3753         pBufferPrivate->pBufferHdr->pInputPortPrivate = pBufferPrivate;
   3754         if(!pComponentPrivate->nInBufferSize || (pComponentPrivate->nInBufferSize > nSizeBytes)) {
   3755             pComponentPrivate->nInBufferSize = nSizeBytes;
   3756         }
   3757     }
   3758     else
   3759     {
   3760         pBufferPrivate->pBufferHdr->pOutputPortPrivate = pBufferPrivate;
   3761         if(!pComponentPrivate->nOutBufferSize || (pComponentPrivate->nOutBufferSize > nSizeBytes)) {
   3762             pComponentPrivate->nOutBufferSize = nSizeBytes;
   3763         }
   3764     }
   3765     pBufferPrivate->bAllocByComponent = OMX_TRUE;
   3766 
   3767     if (hTunnelComponent != NULL)
   3768     {
   3769         pBufferPrivate->eBufferOwner = VIDENC_BUFFER_WITH_TUNNELEDCOMP;
   3770     }
   3771     else
   3772     {
   3773         pBufferPrivate->eBufferOwner = VIDENC_BUFFER_WITH_CLIENT;
   3774     }
   3775 
   3776     eError = OMX_VIDENC_Allocate_DSPResources(pComponentPrivate, nPortIndex);
   3777     OMX_DBG_BAIL_IF_ERROR(eError, pComponentPrivate->dbg, OMX_PRDSP4,
   3778                           "Failed to allocate DSP resources.\n");
   3779 
   3780     OMX_CONF_CIRCULAR_BUFFER_ADD_NODE(pComponentPrivate,
   3781                                       pComponentPrivate->sCircularBuffer);
   3782 
   3783     pCompPort->nBufferCnt++;
   3784     if(pCompPort->nBufferCnt == pPortDef->nBufferCountActual)
   3785     {
   3786 #ifndef UNDER_CE
   3787         pthread_mutex_lock(&pComponentPrivate->videoe_mutex_app);
   3788         pPortDef->bPopulated = OMX_TRUE;
   3789         pthread_cond_signal(&pComponentPrivate->populate_cond);
   3790         pthread_mutex_unlock(&pComponentPrivate->videoe_mutex_app);
   3791 #else
   3792         pPortDef->bPopulated = OMX_TRUE;
   3793         OMX_SignalEvent(&(pComponentPrivate->InLoaded_event));
   3794 #endif
   3795     }
   3796 
   3797 OMX_CONF_CMD_BAIL:
   3798     return eError;
   3799 }
   3800 
   3801 
   3802 /*----------------------------------------------------------------------------*/
   3803 /**
   3804   *  VerifyTunnelConnection()
   3805   *
   3806   *
   3807   *
   3808   *
   3809   * @param
   3810   * @param
   3811   * @param
   3812   *
   3813   * @retval OMX_NoError              Success, ready to roll
   3814   *         OMX_Error_BadParameter   The input parameter pointer is null
   3815   **/
   3816 /*----------------------------------------------------------------------------*/
   3817 
   3818 OMX_ERRORTYPE VerifyTunnelConnection(VIDEOENC_PORT_TYPE* pPort,
   3819                                      OMX_HANDLETYPE hTunneledComp,
   3820                                      OMX_PARAM_PORTDEFINITIONTYPE* pPortDef,
   3821                                      struct OMX_TI_Debug *dbg)
   3822 {
   3823    OMX_PARAM_PORTDEFINITIONTYPE sPortDef;
   3824    OMX_ERRORTYPE eError = OMX_ErrorNone;
   3825 
   3826     OMX_DBG_CHECK_CMD(*dbg, pPort, hTunneledComp, pPortDef);
   3827 
   3828    sPortDef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
   3829    sPortDef.nVersion.s.nVersionMajor = 0x1;
   3830    sPortDef.nVersion.s.nVersionMinor = 0x0;
   3831    sPortDef.nPortIndex = pPort->nTunnelPort;
   3832 
   3833    eError = OMX_GetParameter(hTunneledComp,
   3834                              OMX_IndexParamPortDefinition,
   3835                              &sPortDef);
   3836    if (eError != OMX_ErrorNone)
   3837    {
   3838        return eError;
   3839    }
   3840 
   3841    switch (pPortDef->eDomain)
   3842    {
   3843        case OMX_PortDomainOther:
   3844            if (sPortDef.format.other.eFormat!= pPortDef->format.other.eFormat)
   3845            {
   3846                pPort->hTunnelComponent = 0;
   3847                pPort->nTunnelPort      = 0;
   3848                return OMX_ErrorPortsNotCompatible;
   3849            }
   3850            break;
   3851        case OMX_PortDomainAudio:
   3852            if (sPortDef.format.audio.eEncoding != pPortDef->format.audio.eEncoding)
   3853            {
   3854                pPort->hTunnelComponent = 0;
   3855                pPort->nTunnelPort      = 0;
   3856                return OMX_ErrorPortsNotCompatible;
   3857            }
   3858            break;
   3859        case OMX_PortDomainVideo:
   3860            if (sPortDef.format.video.eCompressionFormat != pPortDef->format.video.eCompressionFormat)
   3861            {
   3862                pPort->hTunnelComponent = 0;
   3863                pPort->nTunnelPort      = 0;
   3864                return OMX_ErrorPortsNotCompatible;
   3865            }
   3866            break;
   3867        case OMX_PortDomainImage:
   3868            if (sPortDef.format.image.eCompressionFormat != pPortDef->format.image.eCompressionFormat)
   3869            {
   3870                pPort->hTunnelComponent = 0;
   3871                pPort->nTunnelPort      = 0;
   3872                return OMX_ErrorPortsNotCompatible;
   3873            }
   3874            break;
   3875        default:
   3876            pPort->hTunnelComponent = 0;
   3877            pPort->nTunnelPort      = 0;
   3878            return OMX_ErrorPortsNotCompatible;
   3879    }
   3880 
   3881 OMX_CONF_CMD_BAIL:
   3882     return eError;
   3883 }
   3884 
   3885 /*-------------------------------------------------------------------*/
   3886 /**
   3887   * IsTIOMXComponent()
   3888   * Check if the component is TI component.
   3889   * @param hTunneledComp Component Tunnel Pipe
   3890   * @retval OMX_TRUE   Input is a TI component.
   3891   *             OMX_FALSE  Input is a not a TI component.
   3892   *
   3893   **/
   3894 /*-------------------------------------------------------------------*/
   3895 
   3896 static OMX_BOOL IsTIOMXComponent(OMX_HANDLETYPE hComp, struct OMX_TI_Debug *dbg)
   3897 {
   3898 
   3899     OMX_ERRORTYPE eError = OMX_ErrorNone;
   3900     OMX_STRING pTunnelcComponentName = NULL;
   3901     OMX_VERSIONTYPE* pTunnelComponentVersion = NULL;
   3902     OMX_VERSIONTYPE* pSpecVersion = NULL;
   3903     OMX_UUIDTYPE* pComponentUUID = NULL;
   3904     char *pSubstring = NULL;
   3905     OMX_BOOL bResult = OMX_TRUE;
   3906 
   3907     pTunnelcComponentName = malloc(128);
   3908 
   3909     if (pTunnelcComponentName == NULL)
   3910     {
   3911         eError = OMX_ErrorInsufficientResources;
   3912         OMX_TRACE4(*dbg, "Error in video encoder OMX_ErrorInsufficientResources %d\n",__LINE__);
   3913         goto EXIT;
   3914     }
   3915 
   3916     pTunnelComponentVersion = malloc(sizeof(OMX_VERSIONTYPE));
   3917     if (pTunnelComponentVersion == NULL)
   3918     {
   3919         OMX_TRACE4(*dbg, "Error in video encoder OMX_ErrorInsufficientResources %d\n",__LINE__);
   3920         eError = OMX_ErrorInsufficientResources;
   3921         goto EXIT;
   3922     }
   3923 
   3924     pSpecVersion = malloc(sizeof(OMX_VERSIONTYPE));
   3925     if (pSpecVersion == NULL)
   3926     {
   3927         OMX_TRACE4(*dbg, "Error in video encoder OMX_ErrorInsufficientResources %d\n",__LINE__);
   3928         eError = OMX_ErrorInsufficientResources;
   3929         goto EXIT;
   3930     }
   3931 
   3932     pComponentUUID = malloc(sizeof(OMX_UUIDTYPE));
   3933     if (pComponentUUID == NULL)
   3934     {
   3935         OMX_TRACE4(*dbg, "Error in video encoder OMX_ErrorInsufficientResources %d\n",__LINE__);
   3936         eError = OMX_ErrorInsufficientResources;
   3937         goto EXIT;
   3938     }
   3939 
   3940     eError = OMX_GetComponentVersion (hComp, pTunnelcComponentName, pTunnelComponentVersion, pSpecVersion, pComponentUUID);
   3941 
   3942     /* Check if tunneled component is a TI component */
   3943     pSubstring = strstr(pTunnelcComponentName, "OMX.TI.");
   3944     if (pSubstring == NULL)
   3945     {
   3946         bResult = OMX_FALSE;
   3947     }
   3948 
   3949 EXIT:
   3950     free(pTunnelcComponentName);
   3951     free(pTunnelComponentVersion);
   3952     free(pSpecVersion);
   3953     free(pComponentUUID);
   3954 
   3955     return bResult;
   3956 } /* End of IsTIOMXComponent */
   3957 
   3958 
   3959 
   3960 
   3961 /*----------------------------------------------------------------------------*/
   3962 /**
   3963   *  ComponentTunnelRequest() Sets application callbacks to the component
   3964   *
   3965   * This method will update application callbacks
   3966   * the application.
   3967   *
   3968   * @param pComp         handle for this instance of the component
   3969   * @param pCallBacks    application callbacks
   3970   * @param ptr
   3971   *
   3972   * @retval OMX_NoError              Success, ready to roll
   3973   *         OMX_Error_BadParameter   The input parameter pointer is null
   3974   **/
   3975 /*----------------------------------------------------------------------------*/
   3976 
   3977 OMX_ERRORTYPE ComponentTunnelRequest(OMX_IN  OMX_HANDLETYPE hComponent,
   3978                                      OMX_IN  OMX_U32 nPort,
   3979                                      OMX_IN  OMX_HANDLETYPE hTunneledComp,
   3980                                      OMX_IN  OMX_U32 nTunneledPort,
   3981                                      OMX_INOUT OMX_TUNNELSETUPTYPE* pTunnelSetup)
   3982 {
   3983     OMX_ERRORTYPE eError       = OMX_ErrorNone;
   3984     OMX_COMPONENTTYPE* pHandle = (OMX_COMPONENTTYPE*)hComponent;
   3985     VIDENC_COMPONENT_PRIVATE* pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate;
   3986     OMX_PARAM_BUFFERSUPPLIERTYPE sBufferSupplier;
   3987     VIDEOENC_PORT_TYPE* pPort = pComponentPrivate->pCompPort[nPort];
   3988     if (pTunnelSetup == NULL || hTunneledComp == 0)
   3989     {
   3990         /* cancel previous tunnel */
   3991         pPort->hTunnelComponent = 0;
   3992         pPort->nTunnelPort = 0;
   3993         pPort->eSupplierSetting = OMX_BufferSupplyUnspecified;
   3994     }
   3995     else
   3996     {
   3997         pHandle = (OMX_COMPONENTTYPE*)hComponent;
   3998         if (!pHandle->pComponentPrivate)
   3999         {
   4000             OMX_CONF_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter);
   4001         }
   4002         pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate;
   4003         pPort = pComponentPrivate->pCompPort[nPort];
   4004 
   4005         if (pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pPortDef->eDir != OMX_DirInput &&
   4006             pComponentPrivate->pCompPort[VIDENC_INPUT_PORT]->pPortDef->eDir != OMX_DirOutput)
   4007         {
   4008             return OMX_ErrorBadParameter;
   4009         }
   4010 
   4011         /* Check if the other component is developed by TI */
   4012         if (IsTIOMXComponent(hTunneledComp, &pComponentPrivate->dbg) != OMX_TRUE)
   4013         {
   4014             eError = OMX_ErrorTunnelingUnsupported;
   4015             goto OMX_CONF_CMD_BAIL;
   4016         }
   4017         pPort->hTunnelComponent = hTunneledComp;
   4018         pPort->nTunnelPort = nTunneledPort;
   4019 
   4020         if (pPort->pPortDef->eDir == OMX_DirOutput)
   4021         {
   4022             /* Component is the output (source of data) */
   4023             pTunnelSetup->eSupplier = pPort->eSupplierSetting;
   4024         }
   4025         else
   4026         {
   4027             /* Component is the input (sink of data) */
   4028             eError = VerifyTunnelConnection(pPort,
   4029                                             hTunneledComp,
   4030                                             pPort->pPortDef,
   4031                                             &pComponentPrivate->dbg);
   4032             if(OMX_ErrorNone != eError)
   4033             {
   4034                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorPortsNotCompatible,
   4035                                        pComponentPrivate->dbg, OMX_PRCOMM3,
   4036                                        "VerifyTunnelConnection failed.\n");
   4037             }
   4038 
   4039             /* If specified obey output port's preferences. Otherwise choose output */
   4040             pPort->eSupplierSetting = pTunnelSetup->eSupplier;
   4041             if (OMX_BufferSupplyUnspecified == pPort->eSupplierSetting)
   4042             {
   4043                 pPort->eSupplierSetting = pTunnelSetup->eSupplier = OMX_BufferSupplyOutput;
   4044             }
   4045 
   4046             /* Tell the output port who the supplier is */
   4047             sBufferSupplier.nSize = sizeof(sBufferSupplier);
   4048             sBufferSupplier.nVersion.s.nVersionMajor = 0x1;
   4049             sBufferSupplier.nVersion.s.nVersionMinor = 0x0;
   4050             sBufferSupplier.nPortIndex = nTunneledPort;
   4051             sBufferSupplier.eBufferSupplier = pPort->eSupplierSetting;
   4052 
   4053             eError = OMX_SetParameter(hTunneledComp,
   4054                                       OMX_IndexParamCompBufferSupplier,
   4055                                       &sBufferSupplier);
   4056             eError = OMX_GetParameter(hTunneledComp,
   4057                                       OMX_IndexParamCompBufferSupplier,
   4058                                       &sBufferSupplier);
   4059 
   4060             if (sBufferSupplier.eBufferSupplier != pPort->eSupplierSetting)
   4061             {
   4062                 OMX_DBG_SET_ERROR_BAIL(eError, OMX_ErrorPortsNotCompatible,
   4063                                        pComponentPrivate->dbg, OMX_PRCOMM3,
   4064                                        "SetParameter: OMX_IndexParamCompBufferSupplier failed to change setting.\n");
   4065             }
   4066         }
   4067     }
   4068 OMX_CONF_CMD_BAIL:
   4069     return eError;
   4070 }
   4071 
   4072 #ifdef __KHRONOS_CONF_1_1__
   4073 
   4074 /*----------------------------------------------------------------------------*/
   4075 /**
   4076   *  ComponentRoleEnum()
   4077   *
   4078   *
   4079   * @param pComp         handle for this instance of the component
   4080   *
   4081   * @retval OMX_NoError              Success, ready to roll
   4082   *         OMX_Error_BadParameter   The input parameter pointer is null
   4083   **/
   4084 /*----------------------------------------------------------------------------*/
   4085 static OMX_ERRORTYPE ComponentRoleEnum(OMX_IN OMX_HANDLETYPE hComponent,
   4086                                        OMX_OUT OMX_U8 *cRole,
   4087                                        OMX_IN OMX_U32 nIndex)
   4088 {
   4089     VIDENC_COMPONENT_PRIVATE *pComponentPrivate;
   4090     OMX_ERRORTYPE eError = OMX_ErrorNone;
   4091 
   4092     if (hComponent==NULL)
   4093     {
   4094         goto OMX_CONF_CMD_BAIL;
   4095         eError= OMX_ErrorBadParameter;
   4096         }
   4097 
   4098     pComponentPrivate = (VIDENC_COMPONENT_PRIVATE*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   4099 
   4100     if(nIndex == 0)
   4101     {
   4102       strncpy((char*)cRole, (char *)pComponentPrivate->componentRole.cRole, sizeof(OMX_U8) * OMX_MAX_STRINGNAME_SIZE - 1);
   4103     }
   4104     else
   4105     {
   4106       eError = OMX_ErrorNoMore;
   4107     }
   4108 
   4109 OMX_CONF_CMD_BAIL:
   4110     return eError;
   4111 };
   4112 #endif
   4113