Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (c) 2010, Texas Instruments Incorporated
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *
      9  * *  Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  *
     12  * *  Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * *  Neither the name of Texas Instruments Incorporated nor the names of
     17  *    its contributors may be used to endorse or promote products derived
     18  *    from this software without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 /**
     34  *  @file  omx_proxy_camera.c
     35  *         This file contains methods that provides the functionality for
     36  *         the OpenMAX1.1 DOMX Framework Tunnel Proxy component.
     37  ******************************************************************************
     38  This is the proxy specific wrapper that passes the component name to the
     39  generic proxy init() The proxy wrapper also does some runtime/static time
     40  config on per proxy basis This is a thin wrapper that is called when
     41  componentiit() of the proxy is called  static OMX_ERRORTYPE PROXY_Wrapper_init
     42  (OMX_HANDLETYPE hComponent, OMX_PTR pAppData);
     43  this layer gets called first whenever a proxy s get handle is called
     44  ******************************************************************************
     45  *  @path WTSD_DucatiMMSW\omx\omx_il_1_x\omx_proxy_component\src
     46  *
     47  *  @rev 1.0
     48  */
     49 
     50 /*==============================================================
     51  *! Revision History
     52  *! ============================
     53  *! 19-August-2009 B Ravi Kiran ravi.kiran (at) ti.com: Initial Version
     54  *================================================================*/
     55 
     56 /******************************************************************
     57  *   INCLUDE FILES
     58  ******************************************************************/
     59 #include <stdio.h>
     60 #include <string.h>
     61 #include <assert.h>
     62 #include <dirent.h>
     63 #include <stdio.h>
     64 #include <string.h>
     65 #include <pthread.h>
     66 #include <sys/time.h>
     67 #include <stdlib.h>
     68 #include <errno.h>
     69 
     70 #include <timm_osal_interfaces.h>
     71 #include <OMX_TI_IVCommon.h>
     72 #include <OMX_TI_Index.h>
     73 #include "omx_proxy_common.h"
     74 #include "timm_osal_mutex.h"
     75 
     76 #ifdef USE_ION
     77 #include <unistd.h>
     78 #include <ion/ion.h>
     79 #include <sys/ioctl.h>
     80 #include <sys/mman.h>
     81 #include <sys/eventfd.h>
     82 #include <fcntl.h>
     83 #include <errno.h>
     84 #endif
     85 
     86 #define COMPONENT_NAME "OMX.TI.DUCATI1.VIDEO.CAMERA"
     87 /*Needs to be specific for every configuration wrapper*/
     88 
     89 #undef LOG_TAG
     90 #define LOG_TAG "CameraHAL"
     91 
     92 #define DEFAULT_DCC 1
     93 
     94 #define LINUX_PAGE_SIZE (4 * 1024)
     95 
     96 #define _PROXY_OMX_INIT_PARAM(param,type) do {		\
     97 	TIMM_OSAL_Memset((param), 0, sizeof (type));	\
     98 	(param)->nSize = sizeof (type);			\
     99 	(param)->nVersion.s.nVersionMajor = 1;		\
    100 	(param)->nVersion.s.nVersionMinor = 1;		\
    101 	} while(0)
    102 
    103 /* VTC specific changes */
    104 #define MAX_NUM_INTERNAL_BUFFERS 4
    105 #define MAX_VTC_WIDTH 1920
    106 #define MAX_VTC_HEIGHT 1080
    107 #define BORDER_WIDTH 32
    108 #define BORDER_HEIGHT 32
    109 #define MAX_VTC_WIDTH_WITH_VNF (MAX_VTC_WIDTH + BORDER_WIDTH)
    110 #define MAX_VTC_HEIGHT_WITH_VNF (MAX_VTC_HEIGHT + BORDER_HEIGHT)
    111 OMX_PTR gCamIonHdl[MAX_NUM_INTERNAL_BUFFERS][2];
    112 
    113 /* Tiler heap resservation specific */
    114 #define OMAP_ION_HEAP_TILER_ALLOCATION_MASK (1<<4)
    115 /* store handles for tracking and freeing */
    116 OMX_PTR gComponentBufferAllocation[PROXY_MAXNUMOFPORTS][MAX_NUM_INTERNAL_BUFFERS];
    117 
    118 /* Incase of multiple instance, making sure DCC is initialized only for
    119    first instance */
    120 static OMX_S16 numofInstance = 0;
    121 int dcc_flag = 0;
    122 TIMM_OSAL_PTR cam_mutex = NULL;
    123 
    124 /* To store DCC buffer size */
    125 OMX_S32 dccbuf_size = 0;
    126 
    127 /* Ducati Mapped Addr  */
    128 OMX_PTR DCC_Buff = NULL;
    129 
    130 #ifdef USE_ION
    131 OMX_PTR DCC_Buff_ptr = NULL;
    132 int ion_fd;
    133 int mmap_fd;
    134 #endif
    135 
    136 OMX_S32 read_DCCdir(OMX_PTR, OMX_STRING *, OMX_U16);
    137 OMX_ERRORTYPE DCC_Init(OMX_HANDLETYPE);
    138 OMX_ERRORTYPE send_DCCBufPtr(OMX_HANDLETYPE hComponent);
    139 void DCC_DeInit();
    140 OMX_ERRORTYPE PROXY_ComponentDeInit(OMX_HANDLETYPE);
    141 OMX_ERRORTYPE __PROXY_SetConfig(OMX_HANDLETYPE, OMX_INDEXTYPE,
    142 								OMX_PTR, OMX_PTR);
    143 OMX_ERRORTYPE __PROXY_GetConfig(OMX_HANDLETYPE, OMX_INDEXTYPE,
    144 								OMX_PTR, OMX_PTR);
    145 OMX_ERRORTYPE __PROXY_SetParameter(OMX_IN OMX_HANDLETYPE, OMX_INDEXTYPE,
    146 									OMX_PTR, OMX_PTR, OMX_U32);
    147 OMX_ERRORTYPE __PROXY_GetParameter(OMX_IN OMX_HANDLETYPE, OMX_INDEXTYPE,
    148 									OMX_PTR, OMX_PTR);
    149 OMX_ERRORTYPE PROXY_SendCommand(OMX_HANDLETYPE, OMX_COMMANDTYPE,
    150  								        OMX_U32,OMX_PTR);
    151 OMX_ERRORTYPE CameraMaptoTilerDuc(OMX_TI_CONFIG_SHAREDBUFFER *, OMX_PTR *);
    152 //COREID TARGET_CORE_ID = CORE_APPM3;
    153 
    154 static OMX_ERRORTYPE ComponentPrivateDeInit(OMX_IN OMX_HANDLETYPE hComponent)
    155 {
    156 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    157 	TIMM_OSAL_ERRORTYPE eOsalError = TIMM_OSAL_ERR_NONE;
    158 	PROXY_COMPONENT_PRIVATE *pCompPrv;
    159 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    160 	OMX_U32 i, j;
    161 
    162 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    163 
    164 	if (dcc_flag)
    165 	{
    166 		eOsalError =
    167 		    TIMM_OSAL_MutexObtain(cam_mutex, TIMM_OSAL_SUSPEND);
    168 		if (eOsalError != TIMM_OSAL_ERR_NONE)
    169 		{
    170 			TIMM_OSAL_Error("Mutex Obtain failed");
    171 		}
    172 
    173 		numofInstance = numofInstance - 1;
    174 
    175 		eOsalError = TIMM_OSAL_MutexRelease(cam_mutex);
    176 		PROXY_assert(eOsalError == TIMM_OSAL_ERR_NONE,
    177 		    OMX_ErrorInsufficientResources, "Mutex release failed");
    178 	}
    179         for(i=0; i < MAX_NUM_INTERNAL_BUFFERS; i++) {
    180             if (gCamIonHdl[i][0] != NULL) {
    181                 ion_free(pCompPrv->ion_fd, gCamIonHdl[i][0]);
    182                 gCamIonHdl[i][0] = NULL;
    183             }
    184             if (gCamIonHdl[i][1] != NULL) {
    185                 ion_free(pCompPrv->ion_fd, gCamIonHdl[i][1]);
    186                 gCamIonHdl[i][1] = NULL;
    187             }
    188 
    189         }
    190 
    191         for (i = 0; i < PROXY_MAXNUMOFPORTS; i++) {
    192             for (j = 0; j < MAX_NUM_INTERNAL_BUFFERS; j++) {
    193                 if (gComponentBufferAllocation[i][j]) {
    194                     ion_free(pCompPrv->ion_fd, gComponentBufferAllocation[i][j]);
    195                 }
    196                 gComponentBufferAllocation[i][j] = NULL;
    197             }
    198         }
    199 
    200 	eError = PROXY_ComponentDeInit(hComponent);
    201 
    202       EXIT:
    203 	return eError;
    204 }
    205 
    206 static OMX_ERRORTYPE Camera_SendCommand(OMX_IN OMX_HANDLETYPE hComponent,
    207     OMX_IN OMX_COMMANDTYPE eCmd,
    208     OMX_IN OMX_U32 nParam, OMX_IN OMX_PTR pCmdData)
    209 
    210 {
    211 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn;
    212 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
    213 	PROXY_COMPONENT_PRIVATE *pCompPrv;
    214 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    215 	static OMX_BOOL dcc_loaded = OMX_FALSE;
    216 
    217 	OMX_ERRORTYPE dcc_eError = OMX_ErrorNone;
    218 	TIMM_OSAL_ERRORTYPE eOsalError = TIMM_OSAL_ERR_NONE;
    219 	OMX_U32 i;
    220 
    221 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    222 
    223 	if ((eCmd == OMX_CommandStateSet) &&
    224 	(nParam == (OMX_STATETYPE) OMX_StateIdle))
    225 	{
    226 		if (!dcc_loaded)
    227 		{
    228 			dcc_eError = DCC_Init(hComponent);
    229 			if (dcc_eError != OMX_ErrorNone)
    230 			{
    231 				DOMX_ERROR(" Error in DCC Init");
    232 			}
    233 			/* Configure Ducati to use DCC buffer from A9 side
    234 			 *ONLY* if DCC_Init is successful. */
    235 			if (dcc_eError == OMX_ErrorNone)
    236 			{
    237 				dcc_eError = send_DCCBufPtr(hComponent);
    238 				if (dcc_eError != OMX_ErrorNone)
    239 				{
    240 					DOMX_ERROR(" Error in Sending DCC Buf ptr");
    241 				}
    242 				DCC_DeInit();
    243 			}
    244 			dcc_loaded = OMX_TRUE;
    245 		}
    246 	} else if (eCmd == OMX_CommandPortDisable) {
    247             int i, j;
    248             for (i = 0; i < MAX_NUM_INTERNAL_BUFFERS; i++) {
    249                 for (j = 0; j < PROXY_MAXNUMOFPORTS; j++) {
    250                     if (((j == nParam) || (nParam == OMX_ALL)) &&
    251                          gComponentBufferAllocation[i][j])
    252                     {
    253                         ion_free(pCompPrv->ion_fd, gComponentBufferAllocation[i][j]);
    254                         gComponentBufferAllocation[i][j] = NULL;
    255                     }
    256                 }
    257             }
    258 
    259         }
    260 
    261 
    262 	eError =
    263 	PROXY_SendCommand(hComponent,eCmd,nParam,pCmdData);
    264 
    265 
    266 EXIT:
    267 
    268    DOMX_EXIT("eError: %d", eError);
    269    return eError;
    270 
    271 }
    272 
    273 /* ===========================================================================*/
    274 /**
    275  * @name CameraGetConfig()
    276  * @brief For some specific indices, buffer allocated on A9 side
    277  *        needs to be mapped and sent to Ducati.
    278  * @param
    279  * @return OMX_ErrorNone = Successful
    280  */
    281 /* ===========================================================================*/
    282 
    283 static OMX_ERRORTYPE CameraGetConfig(OMX_IN OMX_HANDLETYPE
    284     hComponent, OMX_IN OMX_INDEXTYPE nParamIndex,
    285     OMX_INOUT OMX_PTR pComponentParameterStructure)
    286 {
    287 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    288 	OMX_TI_CONFIG_SHAREDBUFFER *pConfigSharedBuffer = NULL;
    289 	OMX_PTR pTempSharedBuff = NULL;
    290 	OMX_U32 status = 0;
    291 
    292 	switch (nParamIndex)
    293 	{
    294 	case OMX_TI_IndexConfigAAAskipBuffer:
    295 	case OMX_TI_IndexConfigCamCapabilities:
    296 	case OMX_TI_IndexConfigExifTags:
    297 	case OMX_TI_IndexConfigAlgoAreas:
    298 		pConfigSharedBuffer =
    299 			(OMX_TI_CONFIG_SHAREDBUFFER *) pComponentParameterStructure;
    300 
    301 		pTempSharedBuff = pConfigSharedBuffer->pSharedBuff;
    302 
    303 		// TODO(XXX): Cache API is not yet available. Client needs to
    304 		// allocate tiler buffer directly and assign to pSharedBuff.
    305 		// Ptr allocated by MemMgr_Alloc in uncacheable so there
    306 		// would be no need to cache API
    307 
    308 		eError = __PROXY_GetConfig(hComponent,
    309 								nParamIndex,
    310 								pConfigSharedBuffer,
    311 								&(pConfigSharedBuffer->pSharedBuff));
    312 
    313 		PROXY_assert((eError == OMX_ErrorNone), eError,
    314 		    "Error in GetConfig");
    315 
    316 		pConfigSharedBuffer->pSharedBuff = pTempSharedBuff;
    317 
    318 		goto EXIT;
    319 		break;
    320 	default:
    321 		break;
    322 	}
    323 
    324 	return __PROXY_GetConfig(hComponent,
    325 							nParamIndex,
    326 							pComponentParameterStructure,
    327 							NULL);
    328 
    329  EXIT:
    330 	return eError;
    331 }
    332 
    333 /* ===========================================================================*/
    334 /**
    335  * @name CameraSetConfig()
    336  * @brief For some specific indices, buffer allocated on A9 side needs to
    337  *        be mapped and sent to Ducati.
    338  * @param
    339  * @return OMX_ErrorNone = Successful
    340  */
    341 /* ===========================================================================*/
    342 
    343 
    344 static OMX_ERRORTYPE CameraSetConfig(OMX_IN OMX_HANDLETYPE
    345     hComponent, OMX_IN OMX_INDEXTYPE nParamIndex,
    346     OMX_INOUT OMX_PTR pComponentParameterStructure)
    347 {
    348 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    349 	OMX_TI_CONFIG_SHAREDBUFFER *pConfigSharedBuffer = NULL;
    350 	OMX_PTR pTempSharedBuff = NULL;
    351 	OMX_U32 status = 0;
    352 
    353 	switch (nParamIndex)
    354 	{
    355 	case OMX_TI_IndexConfigAAAskipBuffer:
    356 	case OMX_TI_IndexConfigCamCapabilities:
    357 	case OMX_TI_IndexConfigExifTags:
    358 	case OMX_TI_IndexConfigAlgoAreas:
    359 		pConfigSharedBuffer =
    360 			(OMX_TI_CONFIG_SHAREDBUFFER *)
    361 			pComponentParameterStructure;
    362 
    363 		pTempSharedBuff = pConfigSharedBuffer->pSharedBuff;
    364 
    365 		// TODO(XXX): Cache API is not yet available. Client needs to
    366 		// allocate tiler buffer directly and assign to pSharedBuff.
    367 		// Ptr allocated by MemMgr_Alloc in uncacheable so there
    368 		// would be no need to cache API
    369 
    370 		eError = __PROXY_SetConfig(hComponent,
    371 								nParamIndex,
    372 								pConfigSharedBuffer,
    373 								&(pConfigSharedBuffer->pSharedBuff));
    374 
    375 		PROXY_assert((eError == OMX_ErrorNone), eError,
    376 		    "Error in GetConfig");
    377 
    378 		pConfigSharedBuffer->pSharedBuff = pTempSharedBuff;
    379 
    380 		goto EXIT;
    381 		break;
    382 	default:
    383 		break;
    384 	}
    385 
    386 	return __PROXY_SetConfig(hComponent,
    387 							nParamIndex,
    388 							pComponentParameterStructure,
    389 							NULL);
    390 
    391  EXIT:
    392 	return eError;
    393 }
    394 
    395 static OMX_ERRORTYPE CameraSetParam(OMX_IN OMX_HANDLETYPE
    396     hComponent, OMX_IN OMX_INDEXTYPE nParamIndex,
    397     OMX_INOUT OMX_PTR pComponentParameterStructure)
    398 {
    399     OMX_ERRORTYPE eError = OMX_ErrorNone;
    400     struct ion_handle *handle;
    401     OMX_U32 i =0;
    402     OMX_S32 ret = 0;
    403     PROXY_COMPONENT_PRIVATE *pCompPrv;
    404     OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *)hComponent;
    405     OMX_U32 stride_Y = 0, stride_UV = 0;
    406     OMX_TI_PARAM_VTCSLICE *pVtcConfig;// = (OMX_TI_PARAM_VTCSLICE *)pComponentParameterStructure;
    407     OMX_TI_PARAM_COMPONENTBUFALLOCTYPE *bufferalloc = NULL;
    408     int size = 0;
    409     int fd1 = -1, fd2 = -1;
    410 
    411     pCompPrv = (PROXY_COMPONENT_PRIVATE *)hComp->pComponentPrivate;
    412     //fprintf(stdout, "DOMX: CameraSetParam: called!!!\n");
    413     switch (nParamIndex)
    414     {
    415         case OMX_TI_IndexParamVtcSlice:
    416             pVtcConfig = (OMX_TI_PARAM_VTCSLICE *)pComponentParameterStructure;
    417             fprintf(stdout, "DOMX: CameraSetParam: OMX_TI_IndexParamVtcSlice is called!!!\n");
    418             DOMX_ERROR("CameraSetParam Called for Vtc Slice index\n");
    419 
    420             //fprintf(stdout, "CameraSetParam Called for Vtc Slice height = %d\n", ((OMX_TI_PARAM_VTCSLICE *)pComponentParameterStructure)->nSliceHeight);
    421 		    // MAX_NUM_INTERNAL_BUFFERS;
    422 
    423     		for(i=0; i < MAX_NUM_INTERNAL_BUFFERS; i++) {
    424                     pVtcConfig->nInternalBuffers = i;
    425 		    ret = ion_alloc_tiler(pCompPrv->ion_fd, MAX_VTC_WIDTH_WITH_VNF, MAX_VTC_HEIGHT_WITH_VNF, TILER_PIXEL_FMT_8BIT, OMAP_ION_HEAP_TILER_MASK, &handle, (size_t *)&stride_Y);
    426 			if (ret < 0) {
    427 				DOMX_ERROR ("ION allocation failed - %s", strerror(errno));
    428 				goto EXIT;
    429 			}
    430 
    431 			ret = ion_share(pCompPrv->ion_fd, handle, &fd1);
    432 			if (ret < 0) {
    433 				DOMX_ERROR("ION share failed");
    434 				ion_free(pCompPrv->ion_fd, handle);
    435 				goto EXIT;
    436 			}
    437 
    438 			pVtcConfig->IonBufhdl[0] = (OMX_PTR)(fd1);
    439 
    440 		    //fprintf(stdout, "DOMX: ION Buffer#%d: Y: 0x%x\n", i, pVtcConfig->IonBufhdl[0]);
    441 
    442 			ret = ion_alloc_tiler(pCompPrv->ion_fd, MAX_VTC_WIDTH_WITH_VNF/2, MAX_VTC_HEIGHT_WITH_VNF/2, TILER_PIXEL_FMT_16BIT, OMAP_ION_HEAP_TILER_MASK, &handle, (size_t *)&stride_UV);
    443 			if (ret < 0) {
    444 				DOMX_ERROR ("ION allocation failed - %s", strerror(errno));
    445 				goto EXIT;
    446 			}
    447 
    448 			ret = ion_share(pCompPrv->ion_fd, handle, &fd2);
    449 			if (ret < 0) {
    450 				DOMX_ERROR("ION share failed");
    451 				ion_free(pCompPrv->ion_fd, handle);
    452 				goto EXIT;
    453 			}
    454 
    455 		    pVtcConfig->IonBufhdl[1] = (OMX_PTR)(fd2);
    456                     gCamIonHdl[i][0] = pVtcConfig->IonBufhdl[0];
    457                     gCamIonHdl[i][1] = pVtcConfig->IonBufhdl[1];
    458 		    //fprintf(stdout, "DOMX: ION Buffer#%d: UV: 0x%x\n", i, pVtcConfig->IonBufhdl[1]);
    459 		    eError = __PROXY_SetParameter(hComponent,
    460                                               OMX_TI_IndexParamVtcSlice,
    461 					      pVtcConfig,
    462 					pVtcConfig->IonBufhdl, 2);
    463 		    close(fd1);
    464 		    close(fd2);
    465                }
    466 		goto EXIT;
    467 	case OMX_TI_IndexParamComponentBufferAllocation: {
    468                 OMX_U32 port = 0, index = 0;
    469 		int fd;
    470 		bufferalloc = (OMX_TI_PARAM_COMPONENTBUFALLOCTYPE *)
    471 			pComponentParameterStructure;
    472 
    473                 port = bufferalloc->nPortIndex;
    474                 index = bufferalloc->nIndex;
    475 
    476 		size = bufferalloc->nAllocWidth * bufferalloc->nAllocLines;
    477 		ret = ion_alloc_tiler (pCompPrv->ion_fd, size, 1,
    478 				       TILER_PIXEL_FMT_PAGE,
    479 				       OMAP_ION_HEAP_TILER_ALLOCATION_MASK,
    480 				       &handle, &stride_Y);
    481 		if (ret < 0) {
    482 			DOMX_ERROR ("ION allocation failed - %s", strerror(errno));
    483 			goto EXIT;
    484 		}
    485 
    486 		ret = ion_share(pCompPrv->ion_fd, handle, &fd);
    487 		if (ret < 0) {
    488 			DOMX_ERROR("ION share failed");
    489 			ion_free(pCompPrv->ion_fd, handle);
    490 			goto EXIT;
    491 		}
    492 
    493 		bufferalloc->pBuf[0] = fd;
    494 		eError = __PROXY_SetParameter(hComponent,
    495 					      OMX_TI_IndexParamComponentBufferAllocation,
    496 					      bufferalloc, &bufferalloc->pBuf[0], 1);
    497                 if (eError != OMX_ErrorNone) {
    498                    ion_free(pCompPrv->ion_fd, handle);
    499                 } else {
    500                    if (gComponentBufferAllocation[port][index]) {
    501                        ion_free(pCompPrv->ion_fd, gComponentBufferAllocation[port][index]);
    502                    }
    503                    gComponentBufferAllocation[port][index] = handle;
    504                 }
    505 		close (fd);
    506         }
    507 		goto EXIT;
    508 		break;
    509 	default:
    510 		 break;
    511 	}
    512 	eError = __PROXY_SetParameter(hComponent,
    513 								nParamIndex,
    514 								pComponentParameterStructure,
    515 							NULL, 0);
    516 
    517 	if (eError != OMX_ErrorNone) {
    518 		DOMX_ERROR(" CameraSetParam: Error in SetParam 0x%x", eError);
    519 	}
    520 EXIT:
    521     return eError;
    522 }
    523 OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE hComponent)
    524 {
    525 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    526 	OMX_ERRORTYPE dcc_eError = OMX_ErrorNone;
    527 	OMX_COMPONENTTYPE *pHandle = NULL;
    528 	PROXY_COMPONENT_PRIVATE *pComponentPrivate;
    529         OMX_U32 i = 0, j = 0;
    530 	pHandle = (OMX_COMPONENTTYPE *) hComponent;
    531 	TIMM_OSAL_ERRORTYPE eOsalError = TIMM_OSAL_ERR_NONE;
    532 	DOMX_ENTER("_____________________INSIDE CAMERA PROXY"
    533 	    "WRAPPER__________________________\n");
    534 	pHandle->pComponentPrivate = (PROXY_COMPONENT_PRIVATE *)
    535 	    TIMM_OSAL_Malloc(sizeof(PROXY_COMPONENT_PRIVATE),
    536 	    TIMM_OSAL_TRUE, 0, TIMMOSAL_MEM_SEGMENT_INT);
    537 
    538 	pComponentPrivate =
    539 	    (PROXY_COMPONENT_PRIVATE *) pHandle->pComponentPrivate;
    540 	if (pHandle->pComponentPrivate == NULL)
    541 	{
    542 		DOMX_ERROR(" ERROR IN ALLOCATING PROXY COMPONENT"
    543 		    "PRIVATE STRUCTURE");
    544 		eError = OMX_ErrorInsufficientResources;
    545 		goto EXIT;
    546 	}
    547 	TIMM_OSAL_Memset(pComponentPrivate, 0,
    548 		sizeof(PROXY_COMPONENT_PRIVATE));
    549 
    550 	pComponentPrivate->cCompName =
    551 	    TIMM_OSAL_Malloc(MAX_COMPONENT_NAME_LENGTH * sizeof(OMX_U8),
    552 	    TIMM_OSAL_TRUE, 0, TIMMOSAL_MEM_SEGMENT_INT);
    553 	/*Copying component Name - this will be picked up in the proxy common */
    554 	assert(strlen(COMPONENT_NAME) + 1 < MAX_COMPONENT_NAME_LENGTH);
    555 	TIMM_OSAL_Memcpy(pComponentPrivate->cCompName, COMPONENT_NAME,
    556 	    strlen(COMPONENT_NAME) + 1);
    557 
    558 	/*Calling Proxy Common Init() */
    559 	eError = OMX_ProxyCommonInit(hComponent);
    560 	if (eError != OMX_ErrorNone)
    561 	{
    562 		DOMX_ERROR("\Error in Initializing Proxy");
    563 		TIMM_OSAL_Free(pComponentPrivate->cCompName);
    564 		TIMM_OSAL_Free(pComponentPrivate);
    565 		goto EXIT;
    566 	}
    567         for(i=0; i < MAX_NUM_INTERNAL_BUFFERS; i++) {
    568             gCamIonHdl[i][0] = NULL;
    569             gCamIonHdl[i][1] = NULL;
    570         }
    571 
    572         for (i = 0; i < PROXY_MAXNUMOFPORTS; i++) {
    573             for (j = 0; j < MAX_NUM_INTERNAL_BUFFERS; j++) {
    574                 gComponentBufferAllocation[i][j] = NULL;
    575             }
    576         }
    577 
    578 	pHandle->ComponentDeInit = ComponentPrivateDeInit;
    579 	pHandle->GetConfig = CameraGetConfig;
    580 	pHandle->SetConfig = CameraSetConfig;
    581 	pHandle->SendCommand = Camera_SendCommand;
    582 	pHandle->SetParameter = CameraSetParam;
    583 
    584       EXIT:
    585 	return eError;
    586 }
    587 
    588 /* ===========================================================================*/
    589 /**
    590  * @name DCC_Init()
    591  * @brief
    592  * @param void
    593  * @return OMX_ErrorNone = Successful
    594  * @sa TBD
    595  *
    596  */
    597 /* ===========================================================================*/
    598 OMX_ERRORTYPE DCC_Init(OMX_HANDLETYPE hComponent)
    599 {
    600 	OMX_TI_PARAM_DCCURIINFO param;
    601 	OMX_PTR ptempbuf;
    602 	OMX_U16 nIndex = 0;
    603 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    604 #ifdef USE_ION
    605 	int ret;
    606 	size_t stride;
    607 #endif
    608 
    609 	OMX_S32 status = 0;
    610 	OMX_STRING dcc_dir[200];
    611 	OMX_U16 i;
    612 	_PROXY_OMX_INIT_PARAM(&param, OMX_TI_PARAM_DCCURIINFO);
    613 
    614 	DOMX_ENTER("ENTER");
    615 	/* Read the the DCC URI info */
    616 	for (nIndex = 0; eError != OMX_ErrorNoMore; nIndex++)
    617 	{
    618 		param.nIndex = nIndex;
    619 		eError =
    620 			OMX_GetParameter(hComponent,
    621 			OMX_TI_IndexParamDccUriInfo, &param);
    622 
    623 		PROXY_assert((eError == OMX_ErrorNone) ||
    624 			(eError == OMX_ErrorNoMore), eError,
    625 			"Error in GetParam for Dcc URI info");
    626 
    627 		if (eError == OMX_ErrorNone)
    628 		{
    629 			DOMX_DEBUG("DCC URI's %s ", param.sDCCURI);
    630 			dcc_dir[nIndex] =
    631 				TIMM_OSAL_Malloc(sizeof(OMX_U8) *
    632 				(strlen(DCC_PATH) + MAX_URI_LENGTH + 1),
    633 				TIMM_OSAL_TRUE, 0, TIMMOSAL_MEM_SEGMENT_INT);
    634 			PROXY_assert(dcc_dir[nIndex] != NULL,
    635 				OMX_ErrorInsufficientResources, "Malloc failed");
    636 			strcpy(dcc_dir[nIndex], DCC_PATH);
    637 			strncat(dcc_dir[nIndex], (OMX_STRING) param.sDCCURI, MAX_URI_LENGTH);
    638 			strcat(dcc_dir[nIndex], "/");
    639 		}
    640 	}
    641 
    642 	/* setting  back errortype OMX_ErrorNone */
    643 	if (eError == OMX_ErrorNoMore)
    644 	{
    645 		eError = OMX_ErrorNone;
    646 	}
    647 
    648 	dccbuf_size = read_DCCdir(NULL, dcc_dir, nIndex);
    649 
    650     if(dccbuf_size <= 0)
    651     {
    652 	    DOMX_DEBUG("No DCC files found, switching back to default DCC");
    653         return OMX_ErrorInsufficientResources;
    654     }
    655 
    656 #ifdef USE_ION
    657 	ion_fd = ion_open();
    658 	if(ion_fd == 0)
    659 	{
    660 		DOMX_ERROR("ion_open failed!!!");
    661 		return OMX_ErrorInsufficientResources;
    662 	}
    663 	dccbuf_size = (dccbuf_size + LINUX_PAGE_SIZE -1) & ~(LINUX_PAGE_SIZE - 1);
    664 	ret = ion_alloc(ion_fd, dccbuf_size, 0x1000, 1 << ION_HEAP_TYPE_CARVEOUT,
    665 		(struct ion_handle **)&DCC_Buff);
    666 
    667         if (ret || ((int)DCC_Buff == -ENOMEM)) {
    668                 ret = ion_alloc_tiler(ion_fd, dccbuf_size, 1, TILER_PIXEL_FMT_PAGE,
    669                                 OMAP_ION_HEAP_TILER_MASK, &DCC_Buff, &stride);
    670         }
    671 
    672         if (ret || ((int)DCC_Buff == -ENOMEM)) {
    673                 DOMX_ERROR("FAILED to allocate DCC buffer of size=%d. ret=0x%x",
    674                                         dccbuf_size, ret);
    675                 return OMX_ErrorInsufficientResources;
    676         }
    677 
    678 	if (ion_map(ion_fd, DCC_Buff, dccbuf_size, PROT_READ | PROT_WRITE, MAP_SHARED, 0,
    679                    (unsigned char **)&DCC_Buff_ptr, &mmap_fd) < 0)
    680 	{
    681 		DOMX_ERROR("userspace mapping of ION buffers returned error");
    682 		return OMX_ErrorInsufficientResources;
    683 	}
    684 	ptempbuf = DCC_Buff_ptr;
    685 #endif
    686 	dccbuf_size = read_DCCdir(ptempbuf, dcc_dir, nIndex);
    687 
    688 	PROXY_assert(dccbuf_size > 0, OMX_ErrorInsufficientResources,
    689 		"ERROR in copy DCC files into buffer");
    690 
    691  EXIT:
    692 	for (i = 0; i < nIndex - 1; i++)
    693 	{
    694 			TIMM_OSAL_Free(dcc_dir[i]);
    695 	}
    696 
    697 	return eError;
    698 
    699 }
    700 
    701 /* ===========================================================================*/
    702 /**
    703  * @name send_DCCBufPtr()
    704  * @brief : Sending the DCC uri buff addr to ducati
    705  * @param void
    706  * @return return = 0 is successful
    707  * @sa TBD
    708  *
    709  */
    710 /* ===========================================================================*/
    711 
    712 OMX_ERRORTYPE send_DCCBufPtr(OMX_HANDLETYPE hComponent)
    713 {
    714 	OMX_TI_CONFIG_SHAREDBUFFER uribufparam;
    715 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    716 
    717 	_PROXY_OMX_INIT_PARAM(&uribufparam, OMX_TI_CONFIG_SHAREDBUFFER);
    718 	uribufparam.nPortIndex = OMX_ALL;
    719 
    720 	DOMX_ENTER("ENTER");
    721 
    722 	uribufparam.nSharedBuffSize = dccbuf_size;
    723 #ifdef USE_ION
    724 	uribufparam.pSharedBuff = (OMX_PTR) mmap_fd;
    725 #else
    726 	uribufparam.pSharedBuff = (OMX_PTR) DCC_Buff;
    727 #endif
    728 
    729 	DOMX_DEBUG("SYSLINK MAPPED ADDR:  0x%x sizeof buffer %d",
    730 		uribufparam.pSharedBuff, uribufparam.nSharedBuffSize);
    731 
    732 	eError = __PROXY_SetParameter(hComponent,
    733 								OMX_TI_IndexParamDccUriBuffer,
    734 								&uribufparam,
    735 								&(uribufparam.pSharedBuff), 1);
    736 
    737 	if (eError != OMX_ErrorNone) {
    738 		DOMX_ERROR(" Error in SetParam for DCC Uri Buffer 0x%x", eError);
    739 	}
    740 
    741 	DOMX_EXIT("EXIT");
    742 	return eError;
    743 }
    744 
    745 /* ===========================================================================*/
    746 /**
    747  * @name read_DCCdir()
    748  * @brief : copies all the dcc profiles into the allocated 1D-Tiler buffer
    749  *          and returns the size of the buffer.
    750  * @param void : OMX_PTR is null then returns the size of the DCC directory
    751  * @return return = size of the DCC directory or error in case of any failures
    752  *		    in file read or open
    753  * @sa TBD
    754  *
    755  */
    756 /* ===========================================================================*/
    757 OMX_S32 read_DCCdir(OMX_PTR buffer, OMX_STRING * dir_path, OMX_U16 numofURI)
    758 {
    759 	FILE *pFile;
    760 	OMX_S32 lSize;
    761 	OMX_S32 dcc_buf_size = 0;
    762 	size_t result;
    763 	OMX_STRING filename;
    764 	char temp[200];
    765 	OMX_STRING dotdot = "..";
    766 	DIR *d;
    767 	struct dirent *dir;
    768 	OMX_U16 i = 0;
    769 	OMX_S32 ret = 0;
    770 
    771 	DOMX_ENTER("ENTER");
    772 	for (i = 0; i < numofURI - 1; i++)
    773 	{
    774 		d = opendir(dir_path[i]);
    775 		if (d)
    776 		{
    777 			/* read each filename */
    778 			while ((dir = readdir(d)) != NULL)
    779 			{
    780 				filename = dir->d_name;
    781 				strcpy(temp, dir_path[i]);
    782 				strcat(temp, filename);
    783 				if ((*filename != *dotdot))
    784 				{
    785 					DOMX_DEBUG
    786 					    ("\n\t DCC Profiles copying into buffer => %s mpu_addr: %p",
    787 					    temp, buffer);
    788 					pFile = fopen(temp, "rb");
    789 					if (pFile == NULL)
    790 					{
    791 						DOMX_ERROR("File open error");
    792 						ret = -1;
    793 					} else
    794 					{
    795 						fseek(pFile, 0, SEEK_END);
    796 						lSize = ftell(pFile);
    797 						rewind(pFile);
    798 						/* buffer is not NULL then copy all the DCC profiles into buffer
    799 						   else return the size of the DCC directory */
    800 						if (buffer)
    801 						{
    802 							// copy file into the buffer:
    803 							result =
    804 							    fread(buffer, 1,
    805 							    lSize, pFile);
    806 							if (result != (size_t) lSize)
    807 							{
    808 								DOMX_ERROR
    809 								    ("fread: Reading error");
    810 								ret = -1;
    811 							}
    812 							buffer =
    813 							    buffer + lSize;
    814 						}
    815 						/* getting the size of the total dcc files available in FS */
    816 						dcc_buf_size =
    817 						    dcc_buf_size + lSize;
    818 						// terminate
    819 						fclose(pFile);
    820 					}
    821 				}
    822 			}
    823 			closedir(d);
    824 		}
    825 	}
    826 	if (ret == 0)
    827 		ret = dcc_buf_size;
    828 
    829 	DOMX_EXIT("return %d", ret);
    830 	return ret;
    831 }
    832 
    833 /* ===========================================================================*/
    834 /**
    835  * @name DCC_Deinit()
    836  * @brief
    837  * @param void
    838  * @return void
    839  * @sa TBD
    840  *
    841  */
    842 /* ===========================================================================*/
    843 void DCC_DeInit()
    844 {
    845 	DOMX_ENTER("ENTER");
    846 
    847 	if (DCC_Buff)
    848 	{
    849 #ifdef USE_ION
    850 		munmap(DCC_Buff_ptr, dccbuf_size);
    851 		close(mmap_fd);
    852 		ion_free(ion_fd, DCC_Buff);
    853 		ion_close(ion_fd);
    854 		DCC_Buff = NULL;
    855 #endif
    856 	}
    857 
    858 	DOMX_EXIT("EXIT");
    859 }
    860 
    861 
    862 
    863 /*===============================================================*/
    864 /** @fn Cam_Setup : This function is called when the the OMX Camera library is
    865  *                  loaded. It creates a mutex, which is used during DCC_Init()
    866  */
    867 /*===============================================================*/
    868 void __attribute__ ((constructor)) Cam_Setup(void)
    869 {
    870 	TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
    871 
    872 	eError = TIMM_OSAL_MutexCreate(&cam_mutex);
    873 	if (eError != TIMM_OSAL_ERR_NONE)
    874 	{
    875 		TIMM_OSAL_Error("Creation of default mutex failed");
    876 	}
    877 }
    878 
    879 
    880 /*===============================================================*/
    881 /** @fn Cam_Destroy : This function is called when the the OMX Camera library is
    882  *                    unloaded. It destroys the mutex which was created by
    883  *                    Core_Setup().
    884  *
    885  */
    886 /*===============================================================*/
    887 void __attribute__ ((destructor)) Cam_Destroy(void)
    888 {
    889 	TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
    890 
    891 	eError = TIMM_OSAL_MutexDelete(cam_mutex);
    892 	if (eError != TIMM_OSAL_ERR_NONE)
    893 	{
    894 		TIMM_OSAL_Error("Destruction of default mutex failed");
    895 	}
    896 }
    897