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_VPP_Utils.c
     30 *
     31 * This file implements OMX Component for PCM decoder that
     32 * is fully compliant with the OMX specification 1.1.
     33 *
     34 * @path  $(CSLPATH)\
     35 *
     36 * @rev  1.0
     37 */
     38 /* ----------------------------------------------------------------------------
     39 *!
     40 *! Revision History
     41 *! ===================================
     42 *! 13-Dec-2005 mf:  Initial Version. Change required per OMAPSWxxxxxxxxx
     43 *! to provide _________________.
     44 *!
     45 *!
     46 *! 13-Dec-2005 mf:
     47 *! This is newest file
     48 * =========================================================================== */
     49 
     50 
     51 /* ------compilation control switches -------------------------*/
     52 /****************************************************************
     53 *  INCLUDE FILES
     54 ****************************************************************/
     55 /* ----- system and platform files ----------------------------*/
     56 
     57 #ifdef UNDER_CE
     58 #include <windows.h>
     59 #include <oaf_osal.h>
     60 #include <omx_core.h>
     61 #include <stdlib.h>
     62 #else
     63 #include <unistd.h>
     64 #include <sys/types.h>
     65 #include <malloc.h>
     66 #include <memory.h>
     67 #include <sys/types.h>
     68 #include <sys/stat.h>
     69 #include <fcntl.h>
     70 #include <dlfcn.h>
     71 #include <sched.h>
     72 #include <pthread.h>
     73 #endif
     74 
     75 #include <dbapi.h>
     76 #include <string.h>
     77 #include <stdio.h>
     78 
     79 
     80 #include "LCML_DspCodec.h"
     81 #include "OMX_VPP.h"
     82 #include "OMX_VPP_Utils.h"
     83 #include "VPPsocket_ti.h"
     84 #include "OMX_VPP_CompThread.h"
     85 #include <OMX_Component.h>
     86 #include "usn.h"
     87 
     88 #ifdef RESOURCE_MANAGER_ENABLED
     89 #include <ResourceManagerProxyAPI.h>
     90 #endif
     91 
     92 #define OMX_VPP_STRNCPY(dst, src, size)         strncpy(dst, src, size)
     93 #define OMX_VPP_ITOA(value, buffer)    sprintf((char*)buffer, "%d", value);
     94 #define OMX_VPP_MAX(x, y)                       ((x) > (y) ? (x) : (y))
     95 #ifdef UNDER_CE
     96 HINSTANCE g_hLcmlDllHandle = NULL;
     97 #endif
     98 
     99 #ifdef RESOURCE_MANAGER_ENABLED
    100 void ResourceManagerCallback(RMPROXY_COMMANDDATATYPE cbData);
    101 #endif
    102 
    103 /* ========================================================================== */
    104 /**
    105 * @
    106 *
    107 * @param
    108 * @param
    109 *
    110 * @pre
    111 *
    112 * @post
    113 *
    114 * @return none
    115 */
    116 /* ========================================================================== */
    117 OMX_ERRORTYPE VPP_IsValidBuffer(OMX_BUFFERHEADERTYPE *pBufHeader,
    118                                 VPP_COMPONENT_PRIVATE *pComponentPrivate,
    119                                 OMX_U32 pIndex,
    120                                 OMX_U32 *pCount)
    121 {
    122     OMX_U32 nCount = 0;
    123     OMX_ERRORTYPE eError = OMX_ErrorNone;
    124 
    125     VPP_DPRINT("Entering Valid buffer -- %lu\n ",pIndex);
    126 
    127     while (pComponentPrivate->sCompPorts[pIndex].pVPPBufHeader[nCount].pBufHeader != pBufHeader)
    128     {
    129         nCount ++;
    130         if (nCount >= NUM_OF_VPP_BUFFERS) {
    131             OMX_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter);
    132         }
    133     }
    134     *pCount = nCount;
    135     VPP_DPRINT("Exiting Valid buffer -- %lu\n ",nCount);
    136 
    137 EXIT:
    138     return eError;
    139 
    140 }
    141 
    142 
    143 
    144 OMX_ERRORTYPE VPP_GetPortDefFromBufHeader(OMX_BUFFERHEADERTYPE *pBufHeader,
    145                                         OMX_PARAM_PORTDEFINITIONTYPE **portDef )
    146 {
    147     OMX_ERRORTYPE eError = OMX_ErrorNone;
    148 
    149     if ((pBufHeader->nOutputPortIndex != OMX_VPP_RGB_OUTPUT_PORT) &&
    150             (pBufHeader->nOutputPortIndex != OMX_VPP_YUV_OUTPUT_PORT) &&
    151             ((pBufHeader->nInputPortIndex == OMX_VPP_INPUT_PORT) ||
    152             (pBufHeader->nInputPortIndex == OMX_VPP_INPUT_OVERLAY_PORT ))){   /* input port */
    153 
    154         *portDef = pBufHeader->pInputPortPrivate;
    155 
    156     }
    157     else if ((pBufHeader->nOutputPortIndex == OMX_VPP_RGB_OUTPUT_PORT) ||
    158             (pBufHeader->nOutputPortIndex == OMX_VPP_YUV_OUTPUT_PORT)){ /* output port */
    159 
    160         *portDef = pBufHeader->pOutputPortPrivate;
    161 
    162     }
    163     else {
    164         eError = OMX_ErrorBadParameter;
    165     }
    166 
    167     return eError;
    168 }
    169 
    170 
    171 
    172 OMX_ERRORTYPE VPP_Fill_LCMLInitParams(OMX_HANDLETYPE pComponent, OMX_U16 arr[], LCML_DSP *plcml_Init)
    173 {
    174 
    175     OMX_ERRORTYPE eError = OMX_ErrorNone;
    176     OMX_U32 nIpBuf,nIpBufSize,nOpBuf,nOpBufSize;
    177     char  valueStr[52]; /*Changed length*/
    178     OMX_U32 Input_FrameWidth;
    179     OMX_U32 Output_FrameWidth;
    180     OMX_U16 OutputRGB_Format;
    181     OMX_U16 Input_FrameFormat;
    182     OMX_U16 Output_FrameFormat;
    183     OMX_U16 Overlay;
    184     OMX_U16 Alpha = 0; /*Not implemented at OMX level*/
    185     OMX_U16 ParamSize = 0;
    186     char * pcSNArgs = NULL;
    187     OMX_U8 *pTemp = NULL;
    188     int index;
    189     VPP_COMPONENT_PRIVATE *pComponentPrivate = NULL;
    190     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    191 
    192     if (!pHandle) {
    193         eError=OMX_ErrorBadParameter;
    194         goto EXIT;
    195     }
    196 
    197     pComponentPrivate = (VPP_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
    198 
    199     VPP_DPRINT("VPP::%d :: Entered Fill_LCMLInitParams\n",__LINE__);
    200 
    201     pComponentPrivate->NumofOutputPort = 0;
    202     pComponentPrivate->IsYUVdataout    = 0;
    203     pComponentPrivate->IsRGBdataout    = 0;
    204     pComponentPrivate->IsOverlay       = 0;
    205 
    206     nIpBuf = pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.nBufferCountMin;
    207     nIpBufSize = pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.nBufferSize;
    208 
    209     nOpBuf = OMX_VPP_MAX(pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.nBufferCountMin,
    210     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.nBufferCountMin);
    211     nOpBufSize = OMX_VPP_MAX(pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.nBufferSize,
    212     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.nBufferSize);
    213 
    214     plcml_Init->In_BufInfo.nBuffers      = nIpBuf;
    215     plcml_Init->In_BufInfo.nSize         = nIpBufSize;
    216     plcml_Init->In_BufInfo.DataTrMethod  = DMM_METHOD;
    217     plcml_Init->Out_BufInfo.nBuffers     = nOpBuf;
    218     plcml_Init->Out_BufInfo.nSize        = nOpBufSize;
    219     plcml_Init->Out_BufInfo.DataTrMethod = DMM_METHOD;
    220 
    221     plcml_Init->DeviceInfo.TypeofDevice       = 0;
    222     plcml_Init->DeviceInfo.DspStream          = NULL;
    223     plcml_Init->NodeInfo.nNumOfDLLs           = 3;
    224     plcml_Init->NodeInfo.AllUUIDs[0].uuid     = &VPPNODE_TI_UUID;
    225     strcpy ((char *)plcml_Init->NodeInfo.AllUUIDs[0].DllName, VPP_NODE_DLL);
    226     plcml_Init->NodeInfo.AllUUIDs[0].eDllType = DLL_NODEOBJECT;
    227 
    228     plcml_Init->NodeInfo.AllUUIDs[1].uuid     = &VPPNODE_TI_UUID;
    229     strcpy ((char *)plcml_Init->NodeInfo.AllUUIDs[1].DllName, VPP_NODE_DLL);
    230     plcml_Init->NodeInfo.AllUUIDs[1].eDllType = DLL_DEPENDENT;
    231 
    232     plcml_Init->NodeInfo.AllUUIDs[2].uuid     = (struct DSP_UUID *) &COMMON_TI_UUID;
    233     strcpy ((char *)plcml_Init->NodeInfo.AllUUIDs[2].DllName, USN_DLL_NAME);
    234     plcml_Init->NodeInfo.AllUUIDs[2].eDllType = DLL_DEPENDENT;
    235 
    236     plcml_Init->SegID     = 0;
    237     plcml_Init->Timeout   = -1;
    238     plcml_Init->Alignment = 0;
    239     plcml_Init->Priority = 5;
    240     VPP_DPRINT("priority is %d\n", plcml_Init->Priority);
    241 
    242     plcml_Init->ProfileID = 0;
    243     /*Main input port */
    244     arr[0] = 5; /*# of Streams*/
    245     arr[1] = 0; /*Stream ID*/
    246     arr[2] = 0; /*Stream based input stream*/
    247     arr[3] = NUM_OF_VPP_BUFFERS; /*Number of buffers on input stream*/
    248     /*Overlay input port*/
    249     arr[4] = 1; /*Stream ID*/
    250     arr[5] = 0; /*Stream based input stream*/
    251     arr[6] = NUM_OF_VPP_BUFFERS; /*Number of buffers on input stream*/
    252     /*RGB output port*/
    253     arr[7] = 2; /*Stream ID*/
    254     arr[8] = 0; /*Stream basedoutput stream for RGB data*/
    255     arr[9] = NUM_OF_VPP_BUFFERS; /*Number of buffers on output stream*/
    256     /*YUV output port*/
    257     arr[10] = 3; /*Stream ID*/
    258     arr[11] = 0; /*Stream based output stream for YUV data*/
    259     arr[12] = NUM_OF_VPP_BUFFERS; /*Number of buffers on output stream*/
    260     /*Alpha input port, Not implemented at OMX level*/
    261     arr[13] = 4; /*Stream ID*/
    262     arr[14] = 0; /*Stream based input stream*/
    263     arr[15] = NUM_OF_VPP_BUFFERS; /*Number of buffers on output stream*/
    264 
    265 
    266     pcSNArgs = (char *) (arr + 16);
    267 
    268     Input_FrameWidth = pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.format.video.nFrameWidth;
    269     Output_FrameWidth = OMX_VPP_MAX(pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.format.video.nFrameWidth,
    270     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.format.video.nFrameWidth);
    271     VPP_DPRINT("VPP:: INPPUT WIDTH=  in Fill_LCMLInitParams  %d\n ",Input_FrameWidth);
    272     VPP_DPRINT("VPP:: OUTPUT WIDTH=  in Fill_LCMLInitParams  %d\n ",Output_FrameWidth);
    273 
    274     /* RGB type for output*/
    275     if (pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.bEnabled) {
    276         switch (pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.format.video.eColorFormat)
    277         {
    278         case OMX_COLOR_Format16bitRGB565:
    279             OutputRGB_Format = VGPOP_ERGB16_OUT;
    280             pComponentPrivate->NumofOutputPort++;
    281             pComponentPrivate->IsRGBdataout = 1;
    282             break;
    283 
    284         case OMX_COLOR_Format24bitRGB888:
    285             OutputRGB_Format = VGPOP_ERGB24_OUT;
    286             pComponentPrivate->NumofOutputPort++;
    287             pComponentPrivate->IsRGBdataout = 1;
    288             break;
    289 
    290         case OMX_COLOR_Format32bitARGB8888:
    291             OutputRGB_Format = VGPOP_ERGB32_OUT;
    292             pComponentPrivate->NumofOutputPort++;
    293             pComponentPrivate->IsRGBdataout = 1;
    294             break;
    295 
    296         case OMX_COLOR_Format12bitRGB444:
    297             OutputRGB_Format = VGPOP_ERGB12_OUT;
    298             pComponentPrivate->NumofOutputPort++;
    299             pComponentPrivate->IsRGBdataout = 1;
    300             break;
    301 
    302         case OMX_COLOR_Format8bitRGB332:
    303             OutputRGB_Format = VGPOP_ERGB8_OUT;
    304             pComponentPrivate->NumofOutputPort++;
    305             pComponentPrivate->IsRGBdataout = 1;
    306             break;
    307         case OMX_IndexCustomRGB4ColorFormat:
    308             OutputRGB_Format = VGPOP_ERGB4_OUT;
    309             pComponentPrivate->NumofOutputPort++;
    310             pComponentPrivate->IsRGBdataout = 1;
    311             break;
    312 
    313 
    314         case OMX_COLOR_FormatL8:
    315             OutputRGB_Format = VGPOP_EGRAY8_OUT;
    316             pComponentPrivate->NumofOutputPort++;
    317             pComponentPrivate->IsRGBdataout = 1;
    318             break;
    319 
    320         case OMX_COLOR_FormatL4:
    321             OutputRGB_Format = VGPOP_EGRAY4_OUT;
    322             pComponentPrivate->NumofOutputPort++;
    323             pComponentPrivate->IsRGBdataout = 1;
    324             break;
    325 
    326         case OMX_COLOR_FormatL2:
    327             OutputRGB_Format = VGPOP_EGRAY2_OUT;
    328             pComponentPrivate->NumofOutputPort++;
    329             pComponentPrivate->IsRGBdataout = 1;
    330             break;
    331 
    332         case OMX_COLOR_FormatMonochrome:
    333             OutputRGB_Format = VGPOP_EGRAY1_OUT;
    334             pComponentPrivate->NumofOutputPort++;
    335             pComponentPrivate->IsRGBdataout = 1;
    336             break;
    337 
    338         default:
    339             OutputRGB_Format = VGPOP_ERGB_NONE;
    340             pComponentPrivate->IsRGBdataout = 0;
    341             break;
    342         }
    343     }
    344     else {
    345         OutputRGB_Format = VGPOP_ERGB_NONE;
    346     }
    347 
    348     /* Input frame format*/
    349     switch (pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.format.video.eColorFormat)
    350     {
    351     case OMX_COLOR_FormatYUV420PackedPlanar:
    352         Input_FrameFormat = VGPOP_E420_IN;
    353         break;
    354 
    355     case OMX_COLOR_FormatCbYCrY:
    356         Input_FrameFormat = VGPOP_E422_IN_UY;
    357         break;
    358     case OMX_COLOR_FormatYCbYCr:
    359         Input_FrameFormat = VGPOP_E422_IN_YU;
    360         break;
    361 
    362         /*image formats*/
    363     case OMX_COLOR_Format16bitRGB565:
    364         Input_FrameFormat = VGPOP_ERGB16_IN;
    365         break;
    366     case OMX_COLOR_Format12bitRGB444:
    367         Input_FrameFormat = VGPOP_ERGB12_IN;
    368         break;
    369     case OMX_COLOR_Format8bitRGB332:
    370         Input_FrameFormat = VGPOP_ERGB8_IN;
    371         break;
    372     case OMX_IndexCustomRGB4ColorFormat:
    373         Input_FrameFormat = VGPOP_ERGB4_IN;
    374         break;
    375     case OMX_COLOR_FormatL8:
    376         Input_FrameFormat = VGPOP_EGRAY8_IN;
    377         break;
    378     case OMX_COLOR_FormatL4:
    379         Input_FrameFormat = VGPOP_EGRAY4_IN;
    380         break;
    381     case OMX_COLOR_FormatL2:
    382         Input_FrameFormat = VGPOP_EGRAY2_IN;
    383         break;
    384     case OMX_COLOR_FormatMonochrome:
    385         Input_FrameFormat = VGPOP_EGRAY1_IN;
    386         break;
    387     case OMX_COLOR_Format24bitRGB888:
    388         Input_FrameFormat = VGPOP_ERGB24_IN;
    389         break;
    390     default:
    391         Input_FrameFormat = VGPOP_E420_IN;
    392         VPP_DPRINT("%d :: NOT SUPPORTED INPUT FORMAT setting default as 420 planar",__LINE__);
    393         break;
    394     }
    395 
    396     /* Output YUV frame format*/
    397     if (pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.bEnabled) {
    398         switch (pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.format.video.eColorFormat)
    399         {
    400         case OMX_COLOR_FormatYUV420PackedPlanar:
    401             Output_FrameFormat = VGPOP_E420_OUT;
    402             pComponentPrivate->NumofOutputPort++;
    403             pComponentPrivate->IsYUVdataout = 1;
    404             break;
    405 
    406         case OMX_COLOR_FormatYCbYCr:
    407             Output_FrameFormat = VGPOP_E422_OUT_YU;
    408             pComponentPrivate->NumofOutputPort++;
    409             pComponentPrivate->IsYUVdataout = 1;
    410             break;
    411 
    412         case OMX_COLOR_FormatCbYCrY:
    413             Output_FrameFormat = VGPOP_E422_OUT_UY;
    414             pComponentPrivate->NumofOutputPort++;
    415             pComponentPrivate->IsYUVdataout = 1;
    416             break;
    417 
    418         default:
    419             Output_FrameFormat = VGPOP_EYUV_NONE;
    420             pComponentPrivate->IsYUVdataout=0;
    421             break;
    422         }
    423     }
    424     else {
    425         Output_FrameFormat = VGPOP_EYUV_NONE;
    426     }
    427 
    428     VPP_DPRINT(":: Ports Available in Fill_LCMLInitParams  %ld\n ",pComponentPrivate->NumofOutputPort);
    429 
    430     /*for overlay*/
    431     if (pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.bEnabled) {
    432         Overlay = 1;
    433         pComponentPrivate->IsOverlay = 1 ;
    434         VPP_DPRINT("VPP::OVERLAY ENABLED");
    435     }
    436     else {
    437         Overlay = 0;
    438     }
    439 
    440     memset(valueStr, 0, sizeof(valueStr));
    441     VPP_DPRINT(":%lu:%lu:%u:%u:%u:%d:%d\n",
    442     Input_FrameWidth,
    443     Output_FrameWidth,
    444     OutputRGB_Format,
    445     Input_FrameFormat,
    446     Output_FrameFormat,
    447     Overlay,
    448     Alpha);
    449     sprintf(valueStr, ":%lu:%lu:%u:%u:%u:%d:%d\n",
    450     Input_FrameWidth,
    451     Output_FrameWidth,
    452     OutputRGB_Format,
    453     Input_FrameFormat,
    454     Output_FrameFormat,
    455     Overlay,
    456     Alpha);
    457 
    458     while(valueStr[ParamSize] != '\0'){
    459         ParamSize++;
    460     }
    461     VPP_DPRINT("ParamSize is %d\n", ParamSize);
    462 
    463     /*Copy VPP parameters */
    464     pTemp = memcpy(pcSNArgs,valueStr,ParamSize);
    465     if(pTemp == NULL){
    466         eError = OMX_ErrorUndefined;
    467         goto EXIT;
    468     }
    469 
    470     if ( (ParamSize % 2) != 0) {
    471         index =(ParamSize+1) >> 1;
    472     }
    473     else {
    474         index = ParamSize >> 1;  /*Divide by 2*/
    475     }
    476     index = index + 16;  /*Add 16 to the index in order to point to the correct location*/
    477 
    478     arr[index] = END_OF_CR_PHASE_ARGS;
    479     plcml_Init->pCrPhArgs = arr;
    480 
    481     VPP_DPRINT("VPP::%d :: Exiting Fill_LCMLInitParams",__LINE__);
    482 
    483 EXIT:
    484     return eError;
    485 }
    486 
    487 
    488 
    489 /* ========================================================================== */
    490 /**
    491 * @Start_ComponentThread() This function is called by the component to create
    492 * the component thread, command pipe, data pipe and LCML Pipe.
    493 *
    494 * @param pComponent  handle for this instance of the component
    495 *
    496 * @pre
    497 *
    498 * @post
    499 *
    500 * @return none
    501 */
    502 /* ==========================================================================* */
    503 OMX_ERRORTYPE VPP_Start_ComponentThread(OMX_HANDLETYPE pComponent)
    504 {
    505     OMX_ERRORTYPE eError = OMX_ErrorNone;
    506     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    507     VPP_COMPONENT_PRIVATE *pComponentPrivate = NULL;
    508 #ifdef UNDER_CE
    509     pthread_attr_t attr;
    510     memset(&attr, 0, sizeof(attr));
    511     attr.__inheritsched = PTHREAD_EXPLICIT_SCHED;
    512     attr.__schedparam.__sched_priority = OMX_VGPOP_THREAD_PRIORITY;
    513 #endif
    514 
    515     VPP_DPRINT("VPP::%d :: Enetering  Start_ComponentThread\n", __LINE__);
    516 
    517     pComponentPrivate = (VPP_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
    518 
    519     /* create the pipe used to send commands to the thread */
    520     eError = pipe (pComponentPrivate->cmdPipe);
    521     if (eError) {
    522         eError = OMX_ErrorContentPipeCreationFailed;
    523         goto EXIT;
    524     }
    525 
    526     /* create the pipe used to send commands data to the thread */
    527     eError = pipe (pComponentPrivate->nCmdDataPipe);
    528     if (eError) {
    529         eError = OMX_ErrorContentPipeCreationFailed;
    530         goto EXIT;
    531     }
    532 
    533     /*Create pipe to hold filled input buffers from APP to Component*/
    534     eError = pipe(pComponentPrivate->nFilled_iPipe);
    535     if (eError) {
    536         eError = OMX_ErrorContentPipeCreationFailed;
    537         goto EXIT;
    538     }
    539     /*Create pipe to hold empty output buffers from APP to Component*/
    540     eError = pipe(pComponentPrivate->nFree_oPipe);
    541     if (eError) {
    542         eError = OMX_ErrorContentPipeCreationFailed;
    543         goto EXIT;
    544     }
    545 
    546 #ifdef UNDER_CE
    547     eError = pthread_create (&(pComponentPrivate->ComponentThread),
    548                             &attr,
    549                             VPP_ComponentThreadFunc,
    550                             pComponentPrivate);
    551 #else
    552     eError = pthread_create (&(pComponentPrivate->ComponentThread),
    553                                 NULL,
    554                                 VPP_ComponentThreadFunc,
    555                                 pComponentPrivate);
    556 #endif
    557     if (eError || !pComponentPrivate->ComponentThread) {
    558         eError = OMX_ErrorInsufficientResources;
    559         goto EXIT;
    560     }
    561 
    562 #ifdef __PERF_INSTRUMENTATION__
    563     PERF_ThreadCreated(pComponentPrivate->pPERF,
    564                         pComponentPrivate->ComponentThread,
    565                         PERF_FOURCC('V','P','P','T'));
    566 #endif
    567 
    568     VPP_DPRINT ("VPP::%d :: Exiting from Start_ComponentThread\n", __LINE__);
    569 
    570 EXIT:
    571     return eError;
    572 }
    573 
    574 
    575 /* ========================================================================== */
    576 /**
    577 * Free_ComponentResources() This function is called by the component during
    578 * de-init to close component thread, Command pipe, data pipe & LCML pipe.
    579 *
    580 * @param pComponent  handle for this instance of the component
    581 *
    582 * @pre
    583 *
    584 * @post
    585 *
    586 * @return none
    587 */
    588 /* ========================================================================== */
    589 
    590 OMX_ERRORTYPE VPP_Free_ComponentResources(OMX_HANDLETYPE pComponent)
    591 {
    592     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    593     VPP_COMPONENT_PRIVATE *pComponentPrivate = (VPP_COMPONENT_PRIVATE *) pHandle->pComponentPrivate;
    594     OMX_ERRORTYPE eError = OMX_ErrorNone;
    595     OMX_ERRORTYPE threadError = OMX_ErrorNone;
    596     OMX_ERRORTYPE err = OMX_ErrorNone;
    597     OMX_HANDLETYPE pLcmlHandle = pComponentPrivate->pLcmlHandle;
    598     OMX_COMMANDTYPE stop = EXIT_COMPONENT_THRD;
    599     int i=0;
    600 
    601 #ifdef __PERF_INSTRUMENTATION__
    602     PERF_Boundary(pComponentPrivate->pPERF,
    603         PERF_BoundaryStart | PERF_BoundaryCleanup);
    604     PERF_SendingCommand(pComponentPrivate->pPERF, stop, 0, PERF_ModuleComponent);
    605 #endif
    606 
    607     if (pLcmlHandle !=NULL) {
    608         VPP_DPRINT (" IN ComponentDeInit calling EMMCodecControlDestroy  \n");
    609         eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, EMMCodecControlDestroy, NULL);
    610         if (eError != OMX_ErrorNone) {
    611             VPP_DPRINT("%d : Error: in Destroying the codec\n",__LINE__);
    612             goto EXIT;
    613         }
    614     }
    615     err = write (pComponentPrivate->cmdPipe[1], &stop, sizeof(OMX_COMMANDTYPE));
    616     if (err == -1) {
    617         VPP_DPRINT ("%d :: Error in Writing to the cmd  pipe  In deinit\n", eError);
    618         eError = OMX_ErrorHardware;
    619         goto EXIT;
    620     }
    621 
    622     VPP_DPRINT ("%d :: Free_ComponentResources \n",__LINE__);
    623     if(pComponentPrivate->ComponentThread){
    624 #ifndef UNDER_CE
    625         err = pthread_join (pComponentPrivate->ComponentThread,
    626                                     (void*)&threadError);
    627 #else
    628         err = oaf_pthread_join (pComponentPrivate->ComponentThread,
    629                                         (void*)&threadError);
    630 #endif
    631         if (err) {
    632             eError = OMX_ErrorHardware;
    633             VPP_DPRINT ("VPP::%d :: Error while closing Component Thread\n",__LINE__);
    634         }
    635     }
    636     else{
    637         eError = OMX_ErrorUndefined;
    638             VPP_DPRINT ("VPP::%d :: Error Component Thread = NULL\n",__LINE__);
    639     }
    640     for (i=0; i<2; i++) {
    641         err = close (pComponentPrivate->cmdPipe[i]);
    642         if (err && OMX_ErrorNone == eError) {
    643             eError = OMX_ErrorHardware;
    644             VPP_DPRINT ("VPP::%d :: Error while closing cmdPipe\n",__LINE__);
    645         }
    646 
    647         err = close (pComponentPrivate->nCmdDataPipe[i]);
    648         if (err && OMX_ErrorNone == eError) {
    649             eError = OMX_ErrorHardware;
    650             VPP_DPRINT ("VPP::%d :: Error while closing Command Data Pipe\n",__LINE__);
    651         }
    652 
    653         /*close the data pipe handles*/
    654         err = close(pComponentPrivate->nFree_oPipe[i]);
    655         if (err && OMX_ErrorNone == eError) {
    656             eError = OMX_ErrorHardware;
    657             VPP_DPRINT ("VPP::%d :: Error while closing Free Output pipe\n",__LINE__);
    658         }
    659         err = close(pComponentPrivate->nFilled_iPipe[i]);
    660         if (err && OMX_ErrorNone == eError) {
    661             eError = OMX_ErrorHardware;
    662             VPP_DPRINT ("VPP::%d :: Error while closing Filled Input pipe\n",__LINE__);
    663         }
    664     }
    665 
    666     pthread_mutex_destroy(&pComponentPrivate->vpp_mutex);
    667     pthread_cond_destroy(&pComponentPrivate->stop_cond);
    668     pthread_mutex_destroy(&pComponentPrivate->buf_mutex);
    669 
    670 #ifdef __PERF_INSTRUMENTATION__
    671     PERF_Boundary(pComponentPrivate->pPERF,
    672         PERF_BoundaryComplete | PERF_BoundaryCleanup);
    673         PERF_Done(pComponentPrivate->pPERF);
    674 #endif
    675 
    676 EXIT:
    677     /* LinkedList_DisplayAll(&AllocList); */
    678     OMX_FREEALL();
    679     LinkedList_Destroy(&AllocList);
    680 
    681     VPP_DPRINT ("Exiting Successfully After Freeing All Resources\n");
    682     return eError;
    683 }
    684 
    685 /* ========================================================================== */
    686 /**
    687 * @VPP_DisablePort() This function is called by the component when ever it
    688 * receives the command from the application
    689 *
    690 * @param pComponentPrivate  Component private data
    691 *
    692 * @pre
    693 *
    694 * @post
    695 *
    696 * @return none
    697 */
    698 /* ========================================================================== */
    699 OMX_ERRORTYPE VPP_DisablePort (VPP_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1)
    700 {
    701     OMX_ERRORTYPE eError = OMX_ErrorNone;
    702     OMX_COMPONENTTYPE* pHandle = NULL;
    703 
    704     if (!pComponentPrivate) {
    705         eError = OMX_ErrorBadParameter;
    706         goto EXIT;
    707     }
    708     pHandle = (OMX_COMPONENTTYPE*)pComponentPrivate->pHandle;
    709 
    710 
    711    if (pComponentPrivate->curState == OMX_StateExecuting || pComponentPrivate->curState == OMX_StatePause) {
    712        if (((nParam1 >= 0) && (nParam1 < 4)) || (nParam1 == -1)) {
    713            eError = VPP_HandleCommandFlush(pComponentPrivate, nParam1, OMX_FALSE);
    714        }
    715    }
    716 
    717 EXIT:
    718     return eError;
    719 }
    720 
    721 
    722 
    723 /* ========================================================================== */
    724 /**
    725 * @VPP_EnablePort() This function is called by the component when ever it
    726 * receives the command from the application
    727 *
    728 * @param pComponentPrivate  Component private data
    729 *
    730 * @pre
    731 *
    732 * @post
    733 *
    734 * @return none
    735 */
    736 /* ========================================================================== */
    737 OMX_ERRORTYPE VPP_EnablePort (VPP_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1)
    738 {
    739     OMX_ERRORTYPE eError = OMX_ErrorNone;
    740     OMX_COMPONENTTYPE* pHandle = NULL;
    741     int ports;
    742     OMX_U32 nTimeout;
    743 
    744     VPP_DPRINT("VPP: Enable port index=%ld",nParam1);
    745 
    746     if (!pComponentPrivate) {
    747         eError = OMX_ErrorBadParameter;
    748         goto EXIT;
    749     }
    750     pHandle = (OMX_COMPONENTTYPE*)pComponentPrivate->pHandle;
    751 
    752     if (nParam1 >= 0 && nParam1 < NUM_OF_VPP_PORTS ){
    753         /* enable port*/
    754         pComponentPrivate->sCompPorts[nParam1].pPortDef.bEnabled = OMX_TRUE;
    755     }
    756 
    757     if ( nParam1 == -1) {
    758         for (ports = 0; ports < NUM_OF_VPP_PORTS; ports++)
    759         {
    760             pComponentPrivate->sCompPorts[ports].pPortDef.bEnabled = OMX_TRUE;
    761         }
    762     }
    763 
    764     nTimeout = 0;
    765     while (OMX_TRUE)
    766     {
    767         if ((nParam1 >= 0 && nParam1 < NUM_OF_VPP_PORTS) &&
    768                 (pComponentPrivate->curState == OMX_StateLoaded ||
    769                     pComponentPrivate->sCompPorts[nParam1].pPortDef.bPopulated)) {
    770             pComponentPrivate->cbInfo.EventHandler (pHandle,
    771                                                     pHandle->pApplicationPrivate,
    772                                                     OMX_EventCmdComplete,
    773                                                     OMX_CommandPortEnable,
    774                                                     nParam1,
    775                                                     NULL);
    776             break;
    777         }
    778         else if (nParam1 == -1 &&
    779                 (pComponentPrivate->curState == OMX_StateLoaded ||
    780                     (pComponentPrivate->sCompPorts[0].pPortDef.bPopulated &&
    781                         pComponentPrivate->sCompPorts[1].pPortDef.bPopulated &&
    782                         pComponentPrivate->sCompPorts[2].pPortDef.bPopulated &&
    783                         pComponentPrivate->sCompPorts[3].pPortDef.bPopulated))) {
    784             for (ports = 0; ports < NUM_OF_VPP_PORTS; ports++) {
    785                 pComponentPrivate->cbInfo.EventHandler (pHandle,
    786                                                         pHandle->pApplicationPrivate,
    787                                                         OMX_EventCmdComplete,
    788                                                         OMX_CommandPortEnable,
    789                                                         ports,
    790                                                         NULL);
    791             }
    792             break;
    793         }
    794         else if (nTimeout++ > 0xEFFFFFFE) {
    795             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
    796                                             pComponentPrivate->pHandle->pApplicationPrivate,
    797                                             OMX_EventError,
    798                                             OMX_ErrorInsufficientResources,
    799                                             OMX_TI_ErrorMajor,
    800                                             "Port Unresponsive - Idle");
    801             break;
    802         }
    803 
    804         sched_yield();
    805     }
    806 
    807 EXIT:
    808     return eError;
    809 }
    810 
    811 /* ========================================================================== */
    812 /**
    813 * @VPP_EnablePort() This function is called by the component when ever it
    814 * receives the command from the application
    815 *
    816 * @param pComponentPrivate  Component private data
    817 *
    818 * @pre
    819 *
    820 * @post
    821 *
    822 * @return none
    823 */
    824 /* ========================================================================== */
    825 OMX_ERRORTYPE VPP_HandleCommandFlush (VPP_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1, OMX_BOOL return_event)
    826 {
    827     OMX_ERRORTYPE eError = OMX_ErrorNone;
    828     OMX_COMPONENTTYPE* pHandle = NULL;
    829     LCML_DSP_INTERFACE *pLcmlHandle = NULL;
    830     OMX_U32 nCount = 0;
    831     char    *pArgs      = "damedesuStr";
    832 
    833 
    834     OMX_BUFFERHEADERTYPE * pBufHeader;
    835     OMX_PARAM_PORTDEFINITIONTYPE *portDef ;
    836 
    837     int                    nRet;
    838     int                    i;
    839     OMX_BOOL               bFoundBuffer;
    840 
    841     if (!pComponentPrivate) {
    842         eError = OMX_ErrorBadParameter;
    843         goto EXIT;
    844     }
    845     pHandle = (OMX_COMPONENTTYPE*)pComponentPrivate->pHandle;
    846 
    847     VPP_DPRINT("nParam1 %d return_event is %x OMX_FALSE %x\n", nParam1, return_event, OMX_FALSE);
    848 
    849     pLcmlHandle = pComponentPrivate->pLcmlHandle;
    850     pComponentPrivate->bDisable = OMX_FALSE;
    851     VPP_DPRINT("VPP_UTILS: send STOP as flush\n");
    852     eError = LCML_ControlCodec(
    853                             ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    854                             MMCodecControlStop,
    855                             (void *)pArgs);
    856     if (eError != OMX_ErrorNone) {
    857         VPP_DPRINT("VPP::%d: Error 0x%X Occurred in Codec Stop..\n",__LINE__,eError);
    858         goto EXIT;
    859     }
    860 
    861     while (pComponentPrivate->bDisable == OMX_FALSE) {
    862         sched_yield();
    863     }
    864 
    865     eError = LCML_ControlCodec(
    866                             ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    867                             EMMCodecControlStart,
    868                             (void *)pArgs);
    869     if (eError != OMX_ErrorNone) {
    870         VPP_DPRINT("VPP::%d: Error 0x%X Occurred in Codec Start..\n",__LINE__,eError);
    871         goto EXIT;
    872     }
    873 
    874     for (i = 0; i < NUM_OF_VPP_PORTS; i ++) {
    875         if (return_event == OMX_TRUE) {
    876             for (nCount = 0; nCount < NUM_OF_VPP_BUFFERS; nCount ++){
    877                 if (pComponentPrivate->sCompPorts[i].pVPPBufHeader[nCount].eBufferOwner  == VPP_BUFFER_DSP ||
    878                         pComponentPrivate->sCompPorts[i].pVPPBufHeader[nCount].eBufferOwner  == VPP_BUFFER_COMPONENT_IN ||
    879                         pComponentPrivate->sCompPorts[i].pVPPBufHeader[nCount].eBufferOwner  == VPP_BUFFER_COMPONENT_OUT){
    880 
    881                     switch (pComponentPrivate->sCompPorts[i].pVPPBufHeader[nCount].eBufferOwner) {
    882                     case VPP_BUFFER_DSP:
    883                         pComponentPrivate->sCompPorts[i].pVPPBufHeader[nCount].eBufferOwner = VPP_BUFFER_CLIENT;
    884                         pComponentPrivate->sCompPorts[i].pVPPBufHeader[nCount].pBufHeader->nFilledLen = 0;
    885                         /* pComponentPrivate->nInPortOut ++; */
    886 #ifdef __PERF_INSTRUMENTATION__
    887                         PERF_SendingFrame(pComponentPrivate->pPERFcomp,
    888                                           PREF(((OMX_BUFFERHEADERTYPE*) pComponentPrivate->sCompPorts[0].pVPPBufHeader[nCount].pBufHeader), pBuffer),
    889                                           PREF(((OMX_BUFFERHEADERTYPE*) pComponentPrivate->sCompPorts[0].pVPPBufHeader[nCount].pBufHeader), nFilledLen),
    890                                           PERF_ModuleHLMM);
    891 #endif
    892                         if (i == OMX_VPP_INPUT_PORT ||
    893                             i == OMX_VPP_INPUT_OVERLAY_PORT) {
    894                             pComponentPrivate->cbInfo.EmptyBufferDone(pComponentPrivate->pHandle,
    895                                                 pComponentPrivate->pHandle->pApplicationPrivate,
    896                                                 pComponentPrivate->sCompPorts[i].pVPPBufHeader[nCount].pBufHeader);
    897                         } else if (i == OMX_VPP_RGB_OUTPUT_PORT ||
    898                             i == OMX_VPP_YUV_OUTPUT_PORT) {
    899                             pComponentPrivate->cbInfo.FillBufferDone(pComponentPrivate->pHandle,
    900                                                 pComponentPrivate->pHandle->pApplicationPrivate,
    901                                                 pComponentPrivate->sCompPorts[i].pVPPBufHeader[nCount].pBufHeader);
    902                         }
    903                         break;
    904                     case VPP_BUFFER_COMPONENT_IN:
    905                         bFoundBuffer = OMX_FALSE;
    906 
    907                         while (bFoundBuffer == OMX_FALSE) {
    908                             if (i == OMX_VPP_INPUT_PORT || i == OMX_VPP_INPUT_OVERLAY_PORT) {
    909                                 nRet = read(pComponentPrivate->nFilled_iPipe[0], &(pBufHeader),sizeof(pBufHeader));
    910                                 if (-1 == nRet) {
    911                                     VPP_DPRINT ("%d :: Error while reading from the pipe\n",__LINE__);
    912                                 }
    913                                 eError = VPP_GetPortDefFromBufHeader(pBufHeader, &portDef);
    914 
    915                                 if (eError != OMX_ErrorNone) {
    916                                     VPP_DPRINT("VPP:: Got error in _GetPortDefFromBufHeader. Code %x\n", eError);
    917                                     goto EXIT;
    918                                 }
    919 
    920                                 if (portDef->nPortIndex == i) {
    921                                     pComponentPrivate->sCompPorts[i].pVPPBufHeader[nCount].eBufferOwner = VPP_BUFFER_CLIENT;
    922                                     pComponentPrivate->cbInfo.EmptyBufferDone(pComponentPrivate->pHandle,
    923                                                     pComponentPrivate->pHandle->pApplicationPrivate,
    924                                                     pBufHeader);
    925                                     bFoundBuffer = OMX_TRUE;
    926                                 }
    927                                 else {
    928                                     write(pComponentPrivate->nFilled_iPipe[1], &(pBufHeader), sizeof(pBufHeader));
    929                                 }
    930                             }
    931                             else if (i == OMX_VPP_RGB_OUTPUT_PORT ||i == OMX_VPP_YUV_OUTPUT_PORT) {
    932                                 nRet = read(pComponentPrivate->nFree_oPipe[0], &pBufHeader, sizeof(pBufHeader));
    933                                 if (-1 == nRet) {
    934                                     VPP_DPRINT ("%d :: Error while reading from the pipe\n",__LINE__);
    935                                 }
    936                                 eError = VPP_GetPortDefFromBufHeader(pBufHeader, &portDef);
    937                                 if (eError != OMX_ErrorNone) {
    938                                     VPP_DPRINT("Error in _GetPortDefFromBufHeader. Code %d\n", eError);
    939                                     goto EXIT;
    940                                 }
    941                                 if (portDef->nPortIndex == i) {
    942                                     pComponentPrivate->sCompPorts[i].pVPPBufHeader[nCount].eBufferOwner = VPP_BUFFER_CLIENT;
    943                                     pComponentPrivate->cbInfo.FillBufferDone(pHandle,
    944                                                     pHandle->pApplicationPrivate,
    945                                                     pBufHeader);
    946                                     bFoundBuffer = OMX_TRUE;
    947                                 }
    948                                 else {
    949                                     write(pComponentPrivate->nFree_oPipe[1],&pBufHeader,sizeof(OMX_BUFFERHEADERTYPE*));
    950                                 }
    951                             }
    952                         } /* end of while () */
    953                         break;
    954                     case VPP_BUFFER_COMPONENT_OUT:
    955                         /* since we don't have this queue, there is nothing
    956                         to flush.  Buffers are handled immediately */
    957                         break;
    958                     case VPP_BUFFER_CLIENT:
    959                     case VPP_BUFFER_TUNNEL_COMPONENT:
    960                         break;
    961                     }
    962                 }
    963             }
    964             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
    965                                                 pComponentPrivate->pHandle->pApplicationPrivate,
    966                                                 OMX_EventCmdComplete,
    967                                                 OMX_CommandFlush,
    968                                                 i,
    969                                                 NULL);
    970         }
    971     } /* for (i = 0; i < NUM_OF_VPP_PORTS; i ++) */
    972 
    973 EXIT:
    974     return eError;
    975 }
    976 
    977 
    978 
    979 /* ========================================================================== */
    980 /**
    981 * @StateToIdle() This function is called by the component when ever it
    982 * receives the command from the application
    983 *
    984 * @param pComponentPrivate  Component private data
    985 *
    986 * @pre
    987 *
    988 * @post
    989 *
    990 * @return none
    991 */
    992 /* ========================================================================== */
    993 OMX_ERRORTYPE VPP_StateToIdle(VPP_COMPONENT_PRIVATE *pComponentPrivate)
    994 {
    995     OMX_ERRORTYPE                eError      = OMX_ErrorNone;
    996     OMX_COMPONENTTYPE            *pHandle    = (OMX_COMPONENTTYPE *) pComponentPrivate->pHandle;
    997     OMX_HANDLETYPE               pLcmlHandle = pComponentPrivate->pLcmlHandle;
    998     OMX_PARAM_PORTDEFINITIONTYPE *pPortDef   = NULL;
    999     VPP_PORT_TYPE                *pPortTp    = NULL;
   1000     OMX_U8                  *pBufferAligned = NULL;
   1001     OMX_U8                  *pBufferStart = NULL;
   1002     char                         *pArgs      = "damedesuStr";
   1003     OMX_U32                      nTimeout;
   1004     OMX_U16                      array[100];  /*Used to pass to Fill_LCMLInitParams*/
   1005 
   1006     VPP_DPRINT("VPP::%d: HandleCommand: Cmd Idle \n",__LINE__);
   1007     VPP_DPRINT("Current state is %d = %d\n", pComponentPrivate->curState, OMX_StateLoaded);
   1008 
   1009     if (pComponentPrivate->curState == OMX_StateInvalid) {
   1010         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1011                             pComponentPrivate->pHandle->pApplicationPrivate,
   1012                             OMX_EventError,
   1013                             OMX_ErrorIncorrectStateTransition,
   1014                             OMX_TI_ErrorSevere,
   1015                             NULL);
   1016         goto EXIT;
   1017     }
   1018 
   1019     pComponentPrivate->toState = OMX_StateIdle;
   1020 
   1021     if ((pComponentPrivate->curState == OMX_StateLoaded) ||
   1022         (pComponentPrivate->curState == OMX_StateWaitForResources)) { /* from Loaded to Idle */
   1023 
   1024         LCML_CALLBACKTYPE cb;
   1025         LCML_DSP *pLcmlDsp;
   1026         char *p = "damedesuStr";
   1027         int nPortIndex = 0;
   1028 
   1029 #ifdef __PERF_INSTRUMENTATION__
   1030         PERF_Boundary(pComponentPrivate->pPERFcomp,
   1031                     PERF_BoundaryStart | PERF_BoundarySetup);
   1032 #endif
   1033 
   1034         VPP_DPRINT("pComponentPrivate->sCompPorts[0].pPortDef.nPortIndex = %d\n", pComponentPrivate->sCompPorts[0].pPortDef.nPortIndex);
   1035 
   1036         pLcmlHandle = (OMX_HANDLETYPE) VPP_GetLCMLHandle(pComponentPrivate);
   1037         if (pLcmlHandle == NULL) {
   1038             VPP_DPRINT("%d :: LCML Handle is NULL........exiting..\n",__LINE__);
   1039             goto EXIT;
   1040         }
   1041         VPP_DPRINT("%d pComponentPrivate->sCompPorts[0].pPortDef.nPortIndex = %d\n", __LINE__, pComponentPrivate->sCompPorts[0].pPortDef.nPortIndex);
   1042 
   1043         pLcmlDsp = (((LCML_DSP_INTERFACE*)pLcmlHandle)->dspCodec);
   1044         VPP_DPRINT("VPP::%d: before init LCML \n",__LINE__);
   1045 
   1046         for (nPortIndex = 0; nPortIndex < NUM_OF_VPP_PORTS; nPortIndex++) {
   1047             OMX_U32 nBuf;
   1048             pPortTp = &(pComponentPrivate->sCompPorts[nPortIndex]);
   1049             pPortDef = &(pComponentPrivate->sCompPorts[nPortIndex].pPortDef);
   1050             if ((pPortTp->hTunnelComponent != NULL ) &&
   1051                     ((pPortTp->eSupplierSetting == OMX_BufferSupplyInput && 2 > nPortIndex) ||
   1052                         (pPortTp->eSupplierSetting == OMX_BufferSupplyOutput && 2 < nPortIndex))) {
   1053 
   1054                 /* assuming i am the supplier */
   1055                 for (nBuf=0; nBuf< pPortDef->nBufferCountActual; nBuf++) {
   1056                     OMX_U32 nsize;
   1057                     OMX_U8 *nbuffer = NULL;
   1058 
   1059                     nsize = pPortDef->format.video.nFrameWidth * pPortDef->format.video.nFrameHeight * 2;
   1060                     OMX_MALLOC(pBufferStart, nsize + 32 + 256);
   1061                     VPP_DPRINT("allocated pBufferStart with address %p\n", nbuffer);
   1062 
   1063                     pBufferAligned = pBufferStart;
   1064                     while ((((int)pBufferAligned) & 0x1f) != 0)
   1065                     {
   1066                         pBufferAligned++;
   1067                     }
   1068                     pBufferAligned            = ((OMX_U8*)pBufferAligned)+128;
   1069                     pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].pBufferStart = pBufferStart;
   1070                     nbuffer            = pBufferAligned;
   1071 
   1072 #ifdef __PERF_INSTRUMENTATION__
   1073                     PERF_XferingFrame(pComponentPrivate->pPERFcomp,
   1074                     nbuffer, nsize,
   1075                     PERF_ModuleMemory,
   1076                     PERF_ModuleLLMM);
   1077 #endif
   1078 
   1079                     eError = OMX_UseBuffer(
   1080                                         pPortTp->hTunnelComponent,
   1081                                         &(pPortTp->pVPPBufHeader[nBuf].pBufHeader),
   1082                                         pPortTp->nTunnelPort,
   1083                                         NULL,
   1084                                         nsize,
   1085                                         nbuffer);
   1086 
   1087                     if (pPortTp->eSupplierSetting == OMX_BufferSupplyInput) {
   1088                         pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].pBufHeader->nFilledLen = nsize;
   1089                         pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].pBufHeader->nAllocLen = nsize;
   1090                         pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].nIndex = OMX_VPP_INPUT_PORT;
   1091                         pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].bSelfAllocated = OMX_TRUE;
   1092                         pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].bHolding = OMX_TRUE;
   1093                         pComponentPrivate->sCompPorts[nPortIndex].nBufSupplier = OMX_TRUE;
   1094                         pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].pBufHeader->pInputPortPrivate = &pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef;
   1095                         pComponentPrivate->sCompPorts[nPortIndex].pPortDef.bPopulated = OMX_TRUE;
   1096                         pComponentPrivate->sCompPorts[nPortIndex].nBufferCount ++;
   1097                     }
   1098                     else {
   1099                         pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].pBufHeader->nFilledLen = nsize;
   1100                         pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].pBufHeader->nAllocLen = nsize;
   1101                         pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].nIndex = nPortIndex;
   1102                         pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].bSelfAllocated = OMX_TRUE;
   1103                         pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].bHolding = OMX_TRUE;
   1104                         pComponentPrivate->sCompPorts[nPortIndex].nBufSupplier = OMX_TRUE;
   1105                         pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].pBufHeader->pOutputPortPrivate = &pComponentPrivate->sCompPorts[nPortIndex].pPortDef;
   1106                         pComponentPrivate->sCompPorts[nPortIndex].pPortDef.bPopulated = OMX_TRUE;
   1107                         pComponentPrivate->sCompPorts[nPortIndex].nBufferCount ++;
   1108                     }
   1109                 }
   1110                 VPP_InitBufferDataPropagation(pComponentPrivate, nPortIndex);
   1111             } /* end if I am a supplier */
   1112 
   1113             if (pPortDef->bEnabled == OMX_TRUE) {
   1114                 nTimeout = 0;
   1115 
   1116                 while(1)
   1117                 {
   1118                     if(pPortDef->bPopulated) {
   1119                         break;
   1120                     }
   1121                     else if (nTimeout ++ > 0xEFFFFFFE) {
   1122                         VPP_DPRINT("TimeOut Error ! .. Buffers not allocated in time.\n");
   1123                         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1124                                             pComponentPrivate->pHandle->pApplicationPrivate,
   1125                                             OMX_EventError,
   1126                                             OMX_ErrorPortUnresponsiveDuringDeallocation,
   1127                                             OMX_TI_ErrorSevere,
   1128                                             "Port Unresponsive - Idle");
   1129                         break;
   1130                     }
   1131 
   1132                     sched_yield();
   1133                 }
   1134             }
   1135         } /* end of for loop */
   1136         VPP_DPRINT("%d pComponentPrivate->sCompPorts[0].pPortDef.nPortIndex = %d\n", __LINE__, pComponentPrivate->sCompPorts[0].pPortDef.nPortIndex);
   1137 
   1138         eError = VPP_Fill_LCMLInitParams(pHandle,array, pLcmlDsp);
   1139         VPP_DPRINT("%d pComponentPrivate->sCompPorts[0].pPortDef.nPortIndex = %d\n", __LINE__, pComponentPrivate->sCompPorts[0].pPortDef.nPortIndex);
   1140 
   1141         if (eError != OMX_ErrorNone) {
   1142             VPP_DPRINT("VPP::%d :: Error 0x%X returned from Fill_LCMLInitParams()\n",__LINE__,eError);
   1143             goto EXIT;
   1144         }
   1145 
   1146         pComponentPrivate->pLcmlHandle = (LCML_DSP_INTERFACE *)pLcmlHandle;
   1147         cb.LCML_Callback = (void *) VPP_LCML_Callback;
   1148 
   1149 #ifdef __PERF_INSTRUMENTATION__
   1150         pComponentPrivate->lcml_nCntIp = 0;
   1151         pComponentPrivate->lcml_nCntOpReceived = 0;
   1152 #endif
   1153 
   1154         eError = LCML_InitMMCodec(((LCML_DSP_INTERFACE *)pLcmlHandle)->pCodecinterfacehandle,
   1155                                     p,
   1156                                     &pLcmlHandle,
   1157                                     (void *)p,
   1158                                     &cb);
   1159        if (eError != OMX_ErrorNone) {
   1160             VPP_DPRINT("%d :: Error 0x%X : InitMMCodec failed...>>>>>> \n",__LINE__,eError);
   1161             goto EXIT;
   1162         }
   1163         VPP_DPRINT("%d pComponentPrivate->sCompPorts[0].pPortDef.nPortIndex = %d\n", __LINE__, pComponentPrivate->sCompPorts[0].pPortDef.nPortIndex);
   1164 
   1165 #ifdef LCML_USE_HASH
   1166 #ifdef VPP_USE_HASH
   1167         /* Enable Hashing for this component */
   1168         VPP_DPRINT("enable hashing\n");
   1169         LCML_SetHashingState(((LCML_DSP_INTERFACE *)pLcmlHandle)->pCodecinterfacehandle, OMX_TRUE);
   1170 #endif
   1171 #endif
   1172 
   1173 
   1174 #ifdef RESOURCE_MANAGER_ENABLED /* Resource Manager Proxy Calls */
   1175             pComponentPrivate->rmproxyCallback.RMPROXY_Callback = (void *)ResourceManagerCallback;
   1176             if (pComponentPrivate->curState != OMX_StateWaitForResources) {
   1177 
   1178                 eError = RMProxy_NewSendCommand(pHandle, RMProxy_RequestResource, OMX_VPP_COMPONENT, 50, 3456, &(pComponentPrivate->rmproxyCallback));/*50Mhz*/
   1179                 if (eError != OMX_ErrorNone) {
   1180                     /* resource is not available, need set state to OMX_StateWaitForResources*/
   1181                     VPP_DPRINT("Resource is not available\n");
   1182 
   1183                     pComponentPrivate->cbInfo.EventHandler(pHandle,
   1184                                                            pHandle->pApplicationPrivate,
   1185                                                            OMX_EventError,
   1186                                                            OMX_ErrorInsufficientResources,
   1187                                                            OMX_TI_ErrorSevere,
   1188                                                            NULL);
   1189                     eError = OMX_ErrorNone;
   1190                     goto EXIT;
   1191                 }
   1192             }
   1193 #endif
   1194 
   1195 #ifdef __PERF_INSTRUMENTATION__
   1196             PERF_Boundary(pComponentPrivate->pPERFcomp,
   1197                         PERF_BoundaryComplete | PERF_BoundarySetup);
   1198 #endif
   1199 
   1200         VPP_DPRINT("%d pComponentPrivate->sCompPorts[0].pPortDef.nPortIndex = %d\n", __LINE__, pComponentPrivate->sCompPorts[0].pPortDef.nPortIndex);
   1201 
   1202         pComponentPrivate->curState = OMX_StateIdle;
   1203 
   1204 #ifdef RESOURCE_MANAGER_ENABLED
   1205             eError = RMProxy_NewSendCommand(pHandle, RMProxy_StateSet, OMX_VPP_COMPONENT, OMX_StateIdle, 3456, NULL);
   1206             if (eError != OMX_ErrorNone) {
   1207                 VPP_DPRINT("Resources not available Loaded ->Idle\n");
   1208 
   1209                 pComponentPrivate->cbInfo.EventHandler(pHandle,
   1210                                                        pHandle->pApplicationPrivate,
   1211                                                        OMX_EventError,
   1212                                                        OMX_ErrorInsufficientResources,
   1213                                                        OMX_TI_ErrorSevere,
   1214                                                        NULL);
   1215                 goto EXIT;
   1216             }
   1217 
   1218 #endif
   1219 
   1220         pComponentPrivate->cbInfo.EventHandler(
   1221                                 pHandle,
   1222                                 pHandle->pApplicationPrivate,
   1223                                 OMX_EventCmdComplete,
   1224                                 OMX_CommandStateSet,
   1225                                 pComponentPrivate->curState,
   1226                                 NULL);
   1227 
   1228         VPP_DPRINT("VPP::%d :: VPP: State has been Set to Idle\n",__LINE__);
   1229 
   1230     }
   1231     else if (pComponentPrivate->curState == OMX_StateExecuting ||
   1232             pComponentPrivate->curState == OMX_StatePause ) {
   1233         int nIndex = 0;
   1234         OMX_U32 nCount = 0;
   1235 
   1236         int nFilledInBuf = 0;
   1237         int nFreeInBuf = 0;
   1238         int nFilledOutBuf = 0;
   1239         int nFreeOutBuf = 0;
   1240         int kk;
   1241 
   1242         pComponentPrivate->bIsStopping = OMX_TRUE;
   1243         pComponentPrivate->toState = OMX_StateIdle;
   1244 #ifdef LCML_USE_HASH
   1245         /* clear out any mappings that might have accumulated */
   1246         eError = LCML_FlushHashes(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle);
   1247         if (eError != OMX_ErrorNone) {
   1248             VPP_DPRINT("Error occurred in Codec mapping flush!\n");
   1249             goto EXIT;
   1250         }
   1251 #endif
   1252         VPP_DPRINT("%d :: In HandleCommand: Stopping the codec\n",__LINE__);
   1253 
   1254 #ifdef __PERF_INSTRUMENTATION__
   1255         PERF_Boundary(pComponentPrivate->pPERFcomp,
   1256                     PERF_BoundaryComplete | PERF_BoundarySteadyState);
   1257         /* PERF_SendingCommand(pComponentPrivate->pPERFcomp,
   1258                             MMCodecControlStop,
   1259                             (OMX_U32) pArgs,
   1260                             PERF_ModuleCommonLayer); */
   1261 #endif
   1262         eError = LCML_ControlCodec(
   1263         ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1264             MMCodecControlStop,
   1265             (void *)pArgs);
   1266         if (eError != OMX_ErrorNone) {
   1267             VPP_DPRINT("VPP::%d: Error 0x%X Occurred in Codec Stop..\n",__LINE__,eError);
   1268             goto EXIT;
   1269         }
   1270 
   1271         pthread_mutex_lock(&pComponentPrivate->vpp_mutex);
   1272         while ((pComponentPrivate->ExeToIdleFlag & VPP_DSPSTOP) == 0) {
   1273             pthread_cond_wait(&pComponentPrivate->stop_cond, &pComponentPrivate->vpp_mutex);
   1274         }
   1275         pthread_mutex_unlock(&pComponentPrivate->vpp_mutex);
   1276 
   1277         VPP_DPRINT("VPP_Utils.c: get STOP back from DSP\n");
   1278         for( nIndex = 0; nIndex < NUM_OF_VPP_PORTS; nIndex++) {
   1279             VPP_DPRINT("port %d is %d (%p)\n", nIndex, pComponentPrivate->sCompPorts[nIndex].pPortDef.bEnabled,pComponentPrivate->sCompPorts[nIndex].hTunnelComponent);
   1280 
   1281             /*if (!(pComponentPrivate->sCompPorts[nIndex].pPortDef.bEnabled == OMX_TRUE)) {
   1282                 continue;
   1283             }*/
   1284             if (pComponentPrivate->sCompPorts[nIndex].hTunnelComponent != NULL) {
   1285                 for (nCount = 0; nCount < pComponentPrivate->sCompPorts[nIndex].nBufferCount; nCount++) {
   1286                     if (!(pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].bSelfAllocated == OMX_TRUE)) {
   1287                         VPP_DPRINT("VPP return buf to tunneled: %d %d\n",
   1288                         pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader->nFlags,
   1289                         pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader->nFilledLen);
   1290                         pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader->nFlags = OMX_BUFFERFLAG_EOS;
   1291                         pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader->nFilledLen = 0;
   1292                         if (pComponentPrivate->sCompPorts[nIndex].pPortDef.eDir == OMX_DirOutput) {
   1293                             VPP_DPRINT("VPP is at output port\n");
   1294 
   1295 #ifdef __PERF_INSTRUMENTATION__
   1296                             PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   1297                                 pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader->pBuffer,
   1298                                 pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader->nFilledLen,
   1299                                 PERF_ModuleLLMM);
   1300 #endif
   1301                             if(pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner != VPP_BUFFER_CLIENT){
   1302                                 pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner = VPP_BUFFER_CLIENT;
   1303                                 eError = OMX_EmptyThisBuffer(
   1304                                                     pComponentPrivate->sCompPorts[nIndex].hTunnelComponent,
   1305                                                     pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader);
   1306                             }
   1307                         }
   1308                         else { /* pComponentPrivate->sCompPorts[nIndex].pPortDef.eDir == OMX_DirInput */
   1309                             VPP_DPRINT("VPP is at input port\n");
   1310 
   1311 #ifdef __PERF_INSTRUMENTATION__
   1312                             PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   1313                                 pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader->pBuffer,
   1314                                 0,
   1315                                 PERF_ModuleLLMM);
   1316 #endif
   1317 
   1318                             VPP_DPRINT("VPP return buffer to tunnel\n");
   1319                             if(pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner != VPP_BUFFER_CLIENT){
   1320                                 pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner = VPP_BUFFER_CLIENT;
   1321                                 VPP_DPRINT("VPP_UTILS: call to OMX_FillThisBuffer():: %d\n", __LINE__);
   1322                                 eError = OMX_FillThisBuffer(
   1323                                                     pComponentPrivate->sCompPorts[nIndex].hTunnelComponent,
   1324                                                     pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader);
   1325                            }
   1326                         }
   1327                     }
   1328                 }
   1329     } else {  /* pComponentPrivate->sCompPorts[nIndex].hTunnelComponent == NULL */
   1330 
   1331 
   1332         /* for (nIndex = 0; nIndex < NUM_OF_VPP_PORTS; nIndex ++) { */
   1333         VPP_DPRINT("VPP_Utils.c: (%d) %d %p\n", __LINE__, nIndex, pComponentPrivate->sCompPorts[nIndex].hTunnelComponent);
   1334             for (nCount = 0; nCount < pComponentPrivate->sCompPorts[nIndex].nBufferCount; nCount++) {
   1335                 VPP_DPRINT("VPP:: port %d count %d bufHeader %p owner %d\n", nIndex, nCount,
   1336                     pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader,
   1337                     pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner);
   1338                 pthread_mutex_lock(&pComponentPrivate->buf_mutex);
   1339                 if (pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner != VPP_BUFFER_CLIENT) {
   1340                 if (pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner == VPP_BUFFER_COMPONENT_IN){
   1341                     if (nIndex == 0 || nIndex == 1) {
   1342                         nFilledInBuf ++;
   1343                     } else {
   1344                         VPP_DPRINT("index %d cnt %d owner %d %p\n", nIndex, nCount,
   1345                             pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner,
   1346                             pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader);
   1347                         nFreeOutBuf ++;
   1348                     }
   1349                 } else if (pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner == VPP_BUFFER_COMPONENT_OUT){
   1350                     if (nIndex == 0 || nIndex == 1) {
   1351                         nFreeInBuf ++;
   1352                     } else {
   1353                         nFilledOutBuf ++;
   1354                     }
   1355                 } else {
   1356                     VPP_DPRINT("Buffer %p is in DSP, error!\n", pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader);
   1357                     pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner = VPP_BUFFER_CLIENT;
   1358                     if (nIndex == 0 || nIndex == 1) {
   1359 
   1360                         pComponentPrivate->cbInfo.EmptyBufferDone(
   1361                                            pHandle,
   1362                                            pHandle->pApplicationPrivate,
   1363                                            pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader);
   1364                     } else {
   1365                         pComponentPrivate->cbInfo.FillBufferDone(
   1366                                            pHandle,
   1367                                            pHandle->pApplicationPrivate,
   1368                                            pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].pBufHeader);
   1369                     }
   1370                 }
   1371                 }
   1372                 pthread_mutex_unlock(&pComponentPrivate->buf_mutex);
   1373             }
   1374         VPP_DPRINT("nFilledInBuf %d nFreeInBuf %d nFilledOutBuf %d nFreeOutBuf %d\n", nFilledInBuf, nFreeInBuf, nFilledOutBuf, nFreeOutBuf);
   1375     }
   1376     }
   1377 
   1378         VPP_DPRINT("nFilledInBuf %d nFreeInBuf %d nFilledOutBuf %d nFreeOutBuf %d\n", nFilledInBuf, nFreeInBuf, nFilledOutBuf, nFreeOutBuf);
   1379         for (kk = 0; kk < nFilledInBuf; kk ++) {
   1380             VPP_Process_FilledInBuf(pComponentPrivate);
   1381         }
   1382         for (kk = 0; kk < nFreeOutBuf; kk ++) {
   1383             VPP_Process_FreeOutBuf(pComponentPrivate);
   1384         }
   1385         VPP_DPRINT("VPP after loop: nFilledInBuf %d nFreeInBuf %d nFilledOutBuf %d nFreeOutBuf %d\n", nFilledInBuf, nFreeInBuf, nFilledOutBuf, nFreeOutBuf);
   1386 
   1387         for( nIndex = 0; nIndex < NUM_OF_VPP_PORTS; nIndex++) {
   1388             VPP_DPRINT("port %d is %d (%p)\n", nIndex, pComponentPrivate->sCompPorts[nIndex].pPortDef.bEnabled,pComponentPrivate->sCompPorts[nIndex].hTunnelComponent);
   1389             if (pComponentPrivate->sCompPorts[nIndex].pPortDef.bEnabled == OMX_FALSE) {
   1390                 continue;
   1391             }
   1392             if (pComponentPrivate->sCompPorts[nIndex].hTunnelComponent != NULL) {
   1393                 for (nCount = 0; nCount < pComponentPrivate->sCompPorts[nIndex].nBufferCount; nCount++) {
   1394                      if (pComponentPrivate->sCompPorts[nIndex].pPortDef.eDir == OMX_DirOutput
   1395                                 && pComponentPrivate->sCompPorts[nIndex].eSupplierSetting == OMX_BufferSupplyOutput) {
   1396                          VPP_DPRINT("VPP :: pHandle=%p, eBufferOwner= %d, nIndex= %d\n", pComponentPrivate->pHandle, pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner, nIndex);
   1397 
   1398 
   1399         if(pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner == VPP_BUFFER_DSP) {
   1400                                  pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner = VPP_BUFFER_COMPONENT_OUT;;
   1401             }
   1402                 while((pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner != VPP_BUFFER_COMPONENT_IN) &&
   1403                                         (pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner != VPP_BUFFER_COMPONENT_OUT)){
   1404                                  pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner = VPP_BUFFER_COMPONENT_OUT;
   1405                     sched_yield();
   1406                         }
   1407                          VPP_DPRINT("VPP:: Component have all the buffers, eBufferOwner= %d\n", pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner);
   1408                     }
   1409                     else if(pComponentPrivate->sCompPorts[nIndex].pPortDef.eDir == OMX_DirInput
   1410                                 && pComponentPrivate->sCompPorts[nIndex].eSupplierSetting == OMX_BufferSupplyInput) {
   1411                         VPP_DPRINT("VPP Utils :: pHandle=%p, eBufferOwner= %d, nIndex= %d\n", pComponentPrivate->pHandle, pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner, nIndex);
   1412 
   1413 
   1414         if(pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner == VPP_BUFFER_DSP) {
   1415                                  pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner = VPP_BUFFER_COMPONENT_OUT;;
   1416             }
   1417                 while((pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner != VPP_BUFFER_COMPONENT_IN) &&
   1418                                         (pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner != VPP_BUFFER_COMPONENT_OUT)){
   1419                     sched_yield();
   1420                         }
   1421                          VPP_DPRINT("VPP Utils:: Component have all the buffers, eBufferOwner= %d\n", pComponentPrivate->sCompPorts[nIndex].pVPPBufHeader[nCount].eBufferOwner);
   1422 
   1423                     }
   1424                 }
   1425             }
   1426         }
   1427 
   1428         pComponentPrivate->ExeToIdleFlag |= VPP_BUFFERBACK;
   1429         if (pComponentPrivate->ExeToIdleFlag == VPP_IDLEREADY) {
   1430             pComponentPrivate->curState = OMX_StateIdle;
   1431             pComponentPrivate->cbInfo.EventHandler (
   1432                                 pHandle,
   1433                                 pHandle->pApplicationPrivate,
   1434                                 OMX_EventCmdComplete,
   1435                                 OMX_ErrorNone,
   1436                                 OMX_StateIdle,
   1437                                 "NULL");
   1438             pComponentPrivate->ExeToIdleFlag = VPP_ZERO;
   1439         }
   1440 #ifdef RESOURCE_MANAGER_ENABLED
   1441 
   1442             eError = RMProxy_NewSendCommand(pHandle, RMProxy_StateSet, OMX_VPP_COMPONENT, OMX_StateIdle, 3456, NULL);
   1443 #endif
   1444 
   1445     }
   1446     else {
   1447         VPP_DPRINT("%d: Comp: Sending ErrorNotification: Invalid State\n", __LINE__);
   1448         pComponentPrivate->cbInfo.EventHandler(
   1449                             pHandle,
   1450                             pHandle->pApplicationPrivate,
   1451                             OMX_EventCmdComplete,
   1452                             OMX_ErrorInvalidState,
   1453                             0,
   1454                             "Invalid State Error from VPP");
   1455     }
   1456 EXIT:
   1457     return eError;
   1458 }
   1459 
   1460 
   1461 
   1462 /* ========================================================================== */
   1463 /**
   1464 * @StateToExecuting() This function is called by the component when ever it
   1465 * receives the command from the application
   1466 *
   1467 * @param pComponentPrivate  Component private data
   1468 *
   1469 * @pre
   1470 *
   1471 * @post
   1472 *
   1473 * @return none
   1474 */
   1475 /* ========================================================================== */
   1476 OMX_ERRORTYPE VPP_StateToExecuting(VPP_COMPONENT_PRIVATE *pComponentPrivate)
   1477 {
   1478     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1479     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *) pComponentPrivate->pHandle;
   1480     OMX_HANDLETYPE    pLcmlHandle = pComponentPrivate->pLcmlHandle;
   1481     OMX_BUFFERHEADERTYPE *pBufHdr = NULL;
   1482     int     i, j;
   1483     int     nBuf;
   1484     char *pArgs = "damedesuStr";
   1485 
   1486 
   1487     VPP_DPRINT("VPP::%d: HandleCommand: Cmd Executing \n",__LINE__);
   1488 
   1489     if (pComponentPrivate->curState == OMX_StateExecuting) {
   1490         VPP_DPRINT("VPP: send OMX_ErrorSameState from OMX_StateInvalid\n");
   1491         pComponentPrivate->cbInfo.EventHandler(
   1492                             pComponentPrivate->pHandle,
   1493                             pComponentPrivate->pHandle->pApplicationPrivate,
   1494                             OMX_EventError,
   1495                             OMX_ErrorSameState,
   1496                             OMX_TI_ErrorMinor,
   1497                             NULL);
   1498         if (eError != OMX_ErrorNone) {
   1499         }
   1500         goto EXIT;
   1501     }
   1502 
   1503      pComponentPrivate->toState = OMX_StateExecuting;
   1504 
   1505     if (pComponentPrivate->curState == OMX_StateIdle) {/* from Idle to Executing */
   1506         OMX_U32 Inputports = 1;
   1507         int bufCount;
   1508 
   1509         pComponentPrivate->tVPPIOConf->overlayInputImage = 0;
   1510         pComponentPrivate->tVPPIOConf->YUVOutputImage = 0;
   1511         pComponentPrivate->tVPPIOConf->RGBOutputImage = 0;
   1512 
   1513         pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].nReturnedBufferCount = pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].nBufferCount; /*usmc*/
   1514 
   1515 
   1516         if(pComponentPrivate->IsOverlay == OMX_TRUE) {
   1517             pComponentPrivate->tVPPIOConf->overlayInputImage = 1;
   1518             Inputports =2;
   1519         }
   1520 
   1521         if(pComponentPrivate->NumofOutputPort && pComponentPrivate->NumofOutputPort < 2 ) {
   1522             if (pComponentPrivate->IsYUVdataout) {
   1523                 pComponentPrivate->tVPPIOConf->YUVOutputImage = 1;
   1524             }
   1525             else {
   1526                 pComponentPrivate->tVPPIOConf->RGBOutputImage = 1;
   1527             }
   1528         }
   1529         else if(pComponentPrivate->NumofOutputPort == 2) {
   1530             pComponentPrivate->tVPPIOConf->YUVOutputImage = 1;
   1531             pComponentPrivate->tVPPIOConf->RGBOutputImage = 1;
   1532         }
   1533 
   1534 
   1535         VPP_DPRINT("VPP::%d: before START control \n",__LINE__);
   1536 
   1537 
   1538         eError = LCML_ControlCodec(
   1539                     ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1540                     EMMCodecControlStart,
   1541                     (void *)pArgs);
   1542         if (eError != OMX_ErrorNone) {
   1543             VPP_DPRINT("VPP::%d: Error 0x%X Occurred in Codec Start..\n",__LINE__,eError);
   1544             goto EXIT;
   1545         }
   1546 
   1547         pComponentPrivate->bIsStopping=0;
   1548 
   1549         VPP_DPRINT ("VPP::%d :: Comp :: After LCML_StartCodec function \n",__LINE__);
   1550 
   1551         for( j=0; j<(int)Inputports; j++) {
   1552             nBuf =pComponentPrivate->sCompPorts[j].nBufferCount;
   1553             VPP_DPRINT ("VPP::Sending Input buffer to Application bufcount=%lu \n",nBuf);
   1554 
   1555             /*TUNNEL HERE */
   1556             for (bufCount = 0; bufCount < nBuf; bufCount++) {
   1557                 pBufHdr = pComponentPrivate->sCompPorts[j].pVPPBufHeader[bufCount].pBufHeader;
   1558                 if ((pComponentPrivate->sCompPorts[j].hTunnelComponent != NULL) &&
   1559                         (pComponentPrivate->sCompPorts[j].eSupplierSetting == OMX_BufferSupplyInput)) {
   1560                 /* VPP owns this buffer */
   1561 
   1562                     VPP_DPRINT("VPP: send fillthisbuffer, out index %p, %d\n", pBufHdr, pBufHdr->nOutputPortIndex);
   1563 
   1564 #ifdef __PERF_INSTRUMENTATION__
   1565                     PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   1566                                     PREF(pBufHdr,pBuffer),
   1567                                     0,
   1568                                     PERF_ModuleLLMM);
   1569 #endif
   1570 
   1571                     pComponentPrivate->sCompPorts[j].pVPPBufHeader[bufCount].eBufferOwner = VPP_BUFFER_CLIENT;
   1572                     VPP_DPRINT("VPP_UTILS: call to OMX_FillThisBuffer():: %d\n", __LINE__);
   1573                     OMX_FillThisBuffer(pComponentPrivate->sCompPorts[j].hTunnelComponent, pBufHdr);
   1574                 }
   1575             }
   1576         }
   1577 
   1578         VPP_DPRINT("VPP:: %d:: Ports Available in Fill_LCMLInitParams  %ld\n ",__LINE__, pComponentPrivate->NumofOutputPort);
   1579 
   1580         if (pComponentPrivate->IsYUVdataout){
   1581             nBuf = pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].nBufferCount;
   1582             if ((pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].hTunnelComponent != NULL) &&
   1583                     (pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].eSupplierSetting == OMX_BufferSupplyOutput)) {
   1584                 for (i=0; i < nBuf; i++) {
   1585                     pBufHdr = pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pVPPBufHeader[i].pBufHeader;
   1586 
   1587 #ifdef __PERF_INSTRUMENTATION__
   1588                     PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   1589                                     pBufHdr->pBuffer,
   1590                                     pBufHdr->nFilledLen,
   1591                                     PERF_ModuleCommonLayer);
   1592 #endif
   1593                     VPP_DPRINT("LCML_QueueBuffer YUV: %s::%s: %d: VPP\n", __FILE__, __FUNCTION__, __LINE__);
   1594                     eError = LCML_QueueBuffer(
   1595                                 ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1596                                 EMMCodecStream3,
   1597                                 pBufHdr->pBuffer,
   1598                                 pBufHdr->nAllocLen,0,
   1599                                 (OMX_U8 *)pComponentPrivate->pOpYUVFrameStatus,
   1600                                 sizeof(GPPToVPPOutputFrameStatus),
   1601                                 (void *)pBufHdr);
   1602                     if (eError != OMX_ErrorNone) {
   1603                         VPP_DPRINT("VPP::%d :: Comp:: Error 0x%X While sending the output buffers to Codec\n", __LINE__,eError);
   1604                         goto EXIT;
   1605                     }
   1606                     VPP_DPRINT ("VPP::%d :: Component Sending Output buffer to Codec %p\n",__LINE__, pBufHdr);
   1607                 }
   1608             }
   1609         }
   1610         else if(pComponentPrivate->IsRGBdataout){
   1611             nBuf = pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].nBufferCount;
   1612             if ((pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].hTunnelComponent != NULL) &&
   1613                     (pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].eSupplierSetting == OMX_BufferSupplyOutput)) {
   1614                 for (i=0; i < nBuf; i++) {
   1615                     pBufHdr = pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pVPPBufHeader[i].pBufHeader;
   1616 
   1617 #ifdef __PERF_INSTRUMENTATION__
   1618                     PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   1619                                     pBufHdr->pBuffer,
   1620                                     pBufHdr->nFilledLen,
   1621                                     PERF_ModuleCommonLayer);
   1622 #endif
   1623                     VPP_DPRINT("LCML_QueueBuffer RGB: %s::%s: %d: VPP\n", __FILE__, __FUNCTION__, __LINE__);
   1624                     eError = LCML_QueueBuffer(
   1625                                 ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1626                                 EMMCodecStream2,
   1627                                 pBufHdr->pBuffer,
   1628                                 pBufHdr->nAllocLen,0,
   1629                                 (OMX_U8 *)pComponentPrivate->pOpRGBFrameStatus,
   1630                                 sizeof(GPPToVPPOutputFrameStatus),
   1631                                 (void *)pBufHdr);
   1632                     if (eError != OMX_ErrorNone) {
   1633                         VPP_DPRINT("VPP::%d :: Comp:: Error 0x%X While sending the output buffers to Codec\n", __LINE__,eError);
   1634                         goto EXIT;
   1635                     }
   1636                     VPP_DPRINT ("VPP::%d :: Component Sending Output buffer to Codec %p\n",__LINE__, pBufHdr);
   1637                 }
   1638             }
   1639         }
   1640         else{
   1641             eError = OMX_ErrorUndefined;
   1642             VPP_DPRINT("VPP:: %d : No Port enable\n");
   1643             goto EXIT;
   1644         }
   1645     }
   1646     else if (pComponentPrivate->curState == OMX_StatePause) {
   1647 #ifdef RESOURCE_MANAGER_ENABLED
   1648         VPP_DPRINT("%d: Comp: Resume Command Came from App\n",__LINE__);
   1649 #endif
   1650 
   1651         /* char *pArgs = "damedesuStr";*/
   1652         eError = LCML_ControlCodec(
   1653                     ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1654                     EMMCodecControlStart,(void *)pArgs);
   1655 
   1656         if (eError != OMX_ErrorNone) {
   1657             VPP_DPRINT ("Error While Resuming the codec\n");
   1658             goto EXIT;
   1659         }
   1660     }
   1661     else { /* if current state is not Idle or Pause ... */
   1662         pComponentPrivate->cbInfo.EventHandler (
   1663                             pHandle, pHandle->pApplicationPrivate,
   1664                             OMX_EventError,
   1665                             OMX_ErrorIncorrectStateTransition,OMX_TI_ErrorMinor,
   1666                             "Invalid State from VPP");
   1667         VPP_DPRINT("%d :: Error: Invalid State Given by Application\n",__LINE__);
   1668         goto EXIT;
   1669     }
   1670 
   1671     pComponentPrivate->ExeToIdleFlag = VPP_ZERO;
   1672 
   1673     pComponentPrivate->toState = OMX_StateExecuting;
   1674 #ifdef RESOURCE_MANAGER_ENABLED
   1675     eError = RMProxy_NewSendCommand(pHandle, RMProxy_StateSet, OMX_VPP_COMPONENT, OMX_StateExecuting, 3456, NULL);
   1676 #endif
   1677     pComponentPrivate->curState = OMX_StateExecuting;
   1678     pComponentPrivate->cbInfo.EventHandler(
   1679                         pHandle,
   1680                         pHandle->pApplicationPrivate,
   1681                         OMX_EventCmdComplete,
   1682                         OMX_ErrorNone,
   1683                         OMX_StateExecuting,
   1684                         NULL);
   1685 
   1686 EXIT:
   1687     return eError;
   1688 }
   1689 
   1690 
   1691 
   1692 /* ========================================================================== */
   1693 /**
   1694 * @StateToLoaded() This function is called by the component when ever it
   1695 * receives the command from the application
   1696 *
   1697 * @param pComponentPrivate  Component private data
   1698 *
   1699 * @pre
   1700 *
   1701 * @post
   1702 *
   1703 * @return none
   1704 */
   1705 /* ========================================================================== */
   1706 OMX_ERRORTYPE VPP_StateToLoaded(VPP_COMPONENT_PRIVATE *pComponentPrivate)
   1707 {
   1708     OMX_ERRORTYPE     eError = OMX_ErrorNone;
   1709     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *) pComponentPrivate->pHandle;
   1710     OMX_HANDLETYPE    pLcmlHandle = pComponentPrivate->pLcmlHandle;
   1711     OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL;
   1712     int     nPortIndex;
   1713     OMX_U32 nTimeout = 0;
   1714 
   1715     VPP_DPRINT("VPP::%d: HandleCommand: Cmd Loaded\n",__LINE__);
   1716     VPP_DPRINT("VPP: %d: HandleCommand: Cmd Loaded, current state: %d\n",__LINE__, pComponentPrivate->curState);
   1717 
   1718     if (pComponentPrivate->curState != OMX_StateIdle && pComponentPrivate->curState != OMX_StateWaitForResources ) {
   1719         pComponentPrivate->cbInfo.EventHandler (
   1720                             pHandle,
   1721                             pHandle->pApplicationPrivate,
   1722                             OMX_EventError,
   1723                             OMX_ErrorIncorrectStateTransition,
   1724                             OMX_TI_ErrorMinor,
   1725                             "Invalid State from VPP");
   1726         VPP_DPRINT("%d :: Error: Invalid State Given by Application\n",__LINE__);
   1727         goto EXIT;
   1728     }
   1729 
   1730      pComponentPrivate->toState = OMX_StateLoaded;
   1731 
   1732     if (pComponentPrivate->curState == OMX_StateIdle ||
   1733             pComponentPrivate->curState == OMX_StateWaitForResources) {
   1734 
   1735 #ifdef __PERF_INSTRUMENTATION__
   1736         PERF_Boundary(pComponentPrivate->pPERFcomp,
   1737         PERF_BoundaryStart | PERF_BoundaryCleanup);
   1738 #endif
   1739 
   1740 #ifdef RESOURCE_MANAGER_ENABLED
   1741             if (pComponentPrivate->curState == OMX_StateWaitForResources) {
   1742                 eError= RMProxy_NewSendCommand(pHandle,  RMProxy_CancelWaitForResource, OMX_VPP_COMPONENT, 0, 3456, NULL);
   1743                 if (eError != OMX_ErrorNone) {
   1744                     VPP_DPRINT("CancelWaitForResource Failed\n");
   1745                     pComponentPrivate->cbInfo.EventHandler(pHandle,
   1746                                                            pHandle->pApplicationPrivate,
   1747                                                            OMX_EventError,
   1748                                                            OMX_ErrorUndefined,
   1749                                                            OMX_TI_ErrorSevere,
   1750                                                            NULL);
   1751                     goto EXIT;
   1752                 }
   1753             }
   1754 
   1755             if (pComponentPrivate->curState != OMX_StateWaitForResources) {
   1756                 eError= RMProxy_NewSendCommand(pHandle,  RMProxy_FreeResource, OMX_VPP_COMPONENT, 0, 3456, NULL);
   1757                 if (eError != OMX_ErrorNone) {
   1758                     VPP_DPRINT("Cannot Free Resources\n");
   1759                     pComponentPrivate->cbInfo.EventHandler(pHandle,
   1760                                                            pHandle->pApplicationPrivate,
   1761                                                            OMX_EventError,
   1762                                                            OMX_ErrorUndefined,
   1763                                                            OMX_TI_ErrorSevere,
   1764                                                            NULL);
   1765                     goto EXIT;
   1766                 }
   1767             }
   1768 #endif
   1769 
   1770         if (pLcmlHandle !=NULL) {
   1771             VPP_DPRINT("VPP::%d: HandleCommand: : Loaded calling destroy\n",__LINE__);
   1772             eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1773                         EMMCodecControlDestroy,
   1774                         NULL);
   1775 #ifdef UNDER_CE
   1776              FreeLibrary(g_hLcmlDllHandle);
   1777             g_hLcmlDllHandle = NULL;
   1778 #else
   1779 
   1780         VPP_DPRINT("VPP: %d\n", __LINE__);
   1781           if(pComponentPrivate->pLcmlHandle){
   1782                dlclose(pComponentPrivate->pDllHandle);
   1783                 pComponentPrivate->pLcmlHandle = NULL;
   1784                 pComponentPrivate->pLCML = NULL;
   1785             }
   1786 
   1787 #endif
   1788             if (eError != OMX_ErrorNone) {
   1789                 VPP_DPRINT("VPP::%d : Error 0x%X: in Destroying the codec\n",__LINE__,eError);
   1790                 goto EXIT;
   1791             }
   1792         }
   1793         VPP_DPRINT("VPP: %d\n", __LINE__);
   1794        for(nPortIndex = 0; nPortIndex < NUM_OF_VPP_PORTS; nPortIndex++) {
   1795                 VPP_DPRINT("VPP free tunneled buf %d %p %x %x\n", nPortIndex,
   1796                 pComponentPrivate->sCompPorts[nPortIndex].hTunnelComponent,
   1797                 pComponentPrivate->sCompPorts[nPortIndex].nBufSupplier,
   1798                 pComponentPrivate->sCompPorts[nPortIndex].pPortDef.bEnabled);
   1799 
   1800             if (pComponentPrivate->sCompPorts[nPortIndex].hTunnelComponent != NULL &&
   1801                 pComponentPrivate->sCompPorts[nPortIndex].nBufSupplier == OMX_TRUE
   1802                     /*&& pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[0].bSelfAllocated*/) {
   1803                 OMX_U32 nBuf;
   1804                 OMX_U8 *pBufferStart = NULL;
   1805                 OMX_BUFFERHEADERTYPE *pBufHeader;
   1806 
   1807                for (nBuf=0; nBuf<pComponentPrivate->sCompPorts[nPortIndex].pPortDef.nBufferCountActual; nBuf++) {
   1808                     VPP_DPRINT("PORT  %d is Supplier !! .....\n",nPortIndex);
   1809                     pBufferStart = pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].pBufferStart;
   1810                     pBufHeader = pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].pBufHeader;
   1811 
   1812 
   1813 #ifdef __PERF_INSTRUMENTATION__
   1814                     PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   1815                                     PREF(pBufHeader,pBuffer),
   1816                                     PREF(pBufHeader,nAllocLen),
   1817                                     PERF_ModuleLLMM);
   1818 #endif
   1819 
   1820                     if(pBufHeader != NULL){
   1821                         OMX_FREE(pBufferStart);
   1822                         pBufferStart = NULL;
   1823                         pBufHeader->pBuffer = NULL;
   1824                     }
   1825 
   1826                     pComponentPrivate->sCompPorts[nPortIndex].nBufferCount --;
   1827                     pComponentPrivate->sCompPorts[nPortIndex].pPortDef.bPopulated = OMX_FALSE;
   1828                     eError = OMX_FreeBuffer(pComponentPrivate->sCompPorts[nPortIndex].hTunnelComponent,
   1829                                 pComponentPrivate->sCompPorts[nPortIndex].nTunnelPort,
   1830                                 pComponentPrivate->sCompPorts[nPortIndex].pVPPBufHeader[nBuf].pBufHeader
   1831                                 );
   1832                     if (eError != OMX_ErrorNone) {
   1833                         VPP_DPRINT ("OMX_FreeBuffer Failed !! .....\n");
   1834                         goto EXIT;
   1835                     }
   1836                 }
   1837 
   1838             }/*End of Tunneling component*/
   1839 
   1840             pComponentPrivate->nInputFrame = 0;
   1841             pComponentPrivate->nOverlayFrame = 0;
   1842             pComponentPrivate->nInYUVBufferCount = 0;
   1843             pComponentPrivate->nInRGBBufferCount = 0;
   1844             pComponentPrivate->nOutYUVBufferCount = 0;
   1845             pComponentPrivate->nOutRGBBufferCount = 0;
   1846 
   1847             pPortDef = &(pComponentPrivate->sCompPorts[nPortIndex].pPortDef);
   1848             VPP_DPRINT("%d pPortDef.bEnabled %d\n", nPortIndex, pComponentPrivate->sCompPorts[nPortIndex].pPortDef.bEnabled);
   1849             if (pComponentPrivate->sCompPorts[nPortIndex].pPortDef.bEnabled == OMX_TRUE) {
   1850                 nTimeout = 0;
   1851                 while(1)
   1852                 {
   1853                     if (!pComponentPrivate->sCompPorts[nPortIndex].pPortDef.bPopulated) {
   1854                         break;
   1855                     }
   1856                     else if (nTimeout++ > 0xEFFFFFFE) {
   1857                         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1858                                             pComponentPrivate->pHandle->pApplicationPrivate,
   1859                                             OMX_EventError,
   1860                                             OMX_ErrorPortUnresponsiveDuringDeallocation,
   1861                                             OMX_TI_ErrorSevere,
   1862                                             "Port Unresponsive - Idle");
   1863                         break;
   1864                     }
   1865                     sched_yield();
   1866                 }
   1867             }
   1868        }
   1869     }
   1870 
   1871 
   1872 #if 0
   1873 #ifdef __PERF_INSTRUMENTATION__
   1874     PERF_Boundary(pComponentPrivate->pPERFcomp,
   1875                 PERF_BoundaryComplete | PERF_BoundaryCleanup);
   1876 #endif
   1877 #endif
   1878 
   1879 
   1880 
   1881     if ((pComponentPrivate->curState == OMX_StateIdle) &&
   1882          (pComponentPrivate->bPreempted == 1 )){
   1883 
   1884         pComponentPrivate->curState = OMX_StateLoaded;
   1885         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1886                                                pComponentPrivate->pHandle->pApplicationPrivate,
   1887                                                OMX_EventError,
   1888                                                OMX_ErrorResourcesLost,
   1889                                                OMX_TI_ErrorSevere,
   1890                                                NULL);
   1891         pComponentPrivate->bPreempted = 0;
   1892     }
   1893     else {
   1894         pComponentPrivate->curState = OMX_StateLoaded;
   1895         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1896                                                pComponentPrivate->pHandle->pApplicationPrivate,
   1897                                                OMX_EventCmdComplete,
   1898                                                OMX_CommandStateSet,
   1899                                                OMX_StateLoaded,
   1900                                                NULL);
   1901     }
   1902 
   1903 EXIT:
   1904     return eError;
   1905 }
   1906 
   1907 
   1908 
   1909 /* ========================================================================== */
   1910 /**
   1911 * @HandleCommand() This function is called by the component when ever it
   1912 * receives the command from the application
   1913 *
   1914 * @param pComponentPrivate  Component private data
   1915 *
   1916 * @pre
   1917 *
   1918 * @post
   1919 *
   1920 * @return none
   1921 */
   1922 /* ========================================================================== */
   1923 OMX_ERRORTYPE VPP_HandleCommand (VPP_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1)
   1924 {
   1925     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1926     char *pArgs = "damedesuStr";
   1927     /*OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *) pComponentPrivate->pHandle;*/
   1928     OMX_HANDLETYPE pLcmlHandle = pComponentPrivate->pLcmlHandle;
   1929 
   1930     VPP_DPRINT ("VPP::%d :: >>> Entering HandleCommand Function\n",__LINE__);
   1931 
   1932     if (pComponentPrivate->curState == nParam1) {
   1933         VPP_DPRINT("VPP: send OMX_ErrorSameState from OMX_StateInvalid\n");
   1934         pComponentPrivate->cbInfo.EventHandler(
   1935                             pComponentPrivate->pHandle,
   1936                             pComponentPrivate->pHandle->pApplicationPrivate,
   1937                             OMX_EventError,
   1938                             OMX_ErrorSameState,
   1939                             OMX_TI_ErrorMinor,
   1940                             NULL);
   1941         if (eError != OMX_ErrorNone) {
   1942             VPP_DPRINT("VPP::%d : Error 0x%X: in Destroying the codec\n",__LINE__,eError);
   1943         }
   1944         goto EXIT;
   1945     }
   1946 
   1947     switch(nParam1)
   1948     {
   1949     case OMX_StateInvalid:
   1950         if (pComponentPrivate->curState == OMX_StateIdle ||
   1951                 pComponentPrivate->curState == OMX_StateExecuting ||
   1952                 pComponentPrivate->curState == OMX_StatePause  ) {
   1953             eError = LCML_ControlCodec(
   1954                         ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1955                         EMMCodecControlDestroy,
   1956                         NULL);
   1957 #ifdef UNDER_CE
   1958             FreeLibrary(g_hLcmlDllHandle);
   1959             g_hLcmlDllHandle = NULL;
   1960 #else
   1961             if(pComponentPrivate->pLcmlHandle){
   1962                 dlclose(pComponentPrivate->pDllHandle);
   1963                 pComponentPrivate->pLcmlHandle = NULL;
   1964                 pComponentPrivate->pLCML = NULL;
   1965             }
   1966 #endif
   1967         }
   1968         pComponentPrivate->curState = OMX_StateInvalid;
   1969         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1970                             pComponentPrivate->pHandle->pApplicationPrivate,
   1971                             OMX_EventError,
   1972                             OMX_ErrorInvalidState,
   1973                             OMX_TI_ErrorCritical,
   1974                             NULL);
   1975         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1976                             pComponentPrivate->pHandle->pApplicationPrivate,
   1977                             OMX_EventCmdComplete,
   1978                             OMX_CommandStateSet,
   1979                             pComponentPrivate->curState,
   1980                             NULL);
   1981         break;
   1982     case OMX_StateIdle:
   1983         eError = VPP_StateToIdle(pComponentPrivate);
   1984         break;
   1985     case OMX_StateExecuting:
   1986         eError = VPP_StateToExecuting(pComponentPrivate);
   1987         break;
   1988     case OMX_StateLoaded:
   1989         eError = VPP_StateToLoaded(pComponentPrivate);
   1990         break;
   1991     case OMX_StatePause:
   1992         VPP_DPRINT("%d: HandleCommand: Cmd Pause: Cur State = %d\n",__LINE__, pComponentPrivate->curState);
   1993         if ( pComponentPrivate->curState == OMX_StateExecuting ||
   1994                 pComponentPrivate->curState == OMX_StateIdle ) {
   1995 
   1996 #ifdef __PERF_INSTRUMENTATION__
   1997             PERF_Boundary(pComponentPrivate->pPERFcomp,
   1998                         PERF_BoundaryComplete | PERF_BoundarySteadyState);
   1999 #endif
   2000 
   2001             pComponentPrivate->toState = OMX_StatePause;
   2002             pComponentPrivate->ExeToIdleFlag = VPP_ZERO;
   2003             eError = LCML_ControlCodec(
   2004                         ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   2005                         EMMCodecControlPause,
   2006                         (void *)pArgs);
   2007 
   2008             if (eError != OMX_ErrorNone) {
   2009                 VPP_DPRINT("VPP::%d : Error0x%X: in Pausing the codec\n",__LINE__,eError);
   2010                 goto EXIT;
   2011             }
   2012 
   2013             /*Sending to Idle until receiving EMMCodecProcessingPaused call back*/
   2014 
   2015         }
   2016         else {
   2017             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2018                                 pComponentPrivate->pHandle->pApplicationPrivate,
   2019                                 OMX_EventError,
   2020                                 OMX_ErrorIncorrectStateTransition,
   2021                                 OMX_TI_ErrorMinor,
   2022                                 NULL);
   2023             VPP_DPRINT ("VPP::%d :: Error: Invalid State Given by Application\n",__LINE__);
   2024         }
   2025         break;
   2026     case OMX_StateWaitForResources:
   2027         VPP_DPRINT("VPP: SetState to WaitForResources, curState is %d\n", pComponentPrivate->curState);
   2028         if (pComponentPrivate->curState == OMX_StateLoaded) {
   2029 
   2030 #ifdef RESOURCE_MANAGER_ENABLED
   2031             eError= RMProxy_NewSendCommand(pComponentPrivate->pHandle, RMProxy_StateSet, OMX_VPP_COMPONENT, OMX_StateWaitForResources, 3456, NULL);
   2032             if (eError != OMX_ErrorNone) {
   2033                 VPP_DPRINT("RMProxy_NewSendCommand(OMX_StateWaitForResources) failed\n");
   2034                 pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2035                                                        pComponentPrivate->pHandle->pApplicationPrivate,
   2036                                                        OMX_EventError,
   2037                                                        OMX_ErrorUndefined,
   2038                                                        OMX_TI_ErrorSevere,
   2039                                                        NULL);
   2040                 break;
   2041             }
   2042 #endif
   2043 
   2044             pComponentPrivate->curState = OMX_StateWaitForResources;
   2045             VPP_DPRINT("VPP: my state is %d, from OMX_StateLoaded, before call EventHandler\n", pComponentPrivate->curState);
   2046             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2047                                 pComponentPrivate->pHandle->pApplicationPrivate,
   2048                                 OMX_EventCmdComplete,
   2049                                 OMX_CommandStateSet,
   2050                                 pComponentPrivate->curState,
   2051                                 NULL);
   2052             VPP_DPRINT("VPP: after call EventHandler\n");
   2053         }
   2054         else {
   2055             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2056                                 pComponentPrivate->pHandle->pApplicationPrivate,
   2057                                 OMX_EventError,
   2058                                 OMX_ErrorIncorrectStateTransition,
   2059                                 OMX_TI_ErrorMinor,
   2060                                 NULL);
   2061         }
   2062         break;
   2063     case OMX_StateMax:
   2064         VPP_DPRINT("VPP::%d: HandleCommand: Cmd OMX_StateMax::\n",__LINE__);
   2065         break;
   2066     default:
   2067         break;
   2068     }
   2069 EXIT:
   2070     VPP_DPRINT ("VPP::%d :: Exiting HandleCommand Function, eError=0x%X,\n",__LINE__,eError);
   2071     return eError;
   2072 }
   2073 
   2074 
   2075 
   2076 /**
   2077 * @VPP_ProcessFilledInBuf() This function is called by the component  Thread whenever it
   2078 * receives the an input buffer from the application
   2079 *
   2080 * @param pComponentPrivate  Component private data
   2081 * @param pBufHeader Buffer from the application
   2082 *
   2083 * @pre
   2084 *
   2085 * @post
   2086 *
   2087 * @return none
   2088 */
   2089 OMX_ERRORTYPE VPP_Process_FilledInBuf(VPP_COMPONENT_PRIVATE* pComponentPrivate)
   2090 {
   2091     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2092     OMX_DIRTYPE eDir = OMX_DirMax;
   2093     OMX_PARAM_PORTDEFINITIONTYPE *portDef = NULL;
   2094     OMX_U32 nIndex;
   2095     OMX_VPP_COMPONENT_BUFFER *pComponentBuf = NULL;
   2096     LCML_DSP_INTERFACE *pLcmlHandle = NULL;
   2097     OMX_BUFFERHEADERTYPE* pBufHeader = NULL;
   2098     OMX_COMPONENTTYPE               *pHandle = NULL;
   2099     OMX_U8 *pTemp = NULL;
   2100     int nRet=0;
   2101 
   2102     pHandle = pComponentPrivate->pHandle;
   2103 
   2104     VPP_DPRINT("In VPP_Process_FilledInBuf\n");
   2105 
   2106     nRet = read(pComponentPrivate->nFilled_iPipe[0], &(pBufHeader),sizeof(pBufHeader));
   2107     if (-1 == nRet) {
   2108         VPP_DPRINT ("%d :: Error while reading from the pipe\n",__LINE__);
   2109     }
   2110     VPP_DPRINT("%d :: Entering VPP_Process_FilledInBuf with pBufHeader=%p\n",__LINE__, pBufHeader);
   2111 
   2112     if (pBufHeader->nFlags & OMX_BUFFERFLAG_EOS) {
   2113         VPP_DPRINT("EOS flag is in input buffer (len %d)\n", pBufHeader->nFilledLen);
   2114     }
   2115 
   2116     eError = VPP_GetPortDefFromBufHeader(pBufHeader, &portDef);
   2117 
   2118     if (eError != OMX_ErrorNone) {
   2119         VPP_DPRINT("VPP:: Got error in _GetPortDefFromBufHeader. Code %x\n", eError);
   2120         goto EXIT;
   2121     }
   2122     VPP_DPRINT("THE PORT INDEX BEFORE VPP_ISVALIDBUFFER IS %d\n", portDef->nPortIndex);
   2123 
   2124     eError = VPP_IsValidBuffer(pBufHeader, pComponentPrivate, portDef->nPortIndex, &nIndex);
   2125     if (eError != OMX_ErrorNone) {
   2126         OMX_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter);
   2127     }
   2128     pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].bHolding = OMX_TRUE;
   2129 
   2130     if (!pComponentPrivate->sCompPorts[portDef->nPortIndex].pPortDef.bEnabled) {
   2131         VPP_DPRINT("cur port %p is disabled\n", portDef);
   2132         pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].eBufferOwner = VPP_BUFFER_CLIENT;
   2133         pComponentPrivate->cbInfo.EmptyBufferDone (
   2134                                 pHandle,
   2135                                 pHandle->pApplicationPrivate,
   2136                                 pBufHeader
   2137                                 );
   2138             goto EXIT;
   2139     }
   2140 
   2141     if (pComponentPrivate->bIsStopping == OMX_TRUE) {
   2142         VPP_DPRINT("VPP: stop! return buffer to %p\n", pComponentPrivate->sCompPorts[portDef->nPortIndex].hTunnelComponent);
   2143         if (pComponentPrivate->sCompPorts[portDef->nPortIndex].hTunnelComponent == NULL) {
   2144                   pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].eBufferOwner = VPP_BUFFER_CLIENT;
   2145             pComponentPrivate->cbInfo.EmptyBufferDone (pHandle,
   2146                                pHandle->pApplicationPrivate,
   2147                                pBufHeader
   2148                                );
   2149         } else {
   2150             if(pComponentPrivate->sCompPorts[portDef->nPortIndex].eSupplierSetting == OMX_BufferSupplyOutput){
   2151                 pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].eBufferOwner = VPP_BUFFER_TUNNEL_COMPONENT;
   2152                 VPP_DPRINT("VPP_UTILS: call to OMX_FillThisBuffer():: %d\n", __LINE__);
   2153                 eError = OMX_FillThisBuffer(
   2154                                    pComponentPrivate->sCompPorts[portDef->nPortIndex].hTunnelComponent,
   2155                                    pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].pBufHeader);
   2156             }
   2157             else{
   2158                             pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].eBufferOwner = VPP_BUFFER_COMPONENT_IN;
   2159             }
   2160         }
   2161         goto EXIT;
   2162     }
   2163     if (portDef->nPortIndex == OMX_VPP_INPUT_PORT || portDef->nPortIndex == OMX_VPP_INPUT_OVERLAY_PORT) {
   2164         VPP_DPRINT("VPP:: INPUT Buffer Came %ld ...\n",portDef->nPortIndex);
   2165         eDir = OMX_DirInput;
   2166     }
   2167     else {
   2168         VPP_DPRINT ("VPP::%d :: The PBufHeader is not found in the list\n", __LINE__);
   2169         goto EXIT;
   2170     }
   2171 
   2172     if (pBufHeader->nFilledLen >= 0) {
   2173         pLcmlHandle = (LCML_DSP_INTERFACE *) pComponentPrivate->pLcmlHandle;
   2174         eError = VPP_GetCorresponding_LCMLHeader(pComponentPrivate, pBufHeader->pBuffer, OMX_DirInput, &pComponentBuf, portDef->nPortIndex );
   2175         if (eError != OMX_ErrorNone) {
   2176             VPP_DPRINT("%d :: Error: Invalid Buffer Came ...\n",__LINE__);
   2177             goto EXIT;
   2178         }
   2179 
   2180         if (pComponentPrivate->bIsStopping == 1) {
   2181             pComponentBuf->eBufferOwner = VPP_BUFFER_CLIENT;
   2182                 pComponentPrivate->cbInfo.EmptyBufferDone (pHandle,
   2183                                     pHandle->pApplicationPrivate,
   2184                                     pComponentBuf->pBufHeader
   2185                                     );
   2186             goto EXIT;
   2187         }
   2188 
   2189         /*check for overlay data if yes then go for no parameter BUFER */
   2190         if (portDef->nPortIndex == OMX_VPP_INPUT_PORT) {
   2191 
   2192 #ifdef __PERF_INSTRUMENTATION__
   2193             PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2194                 pBufHeader->pBuffer,
   2195                 pBufHeader->nFilledLen,
   2196                 PERF_ModuleCommonLayer);
   2197 #endif
   2198 
   2199             pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].eBufferOwner = VPP_BUFFER_DSP;
   2200 
   2201             VPP_DPRINT("VPP: queue input buffer nFilledLen = (%d), BufHdr = %p\n", pBufHeader->nFilledLen, pBufHeader);
   2202             VPP_DPRINT("Queued Input Buffer: Input Width= %lu, Input Height=%lu, Inp. Offset: %lu \
   2203             RGBRotation = %lu, ulYUVRotation = %lu, ulMirror = %lu\n",
   2204                 pComponentPrivate->pIpFrameStatus->ulInWidth,
   2205                 pComponentPrivate->pIpFrameStatus->ulInHeight,
   2206                 pComponentPrivate->pIpFrameStatus->ulCInOffset,
   2207                 pComponentPrivate->pIpFrameStatus->ulRGBRotation,
   2208                 pComponentPrivate->pIpFrameStatus->ulYUVRotation,
   2209                 pComponentPrivate->pIpFrameStatus->ulMirror);
   2210 
   2211             eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle,
   2212                         EMMCodecInputBuffer,
   2213                         pBufHeader->pBuffer,
   2214                         pBufHeader->nAllocLen,
   2215                         pBufHeader->nFilledLen,
   2216                         (OMX_U8 *) pComponentPrivate->pIpFrameStatus,
   2217                         sizeof(GPPToVPPInputFrameStatus),
   2218                         (void *) pBufHeader);
   2219 
   2220 
   2221 
   2222         }
   2223         else if (portDef->nPortIndex == OMX_VPP_INPUT_OVERLAY_PORT) {
   2224             pTemp = memcpy(pComponentPrivate->RGBbuffer,pBufHeader->pBuffer,pBufHeader->nFilledLen);
   2225             if(pTemp == NULL){
   2226                 eError = OMX_ErrorUndefined;
   2227                 goto EXIT;
   2228             }
   2229             VPP_DPRINT("VPP::%d: before calling ComputeTiOverlayImgFormat \n",__LINE__);
   2230             eError = ComputeTiOverlayImgFormat(pComponentPrivate,
   2231                                     pComponentPrivate->RGBbuffer,
   2232                                     pBufHeader->pBuffer,
   2233                                     pComponentPrivate->colorKey);
   2234             if (eError != OMX_ErrorNone) {
   2235                 VPP_DPRINT ("VPP::%d ::ComputeTiOverlayImgFormat, Error Occurred: %x\n",__LINE__, eError);
   2236                 goto EXIT;
   2237             }
   2238             VPP_DPRINT("VPP::%d: after calling ComputeTiOverlayImgFormat \n",__LINE__);
   2239             pBufHeader->nFilledLen= (pBufHeader->nFilledLen*2)/3;
   2240 #if 0
   2241 
   2242     FILE *fp;
   2243 
   2244     fp = fopen("mytestcvnew.raw", "w");
   2245     fwrite(pBufHeader->pBuffer, 1, pBufHeader->nFilledLen, fp);
   2246     fclose(fp);
   2247            VPP_DPRINT("write %d bytes to mytestcvnew.raw\n", pBufHeader->nFilledLen);
   2248            exit(0);
   2249 #endif
   2250 
   2251 #ifdef __PERF_INSTRUMENTATION__
   2252             PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2253                             pBufHeader->pBuffer,
   2254                             pBufHeader->nFilledLen,
   2255                             PERF_ModuleCommonLayer);
   2256 #endif
   2257             pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].eBufferOwner = VPP_BUFFER_DSP;
   2258             eError = LCML_QueueBuffer(
   2259                         pLcmlHandle->pCodecinterfacehandle,
   2260                         EMMCodecStream1,
   2261                         pBufHeader->pBuffer,
   2262                         pBufHeader->nAllocLen,
   2263                         pBufHeader->nFilledLen,
   2264                         NULL,
   2265                         0,
   2266                         (void *) pBufHeader);
   2267 
   2268             VPP_DPRINT("LCML_QueueBuffer from OMX_VPP_INPUT_OVERLAY_PORT, pBufHeader %p, ->pBuffer %p\n",
   2269                 pBufHeader, pBufHeader->pBuffer);
   2270         }
   2271         if (eError != OMX_ErrorNone) {
   2272             VPP_DPRINT ("VPP::%d ::Comp: SetBuff: IP: Error Occurred\n",__LINE__);
   2273             eError = OMX_ErrorHardware;
   2274             goto EXIT;
   2275         }
   2276     }
   2277     VPP_DPRINT ("VPP::Sending Input buffer to Codec\n");
   2278 EXIT:
   2279     return eError;
   2280 }
   2281 
   2282 
   2283 
   2284 /**
   2285   * VPP_Process_FreeOutBuf()
   2286   *
   2287   * Called by component thread, handles free output buffers from app.
   2288   *
   2289   * @param pComponentPrivate private component structure for this instance of the component
   2290   *
   2291   * @param phandle LCML_DSP_INTERFACE handle for this instance of the component
   2292   *
   2293   * @retval OMX_ErrorNone                  success, ready to roll
   2294   *         OMX_ErrorInsufficientResources if the malloc fails
   2295   **/
   2296 OMX_ERRORTYPE VPP_Process_FreeOutBuf(VPP_COMPONENT_PRIVATE* pComponentPrivate)
   2297 {
   2298     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2299     OMX_PARAM_PORTDEFINITIONTYPE *portDef = NULL;
   2300     OMX_U32 nIndex;
   2301     OMX_VPP_COMPONENT_BUFFER *pComponentBuf  = NULL;
   2302     LCML_DSP_INTERFACE *pLcmlHandle = NULL;
   2303     OMX_BUFFERHEADERTYPE* pBufHeader = NULL;
   2304     OMX_COMPONENTTYPE               *pHandle = NULL;
   2305     int nRet = 0;
   2306 
   2307     VPP_DPRINT("In VPP_Process_FreeOutBuf\n");
   2308 
   2309     pHandle = pComponentPrivate->pHandle;
   2310 
   2311     nRet = read(pComponentPrivate->nFree_oPipe[0], &pBufHeader,sizeof(pBufHeader));
   2312     if (-1 == nRet) {
   2313         VPP_DPRINT ("%d :: Error while reading from the pipe\n",__LINE__);
   2314     }
   2315     VPP_DPRINT("In VPP_Process_FreeOutBuf\n");
   2316 
   2317 
   2318 
   2319     pLcmlHandle = (LCML_DSP_INTERFACE *) pComponentPrivate->pLcmlHandle;
   2320     eError = VPP_GetPortDefFromBufHeader(pBufHeader, &portDef);
   2321     if (eError != OMX_ErrorNone) {
   2322         VPP_DPRINT("VPP: Error in _GetPortDefFromBufHeader. Code %d\n", eError);
   2323         goto EXIT;
   2324     }
   2325 
   2326 
   2327 
   2328     eError = VPP_IsValidBuffer(pBufHeader, pComponentPrivate, portDef->nPortIndex, &nIndex);
   2329 
   2330     if ( eError != OMX_ErrorNone) {
   2331         goto EXIT;
   2332     }
   2333 
   2334     if ((pComponentPrivate->bIsStopping != OMX_FALSE ) || (pComponentPrivate->curState == OMX_StateIdle)) {
   2335         VPP_DPRINT("VPP is not in executing state (in FreeOutBuf %d %d %p)\n", portDef->nPortIndex, nIndex, pBufHeader);
   2336         VPP_DPRINT("cur state %d to state %d\n", pComponentPrivate->curState, pComponentPrivate->toState);
   2337         pthread_mutex_lock(&pComponentPrivate->buf_mutex);
   2338         VPP_DPRINT("VPP: return buffer to (%d) %p\n", portDef->nPortIndex, pComponentPrivate->sCompPorts[portDef->nPortIndex].hTunnelComponent);
   2339         if (pComponentPrivate->sCompPorts[portDef->nPortIndex].hTunnelComponent == NULL) {
   2340             pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].eBufferOwner = VPP_BUFFER_CLIENT;
   2341             pComponentPrivate->cbInfo.FillBufferDone (
   2342                                 pHandle,
   2343                                 pHandle->pApplicationPrivate,
   2344                                 pBufHeader
   2345                                 );
   2346         } else {
   2347             if(pComponentPrivate->sCompPorts[portDef->nPortIndex].eSupplierSetting == OMX_BufferSupplyInput){
   2348                 pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].eBufferOwner = VPP_BUFFER_TUNNEL_COMPONENT;
   2349                  eError = OMX_EmptyThisBuffer(
   2350                                     pComponentPrivate->sCompPorts[portDef->nPortIndex].hTunnelComponent,
   2351                                     pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].pBufHeader);
   2352             }
   2353             else{
   2354                 pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].eBufferOwner = VPP_BUFFER_COMPONENT_IN;
   2355             }
   2356         }
   2357         pthread_mutex_unlock(&pComponentPrivate->buf_mutex);
   2358 
   2359        goto EXIT;
   2360     }
   2361 
   2362     if (!pComponentPrivate->sCompPorts[portDef->nPortIndex].pPortDef.bEnabled) {
   2363         VPP_DPRINT("In VPP_Process_FreeOutBuf port %p is disabled %p\n", portDef, pBufHeader);
   2364         pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].eBufferOwner = VPP_BUFFER_CLIENT;
   2365             pComponentPrivate->cbInfo.FillBufferDone (
   2366                                 pHandle,
   2367                                 pHandle->pApplicationPrivate,
   2368                                 pBufHeader
   2369                                 );
   2370             goto EXIT;
   2371     }
   2372 
   2373     pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].bHolding = OMX_TRUE;
   2374     eError = VPP_GetCorresponding_LCMLHeader(pComponentPrivate, pBufHeader->pBuffer, OMX_DirOutput, &pComponentBuf, portDef->nPortIndex);
   2375     if (eError != OMX_ErrorNone) {
   2376         VPP_DPRINT("VPP::%d :: Error: Invalid Buffer Came ...\n",__LINE__);
   2377         goto EXIT;
   2378     }
   2379 
   2380 
   2381 
   2382     if (pComponentPrivate->bIsStopping == OMX_FALSE) {
   2383 #ifdef __PERF_INSTRUMENTATION__
   2384         PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2385                             pBufHeader->pBuffer,
   2386                             0,
   2387                             PERF_ModuleCommonLayer);
   2388 #endif
   2389 
   2390         pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].eBufferOwner = VPP_BUFFER_DSP;
   2391         if (portDef->nPortIndex == OMX_VPP_RGB_OUTPUT_PORT) {
   2392             eError = LCML_QueueBuffer(
   2393                     pLcmlHandle->pCodecinterfacehandle,
   2394                     EMMCodecStream2,
   2395                     pBufHeader->pBuffer,
   2396                     pBufHeader->nAllocLen,0,
   2397                     (OMX_U8 *) pComponentPrivate->pOpRGBFrameStatus,
   2398                     sizeof(GPPToVPPOutputFrameStatus),
   2399                     (void *) pBufHeader);
   2400             VPP_DPRINT("VPP queue OMX_VPP_RGB_OUTPUT_PORT %p\n", pBufHeader);
   2401         } else { /* portDef->nPortIndex == OMX_VPP_YUV_OUTPUT_PORT) */
   2402            eError = LCML_QueueBuffer(
   2403                     pLcmlHandle->pCodecinterfacehandle,
   2404                     EMMCodecStream3,
   2405                     pBufHeader->pBuffer,
   2406                     pBufHeader->nAllocLen,0,
   2407                     (OMX_U8 *) pComponentPrivate->pOpYUVFrameStatus,
   2408                     sizeof(GPPToVPPOutputFrameStatus),
   2409                     (void *) pBufHeader);
   2410             VPP_DPRINT("VPP queue OMX_VPP_YUV_OUTPUT_PORT %p\n", pBufHeader);
   2411         }
   2412 
   2413         VPP_DPRINT("Queued Output Buffer: Out Width= %lu, Out Height=%lu, Out. Offset: %lu, befferlen: %lu\n",
   2414             pComponentPrivate->pOpYUVFrameStatus->ulOutWidth,
   2415             pComponentPrivate->pOpYUVFrameStatus->ulOutHeight,
   2416             pComponentPrivate->pOpYUVFrameStatus->ulCOutOffset,
   2417             pBufHeader->nAllocLen);
   2418 
   2419         if (eError != OMX_ErrorNone ) {
   2420             VPP_DPRINT ("VPP::%d :: Comp:: SetBuff OP: Error Occurred\n", __LINE__);
   2421             VPP_DPRINT("%s::%d::Error 0x%X from LCML_QueueBuffer\n",__FILE__,__LINE__,eError);
   2422             eError = OMX_ErrorHardware;
   2423             goto EXIT;
   2424         }
   2425     }
   2426 EXIT:
   2427     return eError;
   2428 }
   2429 
   2430 
   2431 
   2432 /**
   2433 * @VPP_Process_FreeInBuf() This function is called by the component  Thread whenever it
   2434 * receives the a Freed Input buffer from the DSP
   2435 *
   2436 * @param pComponentPrivate  Component private data
   2437 
   2438 * @pre
   2439 *
   2440 * @post
   2441 *
   2442 * @return none
   2443 */
   2444 OMX_ERRORTYPE VPP_Process_FreeInBuf(VPP_COMPONENT_PRIVATE* pComponentPrivate,
   2445                                     OMX_VPP_COMPONENT_BUFFER *pComponentBuf)
   2446 {
   2447     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2448     OMX_COMPONENTTYPE* pHandle = (OMX_COMPONENTTYPE*)pComponentPrivate->pHandle;
   2449     OMX_U32 nIndex;
   2450     OMX_PARAM_PORTDEFINITIONTYPE *portDef = NULL;
   2451 
   2452 
   2453     if (pComponentPrivate->toState == OMX_StateIdle) {
   2454     VPP_DPRINT ("%d :: Entering HandleDataBuf_FromLCML Function\n",__LINE__);
   2455     }
   2456 
   2457     VPP_DPRINT("VPP::%d: Component Sending Empty Input buffer%p to App\n",__LINE__,pComponentBuf->pBufHeader->pBuffer);
   2458     portDef = pComponentBuf->pBufHeader->pInputPortPrivate;
   2459 
   2460     eError = VPP_IsValidBuffer(pComponentBuf->pBufHeader, pComponentPrivate, portDef->nPortIndex, &nIndex);
   2461     if (pComponentPrivate->toState == OMX_StateIdle) {
   2462     VPP_DPRINT("VPP_Process_FreeInBuf: VPP_IsValidBuffer %d\n", eError);
   2463     }
   2464     if ( eError !=OMX_ErrorNone) {
   2465         OMX_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter);
   2466     }
   2467     /*If Tunneling*/
   2468     if (pComponentPrivate->toState == OMX_StateIdle) {
   2469     VPP_DPRINT("tunneling %p\n", pComponentPrivate->sCompPorts[pComponentBuf->pBufHeader->nInputPortIndex].hTunnelComponent);
   2470     }
   2471     if (pComponentPrivate->sCompPorts[pComponentBuf->pBufHeader->nInputPortIndex].hTunnelComponent != NULL) {
   2472         if (OMX_StateExecuting == pComponentPrivate->curState) {
   2473             if ((!pComponentPrivate->bIsStopping) ||
   2474                     (OMX_TRUE != pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].bSelfAllocated)) {
   2475                 pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].bHolding = OMX_FALSE;
   2476                 VPP_DPRINT ("VPP::Sending INput buffer to TUNNEL component (%d)\n", pComponentPrivate->bIsStopping);
   2477 
   2478 #ifdef __PERF_INSTRUMENTATION__
   2479                 PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2480                                 pComponentBuf->pBufHeader->pBuffer,
   2481                                 0,
   2482                                 PERF_ModuleLLMM);
   2483 #endif
   2484                 if(pComponentBuf->eBufferOwner != VPP_BUFFER_CLIENT ){
   2485                     pComponentBuf->eBufferOwner = VPP_BUFFER_CLIENT;
   2486                     VPP_DPRINT("$$$VPP_UTILS: call to OMX_FillThisBuffer():: %d\n", __LINE__);
   2487                     eError = OMX_FillThisBuffer(pComponentPrivate->sCompPorts[pComponentBuf->pBufHeader->nInputPortIndex].hTunnelComponent, pComponentBuf->pBufHeader);
   2488                     VPP_DPRINT ("VPP:: buffer is sent to tunnel component\n");
   2489                 }
   2490                 else{
   2491                     VPP_DPRINT("VPP:: buffer is already in tunnel component\n");
   2492                 }
   2493             }
   2494         }
   2495     }
   2496     else {
   2497         VPP_DPRINT("pComponentPrivate->bIsEOFSent %d\n", pComponentPrivate->bIsEOFSent);
   2498         if (1) { /* if (pComponentPrivate->bIsEOFSent != 1) { */
   2499             pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].bHolding = OMX_FALSE;
   2500 
   2501 #ifdef __PERF_INSTRUMENTATION__
   2502             PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2503                             PREF(pComponentBuf->pBufHeader,pBuffer),
   2504                             0,
   2505                             PERF_ModuleHLMM);
   2506 #endif
   2507 
   2508     if (pComponentPrivate->toState == OMX_StateIdle) {
   2509             VPP_DPRINT("pComponentBuf->eBufferOwner %d (%p)\n", pComponentBuf->eBufferOwner, pComponentBuf->pBufHeader);
   2510     }
   2511             if(pComponentBuf->eBufferOwner != VPP_BUFFER_CLIENT){
   2512                 pComponentBuf->eBufferOwner = VPP_BUFFER_CLIENT;
   2513                 if (pComponentBuf->pBufHeader->pMarkData) {
   2514                    VPP_DPRINT("return marked buffer %x %d\n", pComponentBuf->pBufHeader->pMarkData, pComponentBuf->pBufHeader->nInputPortIndex);
   2515                 }
   2516                 VPP_DPRINT("VPP:: Sent buffer to the client\n");
   2517                 pComponentPrivate->cbInfo.EmptyBufferDone (pHandle,
   2518                                     pHandle->pApplicationPrivate,
   2519                                     pComponentBuf->pBufHeader
   2520                                     );
   2521     if (pComponentPrivate->toState == OMX_StateIdle) {
   2522                 VPP_DPRINT("VPP:: Sent buffer to the client\n");
   2523     }
   2524            }
   2525             else{
   2526                 VPP_DPRINT("VPP:: Buffer already with the client\n");
   2527             }
   2528         }
   2529         else {
   2530             VPP_DPRINT(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
   2531             VPP_DPRINT("%d :: Comp: Last IP Buffer: So will not be sent to app\n", __LINE__);
   2532             VPP_DPRINT(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
   2533         }
   2534     }
   2535 EXIT:
   2536     return eError;
   2537 }
   2538 
   2539 
   2540 
   2541 /**
   2542 * @VPP_ProcessFilledOutBuf() This function is called by the component  Thread whenever it
   2543 * receives the an Filled output buffer from the DSP
   2544 *
   2545 * @param pComponentPrivate  Component private data
   2546 
   2547 * @pre
   2548 *
   2549 * @post
   2550 *
   2551 * @return none
   2552 */
   2553 OMX_ERRORTYPE VPP_Process_FilledOutBuf(VPP_COMPONENT_PRIVATE* pComponentPrivate,
   2554                                        OMX_VPP_COMPONENT_BUFFER *pComponentBuf)
   2555 {
   2556     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2557     OMX_COMPONENTTYPE* pHandle = (OMX_COMPONENTTYPE*)pComponentPrivate->pHandle;
   2558     OMX_U32 nIndex;
   2559     OMX_PARAM_PORTDEFINITIONTYPE *portDef = NULL;
   2560 
   2561     VPP_DPRINT ("VPP %d :: Entering HandleDataBuf_FromLCML Function\n",__LINE__);
   2562 
   2563     portDef = pComponentBuf->pBufHeader->pOutputPortPrivate;
   2564     VPP_DPRINT("VPP::%d: Component Sending Filled Output buffer of index %lu to App\n",__LINE__,portDef->nPortIndex);
   2565     eError = VPP_IsValidBuffer(pComponentBuf->pBufHeader, pComponentPrivate, portDef->nPortIndex, &nIndex);
   2566     if ( eError !=OMX_ErrorNone){
   2567         OMX_SET_ERROR_BAIL(eError, OMX_ErrorBadParameter);
   2568     }
   2569 
   2570     if (pComponentBuf->pBufHeader->pMarkData && pComponentBuf->pBufHeader->hMarkTargetComponent == pComponentPrivate->pHandle) {
   2571         VPP_DPRINT("Send OMX_MarkEvent\n");
   2572         if (pComponentBuf->pBufHeader->nOutputPortIndex == OMX_VPP_YUV_OUTPUT_PORT) {
   2573             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2574                                         pComponentPrivate->pHandle->pApplicationPrivate,
   2575                                         OMX_EventMark,
   2576                                         OMX_VPP_YUV_OUTPUT_PORT,
   2577                                         0,
   2578                                         pComponentBuf->pBufHeader->pMarkData);
   2579             }
   2580         else { /*OMX_VPP_RGB_OUTPUT_PORT*/
   2581             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2582                                         pComponentPrivate->pHandle->pApplicationPrivate,
   2583                                         OMX_EventMark,
   2584                                         OMX_VPP_RGB_OUTPUT_PORT,
   2585                                         0,
   2586                                         pComponentBuf->pBufHeader->pMarkData);
   2587         }
   2588     }
   2589 
   2590     if(pComponentBuf->pBufHeader->nFlags & OMX_BUFFERFLAG_EOS){
   2591        VPP_DPRINT("set EOS flag at YUV output buffer\n");
   2592        pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle,
   2593                                         pComponentPrivate->pHandle->pApplicationPrivate,
   2594                                         OMX_EventBufferFlag,
   2595                                         pComponentBuf->pBufHeader->nOutputPortIndex,
   2596                                         OMX_BUFFERFLAG_EOS,
   2597                                         NULL);
   2598     }
   2599 
   2600     VPP_DPRINT("VPP: VPP_Process_FilledOutBuf: nPortIndex=%d, nIndex= %d, bHolding= %d\n", portDef->nPortIndex, nIndex, pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].bHolding);
   2601 
   2602     /*TUNNEL HERE*/
   2603     if (pComponentPrivate->sCompPorts[portDef->nPortIndex].hTunnelComponent != NULL) {
   2604         pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].bHolding = OMX_FALSE;
   2605 
   2606 
   2607 #ifdef __PERF_INSTRUMENTATION__
   2608         PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2609                         pComponentBuf->pBufHeader->pBuffer,
   2610                         pComponentBuf->pBufHeader->nFilledLen,
   2611                         PERF_ModuleLLMM);
   2612 #endif
   2613 
   2614         if((pComponentBuf->eBufferOwner != VPP_BUFFER_CLIENT) && (pComponentPrivate->toState != OMX_StateIdle)){
   2615             VPP_DPRINT("VPP::Sending Output buffer to TUNNEL component\n");
   2616             pComponentBuf->eBufferOwner = VPP_BUFFER_CLIENT;
   2617             eError = OMX_EmptyThisBuffer(pComponentPrivate->sCompPorts[pComponentBuf->pBufHeader->nOutputPortIndex].hTunnelComponent, pComponentBuf->pBufHeader);
   2618         }
   2619         else{
   2620             VPP_DPRINT("VPP:: Output buffer already with the TUNNEL component\n");
   2621         }
   2622 #if 0
   2623         FILE *fp;
   2624 
   2625         fp = fopen("mytestcv.yuv", "w");
   2626         fwrite(pComponentBuf->pBufHeader->pBuffer, 1, pComponentBuf->pBufHeader->nFilledLen, fp);
   2627         fclose(fp);
   2628 #endif
   2629     }
   2630     else {
   2631 
   2632         pComponentPrivate->sCompPorts[portDef->nPortIndex].pVPPBufHeader[nIndex].bHolding = OMX_FALSE;
   2633 
   2634 #ifdef __PERF_INSTRUMENTATION__
   2635         PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2636                         PREF(pComponentBuf->pBufHeader,pBuffer),
   2637                         PREF(pComponentBuf->pBufHeader,nFilledLen),
   2638                         PERF_ModuleHLMM);
   2639 #endif
   2640 
   2641         if(pComponentBuf->eBufferOwner != VPP_BUFFER_CLIENT){
   2642             VPP_DPRINT("VPP::Sending Output buffer to Applcation %p (%p %p)\n", pComponentBuf->pBufHeader, pComponentBuf->pBufHeader->hMarkTargetComponent, pComponentBuf->pBufHeader->pMarkData);
   2643             pComponentBuf->eBufferOwner = VPP_BUFFER_CLIENT;
   2644             pComponentPrivate->cbInfo.FillBufferDone (
   2645                                 pHandle,
   2646                                 pHandle->pApplicationPrivate,
   2647                                 pComponentBuf->pBufHeader
   2648                                 );
   2649         }
   2650         else{
   2651             VPP_DPRINT("VPP:: Buffer already with the client\n");
   2652         }
   2653 
   2654     }
   2655 
   2656 EXIT:
   2657     VPP_DPRINT ("VPP::%d :: VPP_Process_FilledOutBuf Function with eError %d\n",__LINE__, eError);
   2658     return eError;
   2659 }
   2660 
   2661 
   2662 
   2663 /* -------------------------------------------------------------------*/
   2664 /**
   2665   *  Callback() function will be called LCML component to write the msg
   2666   *
   2667   * @param msgBuffer                 This buffer will be returned by the LCML
   2668   *
   2669   * @retval OMX_NoError              Success, ready to roll
   2670   *         OMX_Error_BadParameter   The input parameter pointer is null
   2671   **/
   2672 /*-------------------------------------------------------------------*/
   2673 OMX_ERRORTYPE VPP_LCML_Callback (TUsnCodecEvent event,void * args [10])
   2674 {
   2675     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2676     OMX_U8 *pBuffer = args[1];
   2677     OMX_VPP_COMPONENT_BUFFER *pComponentBuf = NULL;
   2678 
   2679     VPP_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   2680     OMX_COMPONENTTYPE* pHandle = NULL;
   2681     LCML_DSP_INTERFACE* pLcmlDspInterface = NULL;
   2682     VPP_BUFFERDATA_PROPAGATION *pDataProp = NULL;
   2683     OMX_U8 i = 0;
   2684 
   2685     if (args[6]) {
   2686         pLcmlDspInterface = (LCML_DSP_INTERFACE*)args[6];
   2687 
   2688         pComponentPrivate = (VPP_COMPONENT_PRIVATE*)pLcmlDspInterface->pComponentPrivate;
   2689 
   2690         pHandle = (OMX_COMPONENTTYPE *)pComponentPrivate->pHandle;
   2691 
   2692     }
   2693     else {
   2694         VPP_DPRINT("wrong in LCML callback, exit\n");
   2695         goto EXIT;
   2696     }
   2697 
   2698     VPP_DPRINT ("VPP::%d :: Entering the LCML_Callback Function, event = %d\n",__LINE__, event);
   2699 
   2700     switch (event)
   2701     {
   2702     case EMMCodecBufferProcessed:
   2703         switch ((int)args[0])
   2704         {
   2705         case EMMCodecInputBuffer:
   2706             VPP_DPRINT ("VPP :: Inside the LCML_Callback EMMCodecInputBuffer\n");
   2707             VPP_DPRINT("VPP::%d :: Input: pBufferr = %p\n",__LINE__, pBuffer);
   2708             eError = VPP_GetCorresponding_LCMLHeader(pComponentPrivate, pBuffer, OMX_DirInput, &pComponentBuf, 0);
   2709             if (eError != OMX_ErrorNone) {
   2710                 VPP_DPRINT("VPP::%d :: Error: Invalid Buffer Came ...\n",__LINE__);
   2711                 goto EXIT;
   2712             }
   2713             VPP_DPRINT("VPP::%d :: Input: pLcmlHeader = %p.\n",__LINE__, pComponentBuf->pBufHeader);
   2714 
   2715             if (pComponentPrivate->bFlushComplete == OMX_FALSE && pComponentPrivate->nFlushPort == 0) {
   2716                 pComponentBuf->eBufferOwner = VPP_BUFFER_CLIENT;
   2717                 pComponentPrivate->cbInfo.EmptyBufferDone (pComponentPrivate->pHandle,
   2718                                     pComponentPrivate->pHandle->pApplicationPrivate,
   2719                                     pComponentBuf->pBufHeader
   2720                                     );
   2721                 break;
   2722             }
   2723 #ifdef __PERF_INSTRUMENTATION__
   2724             PERF_ReceivedFrame(pComponentPrivate->pPERFcomp,
   2725                                 PREF(pComponentBuf->pBufHeader,pBuffer),
   2726                                 0,
   2727                                 PERF_ModuleCommonLayer);
   2728 #endif
   2729 
   2730             pComponentBuf->eBufferOwner = VPP_BUFFER_COMPONENT_OUT;
   2731 
   2732             /*Freed Input buffers from DSP to component*/
   2733             eError = VPP_Process_FreeInBuf(pComponentPrivate, pComponentBuf);
   2734             if (eError != OMX_ErrorNone) {
   2735                 pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2736                                     pComponentPrivate->pHandle->pApplicationPrivate,
   2737                                     OMX_EventError,
   2738                                     OMX_ErrorUndefined,
   2739                                     OMX_TI_ErrorSevere,
   2740                                     NULL);
   2741                 goto EXIT;
   2742             }
   2743             break;
   2744         case EMMCodecStream1:
   2745             VPP_DPRINT ("VPP:: Inside the LCML_Callback EMMCodecInputBuffer Overlay\n");
   2746             VPP_DPRINT("VPP::%d :: Overlay: pBuffer = %p\n",__LINE__, pBuffer);
   2747             eError = VPP_GetCorresponding_LCMLHeader(pComponentPrivate, pBuffer, OMX_DirInput, &pComponentBuf,1);
   2748             if (eError != OMX_ErrorNone) {
   2749                 VPP_DPRINT("VPP::%d :: Error: Invalid Buffer Came ...\n",__LINE__);
   2750                 goto EXIT;
   2751             }
   2752             VPP_DPRINT("VPP::%d :: Input: pLcmlHeader = %p\n",__LINE__, pComponentBuf);
   2753             VPP_DPRINT("VPP::%d :: Overlay: pLcmlHeader = %p.\n",__LINE__, pComponentBuf->pBufHeader);
   2754 
   2755             if (pComponentPrivate->bFlushComplete == OMX_FALSE && pComponentPrivate->nFlushPort == 1) {
   2756                 pComponentBuf->eBufferOwner = VPP_BUFFER_CLIENT;
   2757                 pComponentPrivate->cbInfo.EmptyBufferDone (pComponentPrivate->pHandle,
   2758                                     pComponentPrivate->pHandle->pApplicationPrivate,
   2759                                     pComponentBuf->pBufHeader
   2760                                     );
   2761                 break;
   2762             }
   2763 #ifdef __PERF_INSTRUMENTATION__
   2764             PERF_ReceivedFrame(pComponentPrivate->pPERFcomp,
   2765                             PREF(pComponentBuf->pBufHeader,pBuffer),
   2766                             0,
   2767                             PERF_ModuleCommonLayer);
   2768 #endif
   2769             pComponentBuf->eBufferOwner = VPP_BUFFER_COMPONENT_OUT;
   2770 
   2771             /*Freed Input buffers from DSP to component*/
   2772             eError = VPP_Process_FreeInBuf(pComponentPrivate, pComponentBuf);
   2773             if (eError != OMX_ErrorNone) {
   2774                 pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2775                                     pComponentPrivate->pHandle->pApplicationPrivate,
   2776                                     OMX_EventError,
   2777                                     OMX_ErrorUndefined,
   2778                                     OMX_TI_ErrorSevere,
   2779                                     NULL);
   2780                 goto EXIT;
   2781             }
   2782             break;
   2783         case EMMCodecStream2:
   2784             VPP_DPRINT("VPP :: Inside the LCML_Callback EMMCodecOuputBuffer stream2 \n");
   2785             VPP_DPRINT("VPP::%d :: Output: pBufferr = %p\n",__LINE__, pBuffer);
   2786             eError = VPP_GetCorresponding_LCMLHeader(pComponentPrivate, pBuffer, OMX_DirOutput, &pComponentBuf, 2);
   2787             if (eError != OMX_ErrorNone) {
   2788                 VPP_DPRINT("VPP::%d :: Error: Invalid Buffer Came ...\n",__LINE__);
   2789                 goto EXIT;
   2790             }
   2791             pComponentBuf->pBufHeader->nFilledLen = (int)args[8];
   2792             VPP_DPRINT("VPP::%d :: Output(2): pLcmlHeader = %p\n",__LINE__, pComponentBuf);
   2793             VPP_DPRINT("VPP::%d :: Output: Filled Len = %ld\n",__LINE__, pComponentBuf->pBufHeader->nFilledLen);
   2794 
   2795             if(pComponentBuf->eBufferOwner == VPP_BUFFER_DSP){
   2796                 pComponentPrivate->nOutRGBBufferCount ++;
   2797             }
   2798             VPP_DPRINT("RGB Filled Data from DSP \n");
   2799             VPP_DPRINT("buffer summary (LCML for output buffer %p) %d %d %d %d\n", pComponentBuf->pBufHeader,
   2800                     pComponentPrivate->nInYUVBufferCount,
   2801                     pComponentPrivate->nInRGBBufferCount,
   2802                     pComponentPrivate->nOutYUVBufferCount,
   2803                     pComponentPrivate->nOutRGBBufferCount);
   2804 
   2805 
   2806             for (i = 0; i < pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.nBufferCountActual; i ++) {
   2807                 pDataProp = &(pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].sBufferDataProp[i]);
   2808                 if (pDataProp->buffer_idRGB == pComponentPrivate->nOutRGBBufferCount) {
   2809                     VPP_DPRINT("Output RGB buffer %d has data from Input port. \nFlag=%x, nTickCount=%ld, nTimeStamp=%Ld\n",
   2810                                pDataProp->buffer_idRGB,
   2811                                pDataProp->flag,
   2812                                pDataProp->nTickCount,
   2813                                pDataProp->nTimeStamp);
   2814                     pComponentBuf->pBufHeader->nFlags = pDataProp->flag;
   2815                     pComponentBuf->pBufHeader->pMarkData = pDataProp->pMarkData;
   2816                     pComponentBuf->pBufHeader->hMarkTargetComponent = pDataProp->hMarkTargetComponent;
   2817                     pComponentBuf->pBufHeader->nTickCount = pDataProp->nTickCount;
   2818                     pComponentBuf->pBufHeader->nTimeStamp = pDataProp->nTimeStamp;
   2819                     pDataProp->buffer_idRGB = 0xFFFFFFFF;
   2820                     break;
   2821                 }
   2822             }
   2823 
   2824             for (i = 0; i < pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.nBufferCountActual; i ++) {
   2825                 pDataProp = &(pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].sBufferDataProp[i]);
   2826                 if (pDataProp->buffer_idRGB == pComponentPrivate->nOutRGBBufferCount) {
   2827                     VPP_DPRINT("Output RGB buffer %d has data from Overlay port. \nFlag=%x, nTickCount=%ld, nTimeStamp=%Ld\n",
   2828                                pDataProp->buffer_idRGB,
   2829                                pDataProp->flag,
   2830                                pDataProp->nTickCount,
   2831                                pDataProp->nTimeStamp);
   2832                     pComponentBuf->pBufHeader->nFlags |= pDataProp->flag;
   2833                     /*if both input ports are been mark RGB output port propagate Input overlay mark*/
   2834                     pComponentBuf->pBufHeader->pMarkData = pDataProp->pMarkData;
   2835                     pComponentBuf->pBufHeader->hMarkTargetComponent = pDataProp->hMarkTargetComponent;
   2836 #if 0
   2837                     if(pComponentBuf->pBufHeader->hMarkTargetComponent == NULL){ /*OMX_VPP_INPUT_PORT has preference while marking data*/
   2838                         pComponentBuf->pBufHeader->pMarkData = pDataProp->pMarkData;
   2839                         pComponentBuf->pBufHeader->hMarkTargetComponent = pDataProp->hMarkTargetComponent;
   2840                     }
   2841 #endif
   2842                     pComponentBuf->pBufHeader->nTickCount = pDataProp->nTickCount;
   2843                     pComponentBuf->pBufHeader->nTimeStamp = pDataProp->nTimeStamp;
   2844                     pDataProp->buffer_idRGB = 0xFFFFFFFF;
   2845                     break;
   2846                 }
   2847             }
   2848 
   2849             if (pComponentPrivate->bFlushComplete == OMX_FALSE && pComponentPrivate->nFlushPort == 2) {
   2850                 pComponentBuf->eBufferOwner = VPP_BUFFER_CLIENT;
   2851                 pComponentPrivate->cbInfo.FillBufferDone (pComponentPrivate->pHandle,
   2852                                     pComponentPrivate->pHandle->pApplicationPrivate,
   2853                                     pComponentBuf->pBufHeader
   2854                                     );
   2855                 break;
   2856             }
   2857 
   2858 #ifdef __PERF_INSTRUMENTATION__
   2859             PERF_ReceivedFrame(pComponentPrivate->pPERFcomp,
   2860                             pComponentBuf->pBufHeader->pBuffer,
   2861                             pComponentBuf->pBufHeader->nFilledLen,
   2862                             PERF_ModuleCommonLayer);
   2863                             pComponentPrivate->lcml_nCntOpReceived++; /*CRITICAL: increment Op counter!!! */
   2864             if ((pComponentPrivate->lcml_nCntIp >= 1) &&
   2865                     (pComponentPrivate->lcml_nCntOpReceived == 1)) {
   2866                 PERF_Boundary(pComponentPrivate->pPERFcomp,
   2867                             PERF_BoundaryStart | PERF_BoundarySteadyState);
   2868             }
   2869 #endif
   2870 
   2871             pComponentBuf->eBufferOwner = VPP_BUFFER_COMPONENT_OUT;
   2872 
   2873             /* Filled Output buffer from DSP to Component */
   2874             eError = VPP_Process_FilledOutBuf(pComponentPrivate, pComponentBuf);
   2875             if (eError != OMX_ErrorNone) {
   2876                 pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2877                                                        pComponentPrivate->pHandle->pApplicationPrivate,
   2878                                                        OMX_EventError,
   2879                                                        OMX_ErrorUndefined,
   2880                                                        OMX_TI_ErrorSevere,
   2881                                                        NULL);
   2882                 goto EXIT;
   2883             }
   2884             break;
   2885         case EMMCodecStream3:
   2886             VPP_DPRINT ("VPP::Inside the LCML_Callback EMMCodecOuputBuffer stream3\n");
   2887             VPP_DPRINT("VPP::%d :: Output: pBufferr = %p\n",__LINE__, pBuffer);
   2888             eError = VPP_GetCorresponding_LCMLHeader(pComponentPrivate, pBuffer, OMX_DirOutput, &pComponentBuf,3);
   2889             if (eError != OMX_ErrorNone) {
   2890                 VPP_DPRINT("VPP::%d :: Error: Invalid Buffer Came ...\n",__LINE__);
   2891                 goto EXIT;
   2892             }
   2893             pComponentBuf->pBufHeader->nFilledLen = (int)args[8];
   2894             VPP_DPRINT("VPP::%d :: Output(3): pLcmlHeader = %p\n",__LINE__, pComponentBuf);
   2895             VPP_DPRINT("VPP::%d :: Output: Filled Len = %ld\n",__LINE__, pComponentBuf->pBufHeader->nFilledLen);
   2896 
   2897             if(pComponentBuf->eBufferOwner == VPP_BUFFER_DSP){
   2898                 pComponentPrivate->nOutYUVBufferCount ++;
   2899             }
   2900             VPP_DPRINT("YUV Filled Data from DSP \n");
   2901             VPP_DPRINT("buffer summary (LCML for output buffer %p) %d %d %d %d\n", pComponentBuf->pBufHeader,
   2902                     pComponentPrivate->nInYUVBufferCount,
   2903                     pComponentPrivate->nInRGBBufferCount,
   2904                     pComponentPrivate->nOutYUVBufferCount,
   2905                     pComponentPrivate->nOutRGBBufferCount);
   2906 
   2907             for (i = 0; i < pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.nBufferCountActual; i ++) {
   2908                 pDataProp = &(pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].sBufferDataProp[i]);
   2909                 if (pDataProp->buffer_idYUV == pComponentPrivate->nOutYUVBufferCount) {
   2910                     VPP_DPRINT("Output YUV buffer %d has data from Input port. \nFlag=%x, nTickCount=%ld, nTimeStamp=%Ld\n\n",
   2911                                pDataProp->buffer_idYUV,
   2912                                pDataProp->flag,
   2913                                pDataProp->nTickCount,
   2914                                pDataProp->nTimeStamp);
   2915 
   2916                     pComponentBuf->pBufHeader->nFlags = pDataProp->flag;
   2917                     pComponentBuf->pBufHeader->pMarkData = pDataProp->pMarkData;
   2918                     pComponentBuf->pBufHeader->hMarkTargetComponent = pDataProp->hMarkTargetComponent;
   2919                     pComponentBuf->pBufHeader->nTickCount = pDataProp->nTickCount;
   2920                     pComponentBuf->pBufHeader->nTimeStamp = pDataProp->nTimeStamp;
   2921                     pDataProp->buffer_idYUV = 0xFFFFFFFF;
   2922                     break;
   2923                 }
   2924             }
   2925 
   2926             for (i = 0; i < pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.nBufferCountActual; i ++) {
   2927                 pDataProp = &(pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].sBufferDataProp[i]);
   2928                 if (pDataProp->buffer_idYUV == pComponentPrivate->nOutYUVBufferCount) {
   2929                     VPP_DPRINT("Output YUV buffer %d has data from Overlay port. \nFlag=%x, nTickCount=%ld, nTimeStamp=%Ld\n\n",
   2930                                pDataProp->buffer_idYUV,
   2931                                pDataProp->flag,
   2932                                pDataProp->nTickCount,
   2933                                pDataProp->nTimeStamp);
   2934                     pComponentBuf->pBufHeader->nFlags |= pDataProp->flag;
   2935                     if(pComponentBuf->pBufHeader->hMarkTargetComponent == NULL){ /*OMX_VPP_INPUT_PORT has preference while marking data*/
   2936                         pComponentBuf->pBufHeader->pMarkData = pDataProp->pMarkData;
   2937                         pComponentBuf->pBufHeader->hMarkTargetComponent = pDataProp->hMarkTargetComponent;
   2938                     }
   2939                     pComponentBuf->pBufHeader->nTickCount = pDataProp->nTickCount;
   2940                     pComponentBuf->pBufHeader->nTimeStamp = pDataProp->nTimeStamp;
   2941                     pDataProp->buffer_idYUV = 0xFFFFFFFF;
   2942                     break;
   2943                 }
   2944             }
   2945 
   2946 
   2947             if (pComponentPrivate->bFlushComplete == OMX_FALSE && pComponentPrivate->nFlushPort == 3) {
   2948                 pComponentBuf->eBufferOwner = VPP_BUFFER_CLIENT;
   2949                 pComponentPrivate->cbInfo.FillBufferDone (pComponentPrivate->pHandle,
   2950                                     pComponentPrivate->pHandle->pApplicationPrivate,
   2951                                     pComponentBuf->pBufHeader
   2952                                     );
   2953                 break;
   2954             }
   2955 
   2956             #ifdef __PERF_INSTRUMENTATION__
   2957             PERF_ReceivedFrame(pComponentPrivate->pPERFcomp,
   2958                             pComponentBuf->pBufHeader->pBuffer,
   2959                             pComponentBuf->pBufHeader->nFilledLen,
   2960                             PERF_ModuleCommonLayer);
   2961             pComponentPrivate->lcml_nCntOpReceived++; /*CRITICAL: increment Op counter!!! */
   2962             if ((pComponentPrivate->lcml_nCntIp >= 1) &&
   2963                     (pComponentPrivate->lcml_nCntOpReceived == 1)) {
   2964                 PERF_Boundary(pComponentPrivate->pPERFcomp,
   2965                             PERF_BoundaryStart | PERF_BoundarySteadyState);
   2966             }
   2967 #endif
   2968 
   2969            pComponentBuf->eBufferOwner = VPP_BUFFER_COMPONENT_OUT;
   2970 
   2971             /* Filled Output buffer from DSP to Component */
   2972             eError = VPP_Process_FilledOutBuf(pComponentPrivate, pComponentBuf);
   2973             if (eError != OMX_ErrorNone) {
   2974                 pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2975                                                        pComponentPrivate->pHandle->pApplicationPrivate,
   2976                                                        OMX_EventError,
   2977                                                        OMX_ErrorUndefined,
   2978                                                        OMX_TI_ErrorSevere,
   2979                                                        NULL);
   2980                 goto EXIT;
   2981             }
   2982             break;
   2983         }
   2984         break;
   2985     case EMMCodecProcessingStoped:
   2986         VPP_DPRINT("VPP::%d :: Comp: Inside the LCML_Callback: EMMCodecProcessingStopped\n",__LINE__);
   2987         VPP_DPRINT("VPP::%d :: VPP: State has been Set to Idle\n",__LINE__);
   2988         if (pComponentPrivate->toState == OMX_StateIdle) {
   2989             pComponentPrivate->ExeToIdleFlag |= VPP_DSPSTOP;
   2990             VPP_DPRINT("LCML_Callback: pComponentPrivate->ExeToIdleFlag  = %x\n", pComponentPrivate->ExeToIdleFlag);
   2991 
   2992             pthread_mutex_lock(&pComponentPrivate->vpp_mutex);
   2993             pthread_cond_signal(&pComponentPrivate->stop_cond);
   2994             pthread_mutex_unlock(&pComponentPrivate->vpp_mutex);
   2995 
   2996         } else {
   2997             pComponentPrivate->bDisable = OMX_TRUE;
   2998         }
   2999         break;
   3000     case EMMCodecDspError:
   3001         VPP_DPRINT("VPP::LCML_Callback.  Received EMMCodecDSPError\n");
   3002         VPP_DPRINT("EMMCodec Args -> %x, %x, %x\n", (int)args[0], (int)args[4], (int)args[5]);
   3003         if ((int)args[4] != 0x1 || (int)args[5] != 0x500) {
   3004            pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   3005                                      pComponentPrivate->pHandle->pApplicationPrivate,
   3006                                      OMX_EventError,
   3007                                      OMX_ErrorHardware,
   3008                                      OMX_TI_ErrorCritical,
   3009                                      NULL);
   3010 
   3011             pComponentPrivate->curState  = OMX_StateInvalid;
   3012             pComponentPrivate->cbInfo.EventHandler(pHandle,
   3013                                                    pHandle->pApplicationPrivate,
   3014                                                    OMX_EventError,
   3015                                                    OMX_ErrorInvalidState,
   3016                                                    OMX_TI_ErrorCritical,
   3017                                                    "DSP Hardware Error");
   3018             goto EXIT;
   3019        }
   3020 #ifdef DSP_MMU_FAULT_HANDLING
   3021         /* Cheking for MMU_fault */
   3022         if((args[4] == (void *)NULL) && (args[5] == (void*)NULL)) {
   3023             VPP_DPRINT("DSP MMU_Fault");
   3024             pComponentPrivate->curState = OMX_StateInvalid;
   3025             pComponentPrivate->cbInfo.EventHandler(pHandle,
   3026                                                    pHandle->pApplicationPrivate,
   3027                                                    OMX_EventError,
   3028                                                    OMX_ErrorInvalidState,
   3029                                                    OMX_TI_ErrorCritical,
   3030                                                    "DSP MMU FAULT");
   3031         }
   3032 #endif
   3033         break;
   3034     case EMMCodecInternalError:
   3035         VPP_DPRINT("VPP::LCML_Callback.  EMMCodecInternalError\n");
   3036         eError = OMX_ErrorHardware;
   3037         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   3038                             pComponentPrivate->pHandle->pApplicationPrivate,
   3039                             OMX_EventError,
   3040                             OMX_ErrorHardware,
   3041                             OMX_TI_ErrorCritical,
   3042                             NULL);
   3043         goto EXIT;
   3044         break;
   3045     case EMMCodecInitError:
   3046         VPP_DPRINT("VPP::LCML_Callback.  EMMCodecInitError\n");
   3047         eError = OMX_ErrorHardware;
   3048         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   3049                             pComponentPrivate->pHandle->pApplicationPrivate,
   3050                             OMX_EventError,
   3051                             OMX_ErrorHardware,
   3052                             OMX_TI_ErrorCritical,
   3053                             NULL);
   3054         goto EXIT;
   3055         break;
   3056     case EMMCodecDspMessageRecieved:
   3057         VPP_DPRINT("VPP::LCML_Callback.  EMMCodecDspMessageReceived\n");
   3058         break;
   3059     case EMMCodecProcessingStarted:
   3060         VPP_DPRINT("VPP::LCML_Callback.  EMMCodecProcessingStarted\n");
   3061         break;
   3062     case EMMCodecProcessingPaused:
   3063         VPP_DPRINT("VPP::LCML_Callback.  EMMCodecProcessingPaused\n");
   3064         if (pComponentPrivate->toState == OMX_StatePause) {
   3065             pComponentPrivate->curState = OMX_StatePause;
   3066             VPP_DPRINT ("%d :: The component %p is paused after get stop from DSP\n",__LINE__, pHandle);
   3067             VPP_DPRINT("LCML_Callback: pComponentPrivate->ExeToIdleFlag  = %x\n", pComponentPrivate->ExeToIdleFlag);
   3068 
   3069             pComponentPrivate->cbInfo.EventHandler (
   3070                                 pHandle,
   3071                                 pHandle->pApplicationPrivate,
   3072                                 OMX_EventCmdComplete,
   3073                                 OMX_ErrorNone,
   3074                                 pComponentPrivate->curState,
   3075                                 "NULL");
   3076         }
   3077         break;
   3078     case EMMCodecProcessingEof:
   3079         VPP_DPRINT("VPP::LCML_Callback.  EMMCodecProcessingEof\n");
   3080         break;
   3081     case EMMCodecBufferNotProcessed:
   3082         VPP_DPRINT("VPP::LCML_Callback.  EMMCodecBufferNotProcessed\n");
   3083         break;
   3084     case EMMCodecAlgCtrlAck:
   3085         VPP_DPRINT("VPP::LCML_Callback.  EMMCodecAlgCtrlAck\n");
   3086         pComponentPrivate->CodecAlgCtrlAck = 1;
   3087         break;
   3088     case EMMCodecStrmCtrlAck:
   3089         VPP_DPRINT("VPP::LCML_Callback.  EMMCodecStrmCtrlAck\n");
   3090 #if 1
   3091         if (1) { /* ((int)args[0] == USN_ERR_NONE) { */
   3092             VPP_DPRINT("Callback: EMMCodecStrmCtrlAck\n");
   3093             pComponentPrivate->bFlushComplete = OMX_TRUE;
   3094         } else {
   3095             VPP_DPRINT("callback error %x\n", args[0]);
   3096         }
   3097 #endif
   3098         break;
   3099     default:
   3100         VPP_DPRINT ("VPP::Comp: Inside the LCML_Callback: EVENT UNKNOWN %d\n", event);
   3101         break;
   3102     }
   3103 
   3104 EXIT:
   3105     VPP_DPRINT ("VPP::%d :: Exiting the LCML_Callback Function\n",__LINE__);
   3106     return eError;
   3107 }
   3108 
   3109 
   3110 
   3111 /* -------------------------------------------------------------------*/
   3112 /**
   3113   *  VPP_GetCorresponding_LCMLHeader() function retrun correponding Parameter buffer stored
   3114   *
   3115   * @param pBuffer                 This buffer will be returned by the LCML
   3116            eDir
   3117        ppLcmlHdr               pointer where LCML header is returned
   3118   *
   3119   * @retval OMX_NoError              Success, ready to roll
   3120   *         OMX_Error_BadParameter   The input parameter pointer is null
   3121   **/
   3122 /*-------------------------------------------------------------------*/
   3123 OMX_ERRORTYPE VPP_GetCorresponding_LCMLHeader(VPP_COMPONENT_PRIVATE* pComponentPrivate,
   3124                                               OMX_U8 *pBuffer,
   3125                                               OMX_DIRTYPE eDir,
   3126                                               OMX_VPP_COMPONENT_BUFFER** ppCmpBuf,
   3127                                               OMX_U32 Index)
   3128 {
   3129     OMX_ERRORTYPE eError = OMX_ErrorNone;
   3130     OMX_VPP_COMPONENT_BUFFER* pComponentBuffer = NULL;
   3131     int i = 0 ;
   3132     int nBuf = pComponentPrivate->sCompPorts[Index].nBufferCount;
   3133 
   3134     VPP_DPRINT("VPP:: Buffer Count :: %ld\n",nBuf);
   3135 
   3136     VPP_DPRINT("VPP:: Index of  Buffer Type :: %ld\n",Index);
   3137 
   3138     for (i=0; i<nBuf; i++) {
   3139         pComponentBuffer = &pComponentPrivate->sCompPorts[Index].pVPPBufHeader[i];
   3140         if (pBuffer == pComponentBuffer->pBufHeader->pBuffer) {
   3141             *ppCmpBuf = pComponentBuffer;
   3142             VPP_DPRINT("VPP::%d::Corresponding LCML Header Found\n",__LINE__);
   3143             goto EXIT;
   3144         }
   3145     }
   3146 
   3147     VPP_DPRINT("VPP: %d, Haven't found the header...\n", __LINE__);
   3148     eError = OMX_ErrorMax;
   3149 EXIT:
   3150     return eError;
   3151 }
   3152 
   3153 
   3154 
   3155 /* -------------------------------------------------------------------*/
   3156 /**
   3157   *  GetLCMLHandle() function will be called to load LCML component
   3158   *
   3159   *
   3160   *
   3161   * @retval OMX_NoError              Success, ready to roll
   3162   *         OMX_ErrorUndefined    The input parameter pointer is null
   3163   **/
   3164 /*-------------------------------------------------------------------*/
   3165 OMX_HANDLETYPE VPP_GetLCMLHandle(VPP_COMPONENT_PRIVATE* pComponentPrivate)
   3166 {
   3167 #ifndef UNDER_CE
   3168     void *handle;
   3169     OMX_ERRORTYPE (*fpGetHandle)(OMX_HANDLETYPE);
   3170     OMX_HANDLETYPE pHandle = NULL;
   3171     char *error = NULL;
   3172     OMX_ERRORTYPE eError;
   3173 
   3174     handle = dlopen("libLCML.so", RTLD_LAZY);
   3175     if (!handle) {
   3176         fputs(dlerror(), stderr);
   3177         goto EXIT;
   3178     }
   3179     fpGetHandle = dlsym (handle, "GetHandle");
   3180     if ((error = dlerror()) != NULL) {
   3181         if(fpGetHandle){
   3182                 dlclose(handle);
   3183                 handle = NULL;
   3184             }
   3185         fputs(error, stderr);
   3186         goto EXIT;
   3187     }
   3188     eError = (*fpGetHandle)(&pHandle);
   3189     if(eError != OMX_ErrorNone) {
   3190         eError = OMX_ErrorUndefined;
   3191         VPP_DPRINT("eError != OMX_ErrorNone...\n");
   3192         pHandle = NULL;
   3193         goto EXIT;
   3194     }
   3195     pComponentPrivate->pDllHandle = handle;
   3196     pComponentPrivate->pLCML = (void*)pHandle;
   3197     pComponentPrivate->pLCML->pComponentPrivate = (VPP_COMPONENT_PRIVATE *)pComponentPrivate;
   3198 
   3199 EXIT:
   3200     return pHandle;
   3201 #else
   3202 
   3203     typedef OMX_ERRORTYPE (*LPFNDLLFUNC1)(OMX_HANDLETYPE);
   3204     OMX_HANDLETYPE pHandle = NULL;
   3205     OMX_ERRORTYPE eError;
   3206     LPFNDLLFUNC1 fpGetHandle1;
   3207 
   3208     g_hLcmlDllHandle = LoadLibraryEx(TEXT("OAF_BML.dll"), NULL, 0);
   3209     if (g_hLcmlDllHandle == NULL) {
   3210         VPP_DPRINT("BML Load Failed!!!\n");
   3211         return pHandle;
   3212     }
   3213 
   3214     fpGetHandle1 = (LPFNDLLFUNC1)GetProcAddress(g_hLcmlDllHandle,TEXT("GetHandle"));
   3215     if (!fpGetHandle1) {
   3216         FreeLibrary(g_hLcmlDllHandle);
   3217         g_hLcmlDllHandle = NULL;
   3218         return pHandle;
   3219     }
   3220 
   3221     eError = fpGetHandle1(&pHandle);
   3222     if(eError != OMX_ErrorNone) {
   3223         FreeLibrary(g_hLcmlDllHandle);
   3224         g_hLcmlDllHandle = NULL;
   3225         eError = OMX_ErrorUndefined;
   3226         VPP_DPRINT("eError != OMX_ErrorNone...\n");
   3227         pHandle = NULL;
   3228         goto EXIT;
   3229     }
   3230 
   3231     (LCML_DSP_INTERFACE*)pComponentPrivate->pLCML = (LCML_DSP_INTERFACE*)pHandle;
   3232     pComponentPrivate->pLCML->pComponentPrivate = (VPP_COMPONENT_PRIVATE *)pComponentPrivate;
   3233 EXIT:
   3234     return pHandle;
   3235 #endif
   3236 }
   3237 
   3238 
   3239 
   3240 OMX_ERRORTYPE VPP_Initialize_PrivateStruct(VPP_COMPONENT_PRIVATE *pComponentPrivate)
   3241 {
   3242     int port;
   3243     int buffers;
   3244 
   3245     OMX_ERRORTYPE eError=OMX_ErrorNone;
   3246 
   3247     OMX_INIT_STRUCT(pComponentPrivate->pPortParamTypeVideo, OMX_PORT_PARAM_TYPE);
   3248     pComponentPrivate->pPortParamTypeVideo->nPorts           = NUM_OF_VPP_PORTS;
   3249     pComponentPrivate->pPortParamTypeVideo->nStartPortNumber = 0;
   3250 
   3251     OMX_INIT_STRUCT(pComponentPrivate->pPortParamTypeImage, OMX_PORT_PARAM_TYPE);
   3252     pComponentPrivate->pPortParamTypeImage->nPorts           = 0;
   3253     pComponentPrivate->pPortParamTypeImage->nStartPortNumber = -1;
   3254 
   3255     OMX_INIT_STRUCT(pComponentPrivate->pPortParamTypeAudio, OMX_PORT_PARAM_TYPE);
   3256     pComponentPrivate->pPortParamTypeAudio->nPorts           = 0;
   3257     pComponentPrivate->pPortParamTypeAudio->nStartPortNumber = -1;
   3258 
   3259     OMX_INIT_STRUCT(pComponentPrivate->pPortParamTypeOthers, OMX_PORT_PARAM_TYPE);
   3260     pComponentPrivate->pPortParamTypeOthers->nPorts           = 0;
   3261     pComponentPrivate->pPortParamTypeOthers->nStartPortNumber = -1;
   3262     OMX_INIT_STRUCT(pComponentPrivate->pCrop, OMX_CONFIG_RECTTYPE);
   3263     pComponentPrivate->pCrop->nWidth = DEFAULT_WIDTH;
   3264     pComponentPrivate->pCrop->nHeight = 220;
   3265 
   3266     /* Set component version */
   3267     pComponentPrivate->ComponentVersion.s.nVersionMajor = VPP_MAJOR_VER;
   3268     pComponentPrivate->ComponentVersion.s.nVersionMinor = VPP_MINOR_VER;
   3269     pComponentPrivate->ComponentVersion.s.nRevision     = VPP_REVISION;
   3270     pComponentPrivate->ComponentVersion.s.nStep         = VPP_STEP;
   3271 
   3272 
   3273     /* Set Default values for each port supports qcif size and two streams */
   3274     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.nPortIndex         = OMX_VPP_INPUT_PORT;
   3275     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.eDir               = OMX_DirInput;
   3276     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.eDomain            = OMX_PortDomainVideo;
   3277     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.nBufferCountActual = MIN_NUM_OF_VPP_BUFFERS;
   3278     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.nBufferCountMin    = MIN_NUM_OF_VPP_BUFFERS;
   3279     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.nBufferSize        = DEFAULT_WIDTH * 220*1.5;
   3280     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.bEnabled           = OMX_TRUE;
   3281     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.bPopulated         = OMX_FALSE;
   3282     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.format.video.nFrameWidth  = DEFAULT_WIDTH;
   3283     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.format.video.nFrameHeight = 220;
   3284     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.format.video.nStride = 176;
   3285     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.format.video.nSliceHeight = 16;
   3286     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.format.video.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;/*OMX_COLOR_FormatCbYCrY;*/
   3287     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].pPortDef.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
   3288     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].eSupplierSetting            = OMX_BufferSupplyInput;
   3289     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].hTunnelComponent            = NULL;
   3290     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].nReturnedBufferCount        = 0;
   3291     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_PORT].eMirror                           = OMX_MirrorNone;
   3292 
   3293     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.nPortIndex  = OMX_VPP_INPUT_OVERLAY_PORT;
   3294     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.eDir        = OMX_DirInput;
   3295     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.eDomain     = OMX_PortDomainVideo;
   3296     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.nBufferCountActual = MIN_NUM_OF_VPP_BUFFERS;
   3297     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.nBufferCountMin    = MIN_NUM_OF_VPP_BUFFERS;
   3298     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.nBufferSize =  DEFAULT_HEIGHT *DEFAULT_WIDTH * 3;
   3299     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.bEnabled    = OMX_TRUE;
   3300     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.bPopulated  = OMX_FALSE;
   3301     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.format.video.nFrameWidth  = DEFAULT_WIDTH;
   3302     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.format.video.nFrameHeight = DEFAULT_HEIGHT;
   3303     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.format.video.eColorFormat = OMX_COLOR_Format24bitRGB888;
   3304     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].pPortDef.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
   3305     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].eSupplierSetting            = OMX_BufferSupplyInput;
   3306     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].hTunnelComponent            = NULL;
   3307 
   3308     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].nReturnedBufferCount = 0;
   3309     pComponentPrivate->sCompPorts[OMX_VPP_INPUT_OVERLAY_PORT].eMirror                           = OMX_MirrorNone;
   3310 
   3311     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.nPortIndex  = OMX_VPP_RGB_OUTPUT_PORT;
   3312     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.eDir        = OMX_DirOutput;
   3313     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.eDomain     = OMX_PortDomainVideo;
   3314     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.nBufferCountActual =MIN_NUM_OF_VPP_BUFFERS;
   3315     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.nBufferCountMin =  MIN_NUM_OF_VPP_BUFFERS;
   3316     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.nBufferSize = DEFAULT_HEIGHT *DEFAULT_WIDTH *2;
   3317     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.bEnabled    = OMX_TRUE;
   3318     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.bPopulated  = OMX_FALSE;
   3319     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.format.video.nFrameWidth  = DEFAULT_WIDTH;
   3320     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.format.video.nFrameHeight = DEFAULT_HEIGHT;
   3321     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.format.video.eColorFormat = OMX_COLOR_Format16bitRGB565;
   3322     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].pPortDef.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
   3323     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].eSupplierSetting     = OMX_BufferSupplyInput;
   3324     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].hTunnelComponent     = NULL;
   3325     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].nReturnedBufferCount = 0;
   3326     pComponentPrivate->sCompPorts[OMX_VPP_RGB_OUTPUT_PORT].eMirror                           = OMX_MirrorNone;
   3327 
   3328     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.nPortIndex  = OMX_VPP_YUV_OUTPUT_PORT;
   3329     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.eDir        = OMX_DirOutput;
   3330     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.eDomain     = OMX_PortDomainVideo;
   3331     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.nBufferCountActual = 1;
   3332     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.nBufferCountMin = 1;
   3333     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.nBufferSize = (DEFAULT_HEIGHT *DEFAULT_WIDTH *2);
   3334     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.bEnabled    = OMX_TRUE;
   3335     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.bPopulated  = OMX_FALSE;
   3336     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.format.video.nFrameWidth = DEFAULT_WIDTH;
   3337     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.format.video.nFrameHeight = DEFAULT_HEIGHT;
   3338     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.format.video.eColorFormat = OMX_COLOR_FormatCbYCrY;
   3339     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].pPortDef.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
   3340     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].eSupplierSetting     = OMX_BufferSupplyInput;
   3341     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].hTunnelComponent     = NULL;
   3342     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].nReturnedBufferCount = 0;
   3343     pComponentPrivate->sCompPorts[OMX_VPP_YUV_OUTPUT_PORT].eMirror                           = OMX_MirrorNone;
   3344 
   3345 
   3346     /* Set pInPortFormat defaults */
   3347     OMX_INIT_STRUCT(pComponentPrivate->pInPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
   3348     pComponentPrivate->pInPortFormat->nPortIndex   = OMX_VPP_INPUT_PORT;
   3349     pComponentPrivate->pInPortFormat->nIndex       = 9;
   3350     pComponentPrivate->pInPortFormat->eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;/*OMX_COLOR_FormatCbYCrY; */
   3351     pComponentPrivate->pInPortFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
   3352 
   3353 
   3354     OMX_INIT_STRUCT(pComponentPrivate->pInPortOverlayFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
   3355     pComponentPrivate->pInPortOverlayFormat->nPortIndex   = OMX_VPP_INPUT_OVERLAY_PORT;
   3356     pComponentPrivate->pInPortOverlayFormat->nIndex       = 1;
   3357     pComponentPrivate->pInPortOverlayFormat->eColorFormat = OMX_COLOR_Format24bitRGB888;
   3358     pComponentPrivate->pInPortOverlayFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
   3359 
   3360     /* Set pOutPortFormat defaults */
   3361     OMX_INIT_STRUCT(pComponentPrivate->pOutPortRGBFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
   3362     pComponentPrivate->pOutPortRGBFormat->nPortIndex   = OMX_VPP_RGB_OUTPUT_PORT;
   3363     pComponentPrivate->pOutPortRGBFormat->nIndex       = 8;
   3364     pComponentPrivate->pOutPortRGBFormat->eColorFormat = OMX_COLOR_Format16bitRGB565;
   3365     pComponentPrivate->pOutPortRGBFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
   3366 
   3367     /* Set pOutPortFormat defaults */
   3368     OMX_INIT_STRUCT(pComponentPrivate->pOutPortYUVFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
   3369     pComponentPrivate->pOutPortYUVFormat->nPortIndex   = OMX_VPP_YUV_OUTPUT_PORT;
   3370     pComponentPrivate->pOutPortYUVFormat->nIndex       = 2;
   3371     pComponentPrivate->pOutPortYUVFormat->eColorFormat = OMX_COLOR_FormatCbYCrY;
   3372     pComponentPrivate->pOutPortYUVFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
   3373 
   3374     /*Set sScale defaults*/
   3375     pComponentPrivate->sScale.nSize = sizeof(OMX_CONFIG_SCALEFACTORTYPE);
   3376     pComponentPrivate->sScale.nVersion.s.nVersionMajor = VPP_MAJOR_VER;
   3377     pComponentPrivate->sScale.nVersion.s.nVersionMinor = VPP_MINOR_VER;
   3378     pComponentPrivate->sScale.nVersion.s.nRevision = VPP_REVISION;
   3379     pComponentPrivate->sScale.nVersion.s.nStep = VPP_STEP;
   3380     pComponentPrivate->sScale.xHeight = 0;
   3381     pComponentPrivate->sScale.xWidth = 0;
   3382 
   3383     /* Set pPriorityMgmt defaults */
   3384     OMX_INIT_STRUCT(pComponentPrivate->pPriorityMgmt, OMX_PRIORITYMGMTTYPE);
   3385     pComponentPrivate->pPriorityMgmt->nGroupPriority = 0;
   3386     pComponentPrivate->pPriorityMgmt->nGroupID       = 0;
   3387 
   3388     pComponentPrivate->pMarkData             = NULL;
   3389     pComponentPrivate->hMarkTargetComponent  = NULL;
   3390     pComponentPrivate->bIsStopping = 0;
   3391 
   3392     pComponentPrivate->nInputFrame = 0;
   3393     pComponentPrivate->nOverlayFrame = 0;
   3394     pComponentPrivate->nInYUVBufferCount = 0;
   3395     pComponentPrivate->nInRGBBufferCount = 0;
   3396     pComponentPrivate->nOutYUVBufferCount = 0;
   3397     pComponentPrivate->nOutRGBBufferCount = 0;
   3398 
   3399     pComponentPrivate->nFlushPort = OMX_NOPORT;
   3400 
   3401     pthread_mutex_init(&pComponentPrivate->vpp_mutex, NULL);
   3402     pthread_cond_init(&pComponentPrivate->stop_cond, NULL);
   3403     pthread_mutex_init(&pComponentPrivate->buf_mutex, NULL);
   3404 
   3405     /* Set pInBufSupplier defaults */
   3406     for(port=0; port<NUM_OF_VPP_PORTS; port++) {
   3407         for (buffers = 0; buffers < NUM_OF_VPP_BUFFERS; buffers++) {
   3408             pComponentPrivate->sCompPorts[port].pVPPBufHeader[buffers].pBufHeader = NULL;
   3409             pComponentPrivate->sCompPorts[port].pVPPBufHeader[buffers].pBufferStart = NULL;
   3410             pComponentPrivate->sCompPorts[port].nBufferCount                      = 0;
   3411             pComponentPrivate->sCompPorts[port].nBufSupplier                      = OMX_FALSE;
   3412         }
   3413     }
   3414     pComponentPrivate->RGBbuffer = NULL;
   3415     pComponentPrivate->pLcmlHandle = NULL;
   3416     pComponentPrivate->bPreempted = OMX_FALSE;
   3417 
   3418     return eError;
   3419 }
   3420 
   3421 
   3422 
   3423 /*-------------------------------------------------------------------*/
   3424 /**
   3425   * IsTIOMXComponent()
   3426   *
   3427   * Check if the component is TI component.
   3428   *
   3429   * @param hTunneledComp Component Tunnel Pipe
   3430   *
   3431   * @retval OMX_TRUE   Input is a TI component.
   3432   *         OMX_FALSE  Input is a not a TI component.
   3433   *
   3434   **/
   3435 /*-------------------------------------------------------------------*/
   3436 
   3437 OMX_BOOL IsTIOMXComponent(OMX_HANDLETYPE hComp)
   3438 {
   3439 
   3440     OMX_ERRORTYPE eError = OMX_ErrorNone;
   3441     OMX_STRING pTunnelcComponentName = NULL;
   3442     OMX_VERSIONTYPE* pTunnelComponentVersion = NULL;
   3443     OMX_VERSIONTYPE* pSpecVersion = NULL;
   3444     OMX_UUIDTYPE* pComponentUUID = NULL;
   3445     char *pSubstring = NULL;
   3446     OMX_BOOL bResult = OMX_TRUE;
   3447 
   3448     OMX_MALLOC(pTunnelcComponentName, 128);
   3449     OMX_MALLOC(pTunnelComponentVersion, sizeof(OMX_VERSIONTYPE));
   3450     OMX_MALLOC(pSpecVersion, sizeof(OMX_VERSIONTYPE));
   3451     OMX_MALLOC(pComponentUUID, sizeof(OMX_UUIDTYPE));
   3452 
   3453     eError = OMX_GetComponentVersion (hComp, pTunnelcComponentName, pTunnelComponentVersion, pSpecVersion, pComponentUUID);
   3454 
   3455     /* Check if tunneled component is a TI component */
   3456     pSubstring = strstr(pTunnelcComponentName, "OMX.TI.");
   3457 
   3458     if(pSubstring == NULL) {
   3459         bResult = OMX_FALSE;
   3460     }
   3461 
   3462 EXIT:
   3463     OMX_FREE(pTunnelcComponentName);
   3464     OMX_FREE(pTunnelComponentVersion);
   3465     OMX_FREE(pSpecVersion);
   3466     OMX_FREE(pComponentUUID);
   3467 
   3468     return bResult;
   3469 } /* End of IsTIOMXComponent */
   3470 
   3471 
   3472 
   3473 /*-------------------------------------------------------------------*/
   3474 /**
   3475   *  VPP_InitBufferDataPropagation()
   3476   *
   3477   *
   3478   *
   3479   *
   3480   * @param
   3481   * @param
   3482   * @param
   3483   *
   3484   * @retval OMX_NoError              Success, ready to roll
   3485   *
   3486   **/
   3487 /*-------------------------------------------------------------------*/
   3488 void VPP_InitBufferDataPropagation(
   3489     VPP_COMPONENT_PRIVATE *pComponentPrivate,
   3490     OMX_U32 nPortIndex)
   3491 {
   3492     VPP_PORT_TYPE *pPortType = NULL;
   3493     int i;
   3494 
   3495      pPortType = &(pComponentPrivate->sCompPorts[nPortIndex]);
   3496 
   3497     /* assume  pPortType->pPortDef->nBufferCountActual <= NUM_OF_BUFFERSJPEG */
   3498     for (i = 0; i < pPortType->pPortDef.nBufferCountActual; i ++) {
   3499         pPortType->sBufferDataProp[i].flag = 0;
   3500         pPortType->sBufferDataProp[i].buffer_idYUV = 0xFFFFFFFF;
   3501         pPortType->sBufferDataProp[i].buffer_idRGB = 0xFFFFFFFF;
   3502         pPortType->sBufferDataProp[i].pMarkData = NULL;
   3503         pPortType->sBufferDataProp[i].hMarkTargetComponent = NULL;
   3504         pPortType->sBufferDataProp[i].nTickCount = 0;
   3505         pPortType->sBufferDataProp[i].nTimeStamp = 0;
   3506     }
   3507 }
   3508 
   3509 
   3510 #ifdef RESOURCE_MANAGER_ENABLED
   3511 /* ========================================================================== */
   3512 /**
   3513  *  ResourceManagerCallback() - handle callbacks from Resource Manager
   3514  * @param cbData    Resource Manager Command Data Structure
   3515  * @return: void
   3516   **/
   3517 /* ========================================================================== */
   3518 
   3519 void ResourceManagerCallback(RMPROXY_COMMANDDATATYPE cbData)
   3520 {
   3521     OMX_COMMANDTYPE Cmd = OMX_CommandStateSet;
   3522     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)cbData.hComponent;
   3523     VPP_COMPONENT_PRIVATE *pComponentPrivate = NULL;
   3524     OMX_ERRORTYPE RM_Error = *(cbData.RM_Error);
   3525 
   3526     VPP_DPRINT("%s: %d: RM_Error = %x\n", __FUNCTION__, __LINE__, RM_Error);
   3527 
   3528     pComponentPrivate = (VPP_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
   3529 
   3530     if (RM_Error == OMX_RmProxyCallback_ResourcesPreempted) {
   3531 
   3532         pComponentPrivate->bPreempted = 1;
   3533 
   3534         if (pComponentPrivate->curState == OMX_StateExecuting ||
   3535             pComponentPrivate->curState == OMX_StatePause) {
   3536 
   3537             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   3538                                                    pComponentPrivate->pHandle->pApplicationPrivate,
   3539                                                    OMX_EventError,
   3540                                                    OMX_ErrorResourcesPreempted,
   3541                                                    OMX_TI_ErrorMajor,
   3542                                                    NULL);
   3543 
   3544             pComponentPrivate->toState = OMX_StateIdle;
   3545             pComponentPrivate->bIsStopping = OMX_TRUE;
   3546             VPP_DPRINT("Component Preempted. Going to IDLE State.\n");
   3547         }
   3548         else if (pComponentPrivate->curState == OMX_StateIdle){
   3549             pComponentPrivate->toState = OMX_StateLoaded;
   3550             VPP_DPRINT("Component Preempted. Going to LOADED State.\n");
   3551         }
   3552 
   3553 #ifdef __PERF_INSTRUMENTATION__
   3554         PERF_SendingCommand(pComponentPrivate->pPERF, Cmd, pComponentPrivate->toState, PERF_ModuleComponent);
   3555 #endif
   3556 
   3557         write (pComponentPrivate->cmdPipe[1], &Cmd, sizeof(Cmd));
   3558         write (pComponentPrivate->nCmdDataPipe[1], &(pComponentPrivate->toState) ,sizeof(OMX_U32));
   3559 
   3560     }
   3561     else if (RM_Error == OMX_RmProxyCallback_ResourcesAcquired ){
   3562 
   3563         if (pComponentPrivate->curState == OMX_StateWaitForResources) /* Wait for Resource Response */
   3564         {
   3565             pComponentPrivate->cbInfo.EventHandler (
   3566     	                        pHandle, pHandle->pApplicationPrivate,
   3567     	                        OMX_EventResourcesAcquired, 0,0,
   3568     	                        NULL);
   3569 
   3570             pComponentPrivate->toState = OMX_StateIdle;
   3571             pComponentPrivate->bIsStopping = OMX_TRUE;
   3572 
   3573 #ifdef __PERF_INSTRUMENTATION__
   3574             PERF_SendingCommand(pComponentPrivate->pPERF, Cmd, pComponentPrivate->toState, PERF_ModuleComponent);
   3575 #endif
   3576 
   3577             write (pComponentPrivate->cmdPipe[1], &Cmd, sizeof(Cmd));
   3578             write (pComponentPrivate->nCmdDataPipe[1], &(pComponentPrivate->toState) ,sizeof(OMX_U32));
   3579             VPP_DPRINT("OMX_RmProxyCallback_ResourcesAcquired.\n");
   3580         }
   3581 
   3582     }
   3583 
   3584 }
   3585 #endif
   3586 
   3587 void LinkedList_Create(LinkedList *LinkedList) {
   3588     LinkedList->pRoot = NULL;
   3589 }
   3590 
   3591 void LinkedList_AddElement(LinkedList *LinkedList, void *pValue) {
   3592     /* create new node and fill the value */
   3593     Node *pNewNode = (Node *)malloc(sizeof(Node));
   3594     if (pNewNode != NULL) {
   3595         pNewNode->pValue = (void *)pValue;
   3596         /*printf("LinkedList:::: Pointer=%p has been added.\n", pNewNode->pValue); */
   3597         /* add new node on the root to implement quick FIFO */
   3598         /* modify new node pointers */
   3599         if (LinkedList->pRoot == NULL) {
   3600             pNewNode->pNextNode = NULL;
   3601         }
   3602         else {
   3603              pNewNode->pNextNode = LinkedList->pRoot;
   3604         }
   3605         /*modify root */
   3606         LinkedList->pRoot = pNewNode;
   3607     }
   3608 }
   3609 
   3610 void LinkedList_FreeElement(LinkedList *LinkedList, void *pValue) {
   3611     Node *pNode = LinkedList->pRoot;
   3612     Node *pPastNode = NULL;
   3613     while (pNode != NULL) {
   3614         if (pNode->pValue == pValue) {
   3615             Node *pTempNode = pNode->pNextNode;
   3616             if(pPastNode == NULL) {
   3617                 LinkedList->pRoot = pTempNode;
   3618             }
   3619             else {
   3620                 pPastNode->pNextNode = pTempNode;
   3621             }
   3622             /*printf("LinkedList:::: Pointer=%p has been freed\n", pNode->pValue); */
   3623             free(pNode->pValue);
   3624             free(pNode);
   3625             break;
   3626         }
   3627         pPastNode = pNode;
   3628         pNode = pNode->pNextNode;
   3629     }
   3630 }
   3631 
   3632 void LinkedList_FreeAll(LinkedList *LinkedList) {
   3633     Node *pTempNode;
   3634     int nodes = 0;
   3635     while (LinkedList->pRoot != NULL) {
   3636         pTempNode = LinkedList->pRoot->pNextNode;
   3637         /*printf("LinkedList:::: Pointer=%p has been freed\n", LinkedList->pRoot->pValue); */
   3638         free(LinkedList->pRoot->pValue);
   3639         free(LinkedList->pRoot);
   3640         LinkedList->pRoot = pTempNode;
   3641         nodes++;
   3642     }
   3643     /* printf("==================No. of deleted nodes: %d=======================================\n\n", nodes); */
   3644 }
   3645 
   3646 void LinkedList_DisplayAll(LinkedList *LinkedList) {
   3647     Node *pNode = LinkedList->pRoot;
   3648     int nodes = 0;
   3649     printf("\n================== Displaying contents of linked list=%p=====================\n", LinkedList);
   3650     printf("root->\n");
   3651     while (pNode != NULL) {
   3652         printf("[Value=%p, NextNode=%p]->\n", pNode->pValue, pNode->pNextNode);
   3653         pNode = pNode->pNextNode;
   3654         nodes++;
   3655     }
   3656      printf("==================No. of existing nodes: %d=======================================\n\n", nodes);
   3657 }
   3658 
   3659 void LinkedList_Destroy(LinkedList *LinkedList) {
   3660     /* do nothing */
   3661 }
   3662 
   3663