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