1
2 /*
3 * Copyright (C) Texas Instruments - http://www.ti.com/
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21 /* ==============================================================================
22 * Texas Instruments OMAP (TM) Platform Software
23 * (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
24 *
25 * Use of this software is controlled by the terms and conditions found
26 * in the license agreement under which this software has been supplied.
27 * ============================================================================ */
28 /**
29 * @file OMX_JpegDecoder.c
30 *
31 * This file implements OMX Component for JPEG decoder
32 *
33 * @patth $(CSLPATH)\jpeg_dec\src\OMX_JpegDecoder.c
34 *
35 * @rev 0.2
36 */
37
38 /****************************************************************
39 * INCLUDE FILES
40 *****************************************************************/
41
42 /* -----------System and Platform Files ------------------------*/
43
44 #ifdef UNDER_CE
45 #include <windows.h>
46 #include <oaf_osal.h>
47 #include <omx_core.h>
48 #else
49 #include <wchar.h>
50 #include <unistd.h>
51 #include <sys/time.h>
52 #include <sys/types.h>
53 #include <sys/ioctl.h>
54 #include <sys/select.h>
55 #include <errno.h>
56 #include <pthread.h>
57 #endif
58
59 #include <string.h>
60 #include <fcntl.h>
61 #include <stdlib.h>
62 #include <stdio.h>
63 #include <dbapi.h>
64
65 /* -----------------Program Header Files ---------------------------*/
66
67 #include "OMX_JpegDec_Utils.h"
68
69 #ifdef RESOURCE_MANAGER_ENABLED
70 #include <ResourceManagerProxyAPI.h>
71 #endif
72
73 /*----------------------Global-----------------------------------*/
74 OMX_STRING cJPEGdecName = "OMX.TI.JPEG.decoder";
75
76
77 /* ---------------------------- Fucntion prototypes -----------------*/
78
79 static OMX_ERRORTYPE SetCallbacks_JPEGDec(OMX_HANDLETYPE hComp,
80 OMX_CALLBACKTYPE* pCallBacks,
81 OMX_PTR pAppData);
82 static OMX_ERRORTYPE GetComponentVersion_JPEGDec(OMX_HANDLETYPE hComp,
83 OMX_STRING pComponentName,
84 OMX_VERSIONTYPE* pComponentVersion,
85 OMX_VERSIONTYPE* pSpecVersion,
86 OMX_UUIDTYPE* pComponentUUID);
87 static OMX_ERRORTYPE SendCommand_JPEGDec(OMX_HANDLETYPE hComponent,
88 OMX_COMMANDTYPE Cmd,
89 OMX_U32 nParam,
90 OMX_PTR pCmdData);
91 static OMX_ERRORTYPE GetParameter_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,
92 OMX_IN OMX_INDEXTYPE nParamIndex,
93 OMX_INOUT OMX_PTR ComponentParameterStructure);
94 static OMX_ERRORTYPE SetParameter_JPEGDec(OMX_HANDLETYPE hComp,
95 OMX_INDEXTYPE nParamIndex,
96 OMX_PTR ComponentParameterStructure);
97 static OMX_ERRORTYPE GetConfig_JPEGDec(OMX_HANDLETYPE hComp,
98 OMX_INDEXTYPE nConfigIndex,
99 OMX_PTR ComponentConfigStructure);
100 static OMX_ERRORTYPE SetConfig_JPEGDec(OMX_HANDLETYPE hComp,
101 OMX_INDEXTYPE nConfigIndex,
102 OMX_PTR ComponentConfigStructure);
103 static OMX_ERRORTYPE EmptyThisBuffer(OMX_HANDLETYPE hComp,
104 OMX_BUFFERHEADERTYPE* pBuffer);
105
106 static OMX_ERRORTYPE FillThisBuffer_JPEGDec(OMX_HANDLETYPE hComp,
107 OMX_BUFFERHEADERTYPE* pBuffer);
108
109 static OMX_ERRORTYPE GetState(OMX_HANDLETYPE hComp,
110 OMX_STATETYPE* pState);
111 static OMX_ERRORTYPE ComponentTunnelRequest_JPEGDec(OMX_IN OMX_HANDLETYPE hComp,
112 OMX_IN OMX_U32 nPort,
113 OMX_IN OMX_HANDLETYPE hTunneledComp,
114 OMX_IN OMX_U32 nTunneledPort,
115 OMX_INOUT OMX_TUNNELSETUPTYPE* pTunnelSetup);
116 static OMX_ERRORTYPE UseBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,
117 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
118 OMX_IN OMX_U32 nPortIndex,
119 OMX_IN OMX_PTR pAppPrivate,
120 OMX_IN OMX_U32 nSizeBytes,
121 OMX_IN OMX_U8* pBuffer) ;
122 static OMX_ERRORTYPE FreeBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,
123 OMX_IN OMX_U32 nPortIndex,
124 OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
125 static OMX_ERRORTYPE Allocate_DSPResources_JPEGDec(OMX_IN JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate,
126 OMX_IN OMX_U32 nPortIndex);
127 static OMX_ERRORTYPE VerifyTunnelConnection_JPEGDec(JPEGDEC_PORT_TYPE *pPort,
128 OMX_HANDLETYPE hTunneledComp,
129 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef);
130 static OMX_ERRORTYPE AllocateBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,
131 OMX_INOUT OMX_BUFFERHEADERTYPE** pBuffer,
132 OMX_IN OMX_U32 nPortIndex,
133 OMX_IN OMX_PTR pAppPrivate,
134 OMX_IN OMX_U32 nSizeBytes);
135 static void JPEGDEC_InitBufferFlagTrack(JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate,
136 OMX_U32 nPortIndex);
137 #ifdef KHRONOS_1_1
138 static OMX_ERRORTYPE ComponentRoleEnum(OMX_IN OMX_HANDLETYPE hComponent,
139 OMX_OUT OMX_U8 *cRole,
140 OMX_IN OMX_U32 nIndex);
141 #endif
142
143 static OMX_ERRORTYPE GetExtensionIndex_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,
144 OMX_IN OMX_STRING cParameterName,
145 OMX_OUT OMX_INDEXTYPE* pIndexType);
146
147 /* -------------------------- Function Implementation ------------------ */
148
149
150 /* ========================================================================== */
151 /**
152 * @fn AllocateBuffer_JPEGDec - Implements allocatebuffer functionality
153 * @param hComponent - Component handle.
154 * @param pBuffHead - pointer to buffer header structure
155 * @param nPortIndex - Port index
156 * @param pAppPrivate - pointer to application private data
157 * @param nSizeBytes - size of the buffer to allocate
158 * @return: OMX_ERRORTYPE
159 * OMX_ErrorNone on success
160 * !OMX_ErrorNone on any failure
161 */
162 /* ========================================================================== */
AllocateBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,OMX_INOUT OMX_BUFFERHEADERTYPE ** pBuffHead,OMX_IN OMX_U32 nPortIndex,OMX_IN OMX_PTR pAppPrivate,OMX_IN OMX_U32 nSizeBytes)163 static OMX_ERRORTYPE AllocateBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,
164 OMX_INOUT OMX_BUFFERHEADERTYPE** pBuffHead,
165 OMX_IN OMX_U32 nPortIndex,
166 OMX_IN OMX_PTR pAppPrivate,
167 OMX_IN OMX_U32 nSizeBytes)
168 {
169 /*VALIDATE INPUT ARGUMENTS*/
170 OMX_COMPONENTTYPE *pHandle = NULL;
171 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
172 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef = NULL;
173 JPEGDEC_PORT_TYPE* pCompPort;
174 OMX_U8 nBufferCount = -1;
175 OMX_ERRORTYPE eError = OMX_ErrorNone;
176
177 OMX_CHECK_PARAM(hComponent);
178 pHandle = (OMX_COMPONENTTYPE *)hComponent;
179 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
180 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
181
182 pPortDef = pComponentPrivate->pCompPort[nPortIndex]->pPortDef;
183 nBufferCount = pComponentPrivate->pCompPort[nPortIndex]->nBuffCount;
184 pCompPort = pComponentPrivate->pCompPort[nPortIndex];
185
186 OMX_PRINT1(pComponentPrivate->dbg, "Entering function AllocateBuffer_JPEGDec\n");
187
188 OMX_PRBUFFER1(pComponentPrivate->dbg, "In AllocateBuffer_JPEGDec %d %lu %lu\n",
189 nBufferCount, pPortDef->nBufferCountActual, nPortIndex);
190
191 if (nBufferCount >= pPortDef->nBufferCountActual) {
192 eError = OMX_ErrorInsufficientResources;
193 OMX_PRBUFFER4(pComponentPrivate->dbg, " try to allocate more buffers that the port supports\n");
194 goto EXIT;
195 }
196
197 if (nPortIndex == JPEGDEC_INPUT_PORT) {
198 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr, sizeof(OMX_BUFFERHEADERTYPE));
199 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr, OMX_BUFFERHEADERTYPE);
200 OMX_PRBUFFER1(pComponentPrivate->dbg, "pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr = %p\n", pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr);
201 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nOutputPortIndex = OMX_NOPORT;
202 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nInputPortIndex = pPortDef->nPortIndex;
203 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
204 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nVersion = pPortDef->nVersion;
205 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pAppPrivate = pAppPrivate;
206 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nAllocLen = nSizeBytes;
207 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->bAllocbyComponent = OMX_TRUE;
208
209 *pBuffHead = pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr;
210
211 }
212 else if (nPortIndex == JPEGDEC_OUTPUT_PORT) {
213
214 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr, sizeof(OMX_BUFFERHEADERTYPE));
215 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr, OMX_BUFFERHEADERTYPE);
216 OMX_PRBUFFER1(pComponentPrivate->dbg, "pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBuffCount]->pBufferHdr = %p\n", pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr);
217 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nOutputPortIndex = pPortDef->nPortIndex;
218 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nInputPortIndex = OMX_NOPORT;
219 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
220 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nVersion = pPortDef->nVersion;
221 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pAppPrivate = pAppPrivate;
222 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nAllocLen = nSizeBytes;
223 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->bAllocbyComponent = OMX_TRUE;
224
225 *pBuffHead = pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr;
226
227 }
228 else {
229 eError = OMX_ErrorBadPortIndex;
230 goto EXIT;
231 }
232
233 if (nPortIndex == JPEGDEC_INPUT_PORT) {
234 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer, nSizeBytes + 256);
235 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer = (pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer) + 128;
236
237 #ifdef __PERF_INSTRUMENTATION__
238 PERF_ReceivedFrame(pComponentPrivate->pPERF,
239 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer,
240 nSizeBytes,
241 PERF_ModuleMemory);
242 #endif
243
244 }
245 else if (nPortIndex == JPEGDEC_OUTPUT_PORT) {
246 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer, nSizeBytes + 256);
247 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer = pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer + 128;
248
249 #ifdef __PERF_INSTRUMENTATION__
250 PERF_ReceivedFrame(pComponentPrivate->pPERF,
251 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer,
252 nSizeBytes,
253 PERF_ModuleMemory);
254 #endif
255
256 }
257 else {
258 eError = OMX_ErrorBadPortIndex;
259 goto EXIT;
260 }
261
262 eError = Allocate_DSPResources_JPEGDec(pComponentPrivate, nPortIndex);
263 if (eError != OMX_ErrorNone) {
264 OMX_PRDSP4(pComponentPrivate->dbg, "OMX_ErrorInsufficientResources\n");
265 eError = OMX_ErrorInsufficientResources;
266 goto EXIT;
267 }
268
269 if (nPortIndex == JPEGDEC_INPUT_PORT) {
270 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->pInputPortPrivate =
271 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount];
272 }
273 else {
274 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->pOutputPortPrivate =
275 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount];
276 }
277
278 if (pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->hTunnelComponent != NULL) {
279 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->eBufferOwner = JPEGDEC_BUFFER_TUNNEL_COMPONENT;
280 }
281 else {
282 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->eBufferOwner = JPEGDEC_BUFFER_CLIENT;
283 }
284
285 pComponentPrivate->pCompPort[nPortIndex]->nBuffCount++;
286 if (pComponentPrivate->pCompPort[nPortIndex]->nBuffCount == pPortDef->nBufferCountActual) {
287 pPortDef->bPopulated = OMX_TRUE;
288 JPEGDEC_InitBufferFlagTrack(pComponentPrivate, nPortIndex);
289 pthread_mutex_lock(&(pComponentPrivate->mJpegDecMutex));
290 pthread_cond_signal(&(pComponentPrivate->sPortPopulated_cond));
291 pthread_mutex_unlock(&(pComponentPrivate->mJpegDecMutex));
292 OMX_PRINT2(pComponentPrivate->dbg, " Port [%lu] Populated!\n", nPortIndex);
293 }
294
295 EXIT:
296 return eError;
297 } /* End of AllocateBuffer_JPEGDec */
298
299
300 /* ========================================================================== */
301 /**
302 * @fn FreeBuffer_JPEGDec - Implements freebuffer functionality
303 * @param hComponent - Component handle.
304 * @param nPortIndex - Port index
305 * @param pBuffHead - pointer to buffer header structure
306 * @return: OMX_ERRORTYPE
307 * OMX_ErrorNone on success
308 * !OMX_ErrorNone on any failure
309 */
310 /* ========================================================================== */
FreeBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,OMX_IN OMX_U32 nPortIndex,OMX_IN OMX_BUFFERHEADERTYPE * pBuffHead)311 static OMX_ERRORTYPE FreeBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,
312 OMX_IN OMX_U32 nPortIndex,
313 OMX_IN OMX_BUFFERHEADERTYPE* pBuffHead)
314 {
315 OMX_ERRORTYPE eError = OMX_ErrorNone;
316 OMX_COMPONENTTYPE *pHandle = NULL;
317 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
318 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef = NULL;
319 JPEGDEC_BUFFER_PRIVATE* pBuffPrivate = NULL;
320 OMX_U8* pTemp;
321 OMX_U8 nBufferCount = -1;
322
323 OMX_CHECK_PARAM(hComponent);
324 OMX_CHECK_PARAM(pBuffHead);
325
326 pHandle = (OMX_COMPONENTTYPE *)hComponent;
327 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
328
329 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
330
331 if (nPortIndex != 1 && nPortIndex != 0) {
332 eError = OMX_ErrorBadPortIndex;
333 goto PRINT_EXIT;
334 }
335
336 OMX_PRBUFFER2(pComponentPrivate->dbg, "JPEG-D: Entering funtion FreeBuffer_JPEGDec %lu %p\n", nPortIndex, pBuffHead);
337
338 if(pComponentPrivate->nCurState == OMX_StateLoaded){
339 eError = OMX_ErrorIncorrectStateOperation;
340 goto PRINT_EXIT;
341 }
342 pPortDef = pComponentPrivate->pCompPort[nPortIndex]->pPortDef;
343 nBufferCount = pComponentPrivate->pCompPort[nPortIndex]->nBuffCount;
344 OMX_PRBUFFER1(pComponentPrivate->dbg, "Trying to Free Header %p\nBuffer %p\n", pBuffHead, pBuffHead->pBuffer);
345
346 if (nPortIndex == JPEGDEC_INPUT_PORT) {
347
348 pBuffPrivate = pBuffHead->pInputPortPrivate;
349 if (pBuffPrivate->pUALGParams) {
350 pTemp = (OMX_U8*)(pBuffPrivate->pUALGParams);
351 pTemp -= 128;
352 (pBuffPrivate->pUALGParams) = (JPEGDEC_UAlgInBufParamStruct *)pTemp;
353 OMX_FREE(pBuffPrivate->pUALGParams);
354 pBuffPrivate->pUALGParams = NULL;
355 }
356 }
357 else if (nPortIndex == JPEGDEC_OUTPUT_PORT) {
358
359 pBuffPrivate = pBuffHead->pOutputPortPrivate;
360 if (pBuffPrivate->pUALGParams) {
361 pTemp = (OMX_U8*)(pBuffPrivate->pUALGParams);
362 pTemp -= 128;
363 (pBuffPrivate->pUALGParams) = (JPEGDEC_UAlgOutBufParamStruct *)pTemp;
364 OMX_FREE(pBuffPrivate->pUALGParams);
365 pBuffPrivate->pUALGParams = NULL;
366 }
367 }
368 else {
369 eError = OMX_ErrorBadPortIndex;
370 goto PRINT_EXIT;
371 }
372
373 if (pBuffPrivate->bAllocbyComponent == OMX_TRUE) {
374 if (pBuffHead->pBuffer) {
375
376 #ifdef __PERF_INSTRUMENTATION__
377 PERF_SendingFrame(pComponentPrivate->pPERF,
378 pBuffHead->pBuffer,
379 pBuffHead->nFilledLen,
380 PERF_ModuleMemory);
381 #endif
382
383 OMX_PRBUFFER1(pComponentPrivate->dbg, "INTERNAL BUFFER USED , trying to free it.\n");
384 pBuffHead->pBuffer -= 128;
385 OMX_FREE(pBuffHead->pBuffer);
386 pBuffHead->pBuffer = NULL;
387 }
388 }
389
390 if (pBuffHead) {
391 OMX_FREE(pBuffHead);
392 pBuffHead = NULL;
393 }
394
395
396 OMX_PRSTATE2(pComponentPrivate->dbg, "Current state is %d and To State is %d\n", pComponentPrivate->nCurState, pComponentPrivate->nToState);
397 if ( pPortDef->bEnabled &&
398 ((pComponentPrivate->nCurState == OMX_StateIdle && pComponentPrivate->nToState != OMX_StateLoaded) ||
399 (pComponentPrivate->nCurState == OMX_StateExecuting ||
400 pComponentPrivate->nCurState == OMX_StatePause)) ) {
401
402 pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle,
403 pComponentPrivate->pHandle->pApplicationPrivate,
404 OMX_EventError,
405 OMX_ErrorPortUnpopulated,
406 OMX_TI_ErrorMinor,
407 "Port Unpopulated");
408 }
409
410 nBufferCount = --pComponentPrivate->pCompPort[nPortIndex]->nBuffCount;
411
412 OMX_PRBUFFER1(pComponentPrivate->dbg, "nBufferCount %d\n", nBufferCount);
413 if (nBufferCount == 0) {
414 pComponentPrivate->pCompPort[nPortIndex]->pPortDef->bPopulated = OMX_FALSE;
415 OMX_PRBUFFER2(pComponentPrivate->dbg, "port %lu is %u\n", nPortIndex, pComponentPrivate->pCompPort[nPortIndex]->pPortDef->bPopulated);
416 pthread_mutex_lock(&(pComponentPrivate->mJpegDecMutex));
417 pthread_cond_signal(&(pComponentPrivate->sPortPopulated_cond));
418 pthread_mutex_unlock(&(pComponentPrivate->mJpegDecMutex));
419 }
420
421 if ((!pPortDef->bEnabled) &&
422 (!pComponentPrivate->pCompPort[nPortIndex]->pPortDef->bPopulated)) {
423 if ((nPortIndex == 0) && (!pComponentPrivate->bInportDisableComplete)) {
424 pComponentPrivate->bInportDisableComplete = OMX_TRUE;
425 pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle,
426 pComponentPrivate->pHandle->pApplicationPrivate,
427 OMX_EventCmdComplete,
428 OMX_CommandPortDisable,
429 0,
430 NULL);
431 }
432 if ((nPortIndex == 1) && (!pComponentPrivate->bOutportDisableComplete)) {
433 pComponentPrivate->bOutportDisableComplete = OMX_TRUE;
434 pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle,
435 pComponentPrivate->pHandle->pApplicationPrivate,
436 OMX_EventCmdComplete,
437 OMX_CommandPortDisable,
438 1,
439 NULL);
440 }
441 }
442 PRINT_EXIT:
443 OMX_PRINT1(pComponentPrivate->dbg, "Exit from FreeBuffer function error = %x\n", eError);
444 EXIT:
445 return eError;
446 } /* End of FreeBuffer_JPEGDec */
447
448
449 /* ========================================================================== */
450 /**
451 * @fn UseBuffer_JPEGDec - Implements usebuffer functionality
452 * @param hComponent - Component handle.
453 * @param pBuffHead - pointer to buffer header structure
454 * @param nPortIndex - Port index
455 * @param pAppPrivate - pointer to application private data
456 * @param nSizeBytes - size of the buffer
457 * @param pBuffer - pointer to the buffer
458 * @return: OMX_ERRORTYPE
459 * OMX_ErrorNone on success
460 * !OMX_ErrorNone on any failure
461 */
462 /* ========================================================================== */
UseBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,OMX_INOUT OMX_BUFFERHEADERTYPE ** ppBufferHdr,OMX_IN OMX_U32 nPortIndex,OMX_IN OMX_PTR pAppPrivate,OMX_IN OMX_U32 nSizeBytes,OMX_IN OMX_U8 * pBuffer)463 static OMX_ERRORTYPE UseBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,
464 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
465 OMX_IN OMX_U32 nPortIndex,
466 OMX_IN OMX_PTR pAppPrivate,
467 OMX_IN OMX_U32 nSizeBytes,
468 OMX_IN OMX_U8* pBuffer)
469 {
470 OMX_COMPONENTTYPE *pHandle = NULL;
471 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
472 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef = NULL;
473 OMX_ERRORTYPE eError = OMX_ErrorNone;
474 OMX_HANDLETYPE hTunnelComponent;
475 OMX_U8 nBufferCount = -1;
476
477 pHandle = (OMX_COMPONENTTYPE *)hComponent;
478 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
479 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
480
481 pPortDef = pComponentPrivate->pCompPort[nPortIndex]->pPortDef;
482 nBufferCount = pComponentPrivate->pCompPort[nPortIndex]->nBuffCount;
483 hTunnelComponent = pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->hTunnelComponent;
484
485 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion UseBuffer_JPEGDec\n");
486
487 #ifdef __PERF_INSTRUMENTATION__
488 PERF_ReceivedFrame(pComponentPrivate->pPERF,
489 pBuffer,
490 nSizeBytes,
491 PERF_ModuleHLMM);
492 #endif
493
494
495 if (nPortIndex == JPEGDEC_INPUT_PORT) {
496 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr, sizeof(OMX_BUFFERHEADERTYPE));
497 *ppBufferHdr = pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr;
498 }
499 else if (nPortIndex == JPEGDEC_OUTPUT_PORT) {
500 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr, sizeof(OMX_BUFFERHEADERTYPE));
501 *ppBufferHdr = pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr;
502 }
503 else {
504 eError = OMX_ErrorBadPortIndex;
505 goto EXIT;
506 }
507 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->bAllocbyComponent = OMX_FALSE;
508
509 /* set relevant fields */
510 (*ppBufferHdr)->nSize = sizeof(OMX_BUFFERHEADERTYPE);
511 (*ppBufferHdr)->nVersion = pPortDef->nVersion;
512 (*ppBufferHdr)->pBuffer = pBuffer;
513 (*ppBufferHdr)->nAllocLen = nSizeBytes;
514 (*ppBufferHdr)->pAppPrivate = pAppPrivate;
515
516 if (hTunnelComponent != NULL) {
517 /* set direction dependent fields */
518 if (pPortDef->eDir == OMX_DirInput) {
519 (*ppBufferHdr)->nInputPortIndex = nPortIndex;
520 (*ppBufferHdr)->nOutputPortIndex = pComponentPrivate->pCompPort[nPortIndex]->nTunnelPort;
521
522 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr = (*ppBufferHdr);
523 }
524 else {
525 (*ppBufferHdr)->nOutputPortIndex = nPortIndex;
526 (*ppBufferHdr)->nInputPortIndex = pComponentPrivate->pCompPort[nPortIndex]->nTunnelPort;
527
528 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr = (*ppBufferHdr);
529 }
530 }
531 else {
532 if (nPortIndex == JPEGDEC_INPUT_PORT) {
533 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->nInputPortIndex = JPEGDEC_INPUT_PORT;
534 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->nOutputPortIndex = OMX_NOPORT;
535 }
536 else {
537 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->nInputPortIndex = OMX_NOPORT;
538 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->nOutputPortIndex = JPEGDEC_OUTPUT_PORT;
539 }
540 }
541 if (nPortIndex == JPEGDEC_INPUT_PORT) {
542 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->pInputPortPrivate =
543 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount];
544 }
545 else {
546 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->pOutputPortPrivate =
547 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount];
548 }
549
550 eError = Allocate_DSPResources_JPEGDec(pComponentPrivate, nPortIndex);
551 if (eError != OMX_ErrorNone) {
552 OMX_PRDSP4(pComponentPrivate->dbg, "Error: Allocate_DSPResources_JPEGDec failed\n");
553 eError = OMX_ErrorInsufficientResources;
554 goto EXIT;
555 }
556 /* increment buffer count */
557
558 pComponentPrivate->pCompPort[nPortIndex]->nBuffCount++;
559 if (pComponentPrivate->pCompPort[nPortIndex]->nBuffCount == pPortDef->nBufferCountActual) {
560 pPortDef->bPopulated = OMX_TRUE;
561 JPEGDEC_InitBufferFlagTrack(pComponentPrivate, nPortIndex);
562 pthread_mutex_lock(&(pComponentPrivate->mJpegDecMutex));
563 pthread_cond_signal(&(pComponentPrivate->sPortPopulated_cond));
564 pthread_mutex_unlock(&(pComponentPrivate->mJpegDecMutex));
565 }
566 EXIT:
567 return eError;
568 } /* end of UseBuffer_JPEGDec */
569
570
571
572 /* ========================================================================== */
573 /**
574 * @fn OMX_ComponentInit - Updates the component function pointer to the handle.
575 * Sets default parameters.
576 * @param hComponent - Component handle.
577 * @return: OMX_ERRORTYPE
578 * OMX_ErrorNone on success
579 * !OMX_ErrorNone on any failure
580 */
581 /* ========================================================================== */
OMX_ComponentInit(OMX_HANDLETYPE hComponent)582 OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE hComponent)
583 {
584
585 OMX_COMPONENTTYPE *pHandle = NULL;
586 OMX_ERRORTYPE eError = OMX_ErrorNone;
587 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
588 OMX_U8 i = 0;
589 OMX_CHECK_PARAM(hComponent);
590 pHandle = (OMX_COMPONENTTYPE *)hComponent;
591
592 LinkedList_Create(&AllocList);
593
594 OMX_MALLOC(pHandle->pComponentPrivate, sizeof(JPEGDEC_COMPONENT_PRIVATE));
595
596 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
597
598 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
599
600 OMX_DBG_INIT(pComponentPrivate->dbg, "OMX_DBG_JPEGDEC");
601
602 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion OMX_ComponentInit\n");
603
604 #ifdef __PERF_INSTRUMENTATION__
605 pComponentPrivate->pPERF = PERF_Create(PERF_FOURS("JPD "), PERF_ModuleLLMM | PERF_ModuleImageDecode);
606 pComponentPrivate->pPERFcomp = NULL;
607 #endif
608
609 ((JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate)->pHandle = pHandle;
610 pComponentPrivate->nCurState = OMX_StateLoaded;
611 pComponentPrivate->ComponentVersion.s.nVersionMajor = 0x01;
612 pComponentPrivate->ComponentVersion.s.nVersionMinor = 0x00;
613 pComponentPrivate->ComponentVersion.s.nRevision = 0x00;
614 pComponentPrivate->ComponentVersion.s.nStep = 0x00;
615 OMX_MALLOC(pComponentPrivate->cComponentName, COMP_MAX_NAMESIZE + 1);
616 strncpy(pComponentPrivate->cComponentName, cJPEGdecName, COMP_MAX_NAMESIZE);
617
618 pHandle->SetCallbacks = SetCallbacks_JPEGDec;
619 pHandle->GetComponentVersion = GetComponentVersion_JPEGDec;
620 pHandle->SendCommand = SendCommand_JPEGDec;
621 pHandle->GetParameter = GetParameter_JPEGDec;
622 pHandle->SetParameter = SetParameter_JPEGDec;
623 pHandle->GetConfig = GetConfig_JPEGDec;
624 pHandle->SetConfig = SetConfig_JPEGDec;
625 pHandle->GetState = GetState;
626 pHandle->EmptyThisBuffer = EmptyThisBuffer;
627 pHandle->FillThisBuffer = FillThisBuffer_JPEGDec;
628 pHandle->ComponentTunnelRequest = ComponentTunnelRequest_JPEGDec;
629 pHandle->ComponentDeInit = ComponentDeInit;
630 pHandle->UseBuffer = UseBuffer_JPEGDec;
631 pHandle->FreeBuffer = FreeBuffer_JPEGDec;
632 pHandle->AllocateBuffer = AllocateBuffer_JPEGDec;
633 pHandle->GetExtensionIndex = GetExtensionIndex_JPEGDec;
634 #ifdef KHRONOS_1_1
635 pHandle->ComponentRoleEnum = ComponentRoleEnum;
636 #endif
637
638 /* Allocate memory for component data structures */
639 OMX_MALLOC(pComponentPrivate->pPortParamType, sizeof(OMX_PORT_PARAM_TYPE));
640 OMX_MALLOC(pComponentPrivate->pPriorityMgmt, sizeof(OMX_PRIORITYMGMTTYPE));
641 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT], sizeof(JPEGDEC_PORT_TYPE));
642 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT], sizeof(JPEGDEC_PORT_TYPE));
643 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pParamBufSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE));
644 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pParamBufSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE));
645 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
646 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
647 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE));
648 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE));
649 OMX_MALLOC(pComponentPrivate->pScalePrivate, sizeof(OMX_CONFIG_SCALEFACTORTYPE)); /* Scale Factor */
650 OMX_MALLOC(pComponentPrivate->pSectionDecode, sizeof(OMX_CUSTOM_IMAGE_DECODE_SECTION));
651 OMX_MALLOC(pComponentPrivate->pSubRegionDecode, sizeof(OMX_CUSTOM_IMAGE_DECODE_SUBREGION));
652
653 #ifdef KHRONOS_1_1
654 OMX_MALLOC(pComponentPrivate->pAudioPortType, sizeof(OMX_PORT_PARAM_TYPE));
655 OMX_CONF_INIT_STRUCT(pComponentPrivate->pAudioPortType, OMX_PORT_PARAM_TYPE);
656 OMX_MALLOC(pComponentPrivate->pVideoPortType, sizeof(OMX_PORT_PARAM_TYPE));
657 OMX_CONF_INIT_STRUCT(pComponentPrivate->pVideoPortType, OMX_PORT_PARAM_TYPE);
658 OMX_MALLOC(pComponentPrivate->pOtherPortType, sizeof(OMX_PORT_PARAM_TYPE));
659 OMX_CONF_INIT_STRUCT(pComponentPrivate->pOtherPortType, OMX_PORT_PARAM_TYPE);
660 OMX_MALLOC(pComponentPrivate->pCompRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
661 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompRole,OMX_PARAM_COMPONENTROLETYPE);
662 OMX_MALLOC(pComponentPrivate->pQuantTable, sizeof(OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE));
663 OMX_CONF_INIT_STRUCT(pComponentPrivate->pQuantTable,OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE);
664 pComponentPrivate->pQuantTable->eQuantizationTable = OMX_IMAGE_QuantizationTableLuma;
665 OMX_MALLOC(pComponentPrivate->pHuffmanTable, sizeof(OMX_IMAGE_PARAM_HUFFMANTTABLETYPE));
666 OMX_CONF_INIT_STRUCT(pComponentPrivate->pHuffmanTable,OMX_IMAGE_PARAM_HUFFMANTTABLETYPE);
667 pComponentPrivate->pHuffmanTable->eHuffmanTable = OMX_IMAGE_HuffmanTableAC;
668
669 pComponentPrivate->pAudioPortType->nPorts = 0;
670 pComponentPrivate->pAudioPortType->nStartPortNumber = -1;
671 pComponentPrivate->pVideoPortType->nPorts = 0;
672 pComponentPrivate->pVideoPortType->nStartPortNumber = -1;
673 pComponentPrivate->pOtherPortType->nPorts = 0;
674 pComponentPrivate->pOtherPortType->nStartPortNumber = -1;
675
676 #endif
677 for (i = 0;i<NUM_OF_BUFFERS;i++) {
678 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[i], sizeof(JPEGDEC_BUFFER_PRIVATE));
679 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[i]->pBufferHdr = NULL;
680 }
681
682 for (i = 0;i<NUM_OF_BUFFERS;i++) {
683 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[i], sizeof(JPEGDEC_BUFFER_PRIVATE));
684 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[i]->pBufferHdr = NULL;
685 }
686
687 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->hTunnelComponent = NULL;
688 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->hTunnelComponent = NULL;
689 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->nBuffCount = 0;
690 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->nBuffCount = 0;
691 pComponentPrivate->nProgressive = 0;
692 pComponentPrivate->nInputFrameWidth = 1600;
693 pComponentPrivate->nOutputColorFormat = OMX_COLOR_Format32bitARGB8888;
694 pComponentPrivate->nProfileID = 0;
695 pComponentPrivate->nIsLCMLActive = 0;
696 pComponentPrivate->pDllHandle = NULL;
697 pComponentPrivate->pLCML = NULL;
698 pComponentPrivate->pMarkData = NULL;
699 pComponentPrivate->pMarkBuf = NULL;
700 pComponentPrivate->hMarkTargetComponent = NULL;
701 pComponentPrivate->pHandle->pApplicationPrivate = (OMX_PTR *)200;
702 pComponentPrivate->nInPortIn = 0;
703 pComponentPrivate->nOutPortOut = 0;
704 pComponentPrivate->bPreempted = OMX_FALSE;
705
706 /*Slide decoding defaults*/
707 OMX_CONF_INIT_STRUCT(pComponentPrivate->pSectionDecode, OMX_CUSTOM_IMAGE_DECODE_SECTION);
708 pComponentPrivate->pSectionDecode->nMCURow = 0;
709 pComponentPrivate->pSectionDecode->nAU = 0;
710 pComponentPrivate->pSectionDecode->bSectionsInput = 0;
711 pComponentPrivate->pSectionDecode->bSectionsOutput = 0;
712
713 OMX_CONF_INIT_STRUCT(pComponentPrivate->pSubRegionDecode, OMX_CUSTOM_IMAGE_DECODE_SUBREGION);
714 pComponentPrivate->pSubRegionDecode->nXOrg = 0;
715 pComponentPrivate->pSubRegionDecode->nYOrg = 0;
716 pComponentPrivate->pSubRegionDecode->nXLength = 0;
717 pComponentPrivate->pSubRegionDecode->nYLength = 0;
718
719
720 /* Set pPortParamType defaults */
721 OMX_CONF_INIT_STRUCT(pComponentPrivate->pPortParamType, OMX_PORT_PARAM_TYPE);
722 pComponentPrivate->pPortParamType->nPorts = NUM_OF_PORTS;
723 pComponentPrivate->pPortParamType->nStartPortNumber = 0x0;
724
725 /* Set pInPortDef defaults */
726 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
727 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nPortIndex = JPEGDEC_INPUT_PORT;
728 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->eDir = OMX_DirInput;
729 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nBufferCountActual = NUM_OF_BUFFERS;
730 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nBufferCountMin = 1;
731 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nBufferSize = 70532;
732 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->bEnabled = OMX_TRUE;
733 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->bPopulated = OMX_FALSE;
734 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->eDomain = OMX_PortDomainImage;
735 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.cMIMEType = "JPEGDEC";
736 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.pNativeRender = NULL;
737 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.nFrameWidth = 640 ; /* 128*/
738 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.nFrameHeight = 480; /*96 */
739 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.nStride = -1;
740 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.nSliceHeight = -1;
741 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.bFlagErrorConcealment = OMX_FALSE;
742 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.eCompressionFormat = OMX_IMAGE_CodingJPEG;
743 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.eColorFormat = OMX_COLOR_FormatUnused;
744
745 /* Set pOutPortDef defaults */
746 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
747 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nPortIndex = JPEGDEC_OUTPUT_PORT;
748 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->eDir = OMX_DirOutput;
749 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nBufferCountMin = 1;
750 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nBufferCountActual = NUM_OF_BUFFERS;
751 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nBufferSize = (640*480*2);
752 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->bEnabled = OMX_TRUE;
753 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->bPopulated = OMX_FALSE;
754 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->eDomain = OMX_PortDomainImage;
755 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.cMIMEType = "JPEGDEC";
756 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.pNativeRender = NULL;
757 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.nFrameWidth = 640;
758 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.nFrameHeight = 480;
759 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.nStride = -1;
760 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.nSliceHeight = -1;
761 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.bFlagErrorConcealment = OMX_FALSE;
762 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.eCompressionFormat = OMX_IMAGE_CodingUnused;
763 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
764 /* added for vpp tunneling */
765 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.video.eColorFormat = OMX_COLOR_FormatYCbYCr;
766
767
768 /* Set pInPortFormat defaults */
769 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, OMX_IMAGE_PARAM_PORTFORMATTYPE);
770 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nPortIndex = JPEGDEC_INPUT_PORT;
771 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nIndex = 0x0;
772 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->eCompressionFormat =OMX_IMAGE_CodingJPEG;
773 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->eColorFormat = OMX_COLOR_FormatUnused;
774
775 /* Set pOutPortFormat defaults */
776 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, OMX_IMAGE_PARAM_PORTFORMATTYPE);
777 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nPortIndex = JPEGDEC_OUTPUT_PORT;
778 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nIndex = 0x0;
779 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->eCompressionFormat = OMX_IMAGE_CodingUnused;
780 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
781
782 /* Set pPriorityMgmt defaults */
783 OMX_CONF_INIT_STRUCT(pComponentPrivate->pPriorityMgmt, OMX_PRIORITYMGMTTYPE);
784 pComponentPrivate->pPriorityMgmt->nGroupPriority = -1;
785 pComponentPrivate->pPriorityMgmt->nGroupID = -1;
786
787
788 /* Set pInBufSupplier defaults */
789 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pParamBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE);
790 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pParamBufSupplier->nPortIndex = JPEGDEC_INPUT_PORT;
791 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pParamBufSupplier->eBufferSupplier = OMX_BufferSupplyInput;
792
793 /* Set pOutBufSupplier defaults */
794 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pParamBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE);
795 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pParamBufSupplier->nPortIndex = JPEGDEC_OUTPUT_PORT;
796 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pParamBufSupplier->eBufferSupplier = OMX_BufferSupplyInput;
797
798 /* Set default value for Max width & Height*/
799 pComponentPrivate->sMaxResolution.nWidth = JPGDEC_SNTEST_MAX_WIDTH;
800 pComponentPrivate->sMaxResolution.nHeight = JPGDEC_SNTEST_MAX_HEIGHT;
801
802 /*Initialize Component mutex*/
803 if (pthread_mutex_init(&(pComponentPrivate->mJpegDecMutex), NULL) != 0)
804 {
805 OMX_TRACE4(pComponentPrivate->dbg, "Error at Initialize fill this buffer mutex condition");
806 eError = OMX_ErrorHardware;
807 goto EXIT;
808 }
809
810 /* initialize a condition variable to its default value */
811 if (pthread_cond_init(&(pComponentPrivate->sStop_cond), NULL) != 0)
812 {
813 OMX_TRACE4(pComponentPrivate->dbg, "Error at Initialize fill this buffer mutex condition");
814 eError = OMX_ErrorHardware;
815 goto EXIT;
816 }
817
818 #ifdef KHRONOS_1_1
819 strcpy((char *)pComponentPrivate->componentRole.cRole, "image_decoder.jpeg");
820 #endif
821
822
823 #ifdef RESOURCE_MANAGER_ENABLED
824 /* load the ResourceManagerProxy thread */
825 eError = RMProxy_NewInitalizeEx(OMX_COMPONENTTYPE_IMAGE);
826 if (eError != OMX_ErrorNone) {
827 OMX_PRMGR4(pComponentPrivate->dbg, "Error returned from loading ResourceManagerProxy thread: %x\n", eError);
828 goto EXIT;
829 }
830 #endif
831
832 eError= Start_ComponentThreadJpegDec(pHandle);
833
834
835 EXIT:
836 if(eError != OMX_ErrorNone){
837 /* LinkedList_DisplayAll (&AllocList); */
838 OMX_FREEALL();
839 LinkedList_Destroy(&AllocList);
840 }
841 return eError;
842 } /* End of OMX_ComponentInit */
843 /* ========================================================================== */
844 /**
845 * @fn SetCallbacks_JPEGDec - Sets application callbacks to the component
846 * @param hComponent - Component handle.
847 * @param pCallBacks - application callbacks
848 * @param pAppData - pointer to application Data
849 * @return: OMX_ERRORTYPE
850 * OMX_ErrorNone on success
851 * !OMX_ErrorNone on any failure
852 */
853 /* ========================================================================== */
SetCallbacks_JPEGDec(OMX_HANDLETYPE pComponent,OMX_CALLBACKTYPE * pCallBacks,OMX_PTR pAppData)854 static OMX_ERRORTYPE SetCallbacks_JPEGDec(OMX_HANDLETYPE pComponent,
855 OMX_CALLBACKTYPE* pCallBacks,
856 OMX_PTR pAppData)
857 {
858 OMX_ERRORTYPE eError = OMX_ErrorNone;
859 OMX_COMPONENTTYPE *pHandle = NULL;
860 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
861
862 OMX_CHECK_PARAM(pComponent);
863
864 pHandle = (OMX_COMPONENTTYPE*)pComponent;
865 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
866
867 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
868
869 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion SetCallbacks_JPEGDec\n");
870
871 if (pCallBacks == NULL) {
872 eError = OMX_ErrorBadParameter;
873 OMX_ERROR5(pComponentPrivate->dbg, "Entering funtion SetCallbacks_JPEGDec\n");
874 goto EXIT;
875 }
876
877 /* Copy the callbacks of the application to the component private */
878 OMX_MEMCPY_CHECK(&(pComponentPrivate->cbInfo));
879 memcpy(&(pComponentPrivate->cbInfo), pCallBacks, sizeof(OMX_CALLBACKTYPE));
880
881
882 /* copy the application private data to component memory */
883 pHandle->pApplicationPrivate = pAppData;
884 pComponentPrivate->nCurState = OMX_StateLoaded;
885
886 EXIT:
887 return eError;
888 } /* End of SetCallbacks_JPEGDec */
889
890
891
892 /* ========================================================================== */
893 /**
894 * @fn GetComponentVersion_JPEGDec - This method will get the component Version.
895 * @param hComp - handle for this instance of the component
896 * @param pComponentName - component name
897 * @param pComponentVersion - component version
898 * @param pSpecVersion - OMX specification version
899 * @param pComponentUUID - UUID of the component
900 * @return: OMX_ERRORTYPE
901 * OMX_ErrorNone on success
902 * !OMX_ErrorNone on any failure
903 */
904 /* ========================================================================== */
GetComponentVersion_JPEGDec(OMX_HANDLETYPE hComp,OMX_STRING szComponentName,OMX_VERSIONTYPE * pComponentVersion,OMX_VERSIONTYPE * pSpecVersion,OMX_UUIDTYPE * pComponentUUID)905 static OMX_ERRORTYPE GetComponentVersion_JPEGDec(OMX_HANDLETYPE hComp,
906 OMX_STRING szComponentName,
907 OMX_VERSIONTYPE* pComponentVersion,
908 OMX_VERSIONTYPE* pSpecVersion,
909 OMX_UUIDTYPE* pComponentUUID)
910 {
911 OMX_ERRORTYPE eError = OMX_ErrorNone;
912 OMX_COMPONENTTYPE * pHandle = NULL;
913 JPEGDEC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
914 OMX_U8 *pTemp = NULL;
915
916 if (!hComp || !szComponentName || !pComponentVersion || !pSpecVersion || !pComponentUUID) {
917 eError = OMX_ErrorBadParameter;
918 goto EXIT;
919 }
920 pHandle = (OMX_COMPONENTTYPE*)hComp;
921 if (!pHandle->pComponentPrivate) {
922 eError = OMX_ErrorBadParameter;
923 goto EXIT;
924 }
925 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate;
926
927 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
928
929 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion GetComponentVersion_JPEGDec\n");
930
931 strncpy(szComponentName, pComponentPrivate->cComponentName, COMP_MAX_NAMESIZE);
932 pTemp = memcpy(pComponentVersion, &(pComponentPrivate->ComponentVersion.s), sizeof(pComponentPrivate->ComponentVersion.s));
933 if(pTemp == NULL){
934 eError = OMX_ErrorUndefined;
935 goto EXIT;
936 }
937 pTemp = memcpy(pSpecVersion, &(pComponentPrivate->SpecVersion.s), sizeof(pComponentPrivate->SpecVersion.s));
938 if(pTemp == NULL){
939 eError = OMX_ErrorUndefined;
940 goto EXIT;
941 }
942 EXIT:
943 return eError;
944 }/* End of GetComponentVersion_JPEGDec */
945
946 /* ========================================================================== */
947 /**
948 * @fn SendCommand_JPEGDec - Sends command from application to component
949 * @param hComponent - handle for this instance of the component
950 * @param Cmd - Command to be sent
951 * @param nParam - Command parameters
952 * @param pCmdData - Additional Command data
953 * @return: OMX_ERRORTYPE
954 * OMX_ErrorNone on success
955 * !OMX_ErrorNone on any failure
956 */
957 /* ========================================================================== */
SendCommand_JPEGDec(OMX_HANDLETYPE hComponent,OMX_COMMANDTYPE Cmd,OMX_U32 nParam,OMX_PTR pCmdData)958 static OMX_ERRORTYPE SendCommand_JPEGDec(OMX_HANDLETYPE hComponent,
959 OMX_COMMANDTYPE Cmd,
960 OMX_U32 nParam,
961 OMX_PTR pCmdData)
962 {
963 OMX_ERRORTYPE eError = OMX_ErrorNone;
964 OMX_COMPONENTTYPE *pHandle = NULL;
965 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
966 OMX_PARAM_PORTDEFINITIONTYPE *pPortDefIn= NULL;
967 OMX_PARAM_PORTDEFINITIONTYPE *pPortDefOut = NULL;
968 OMX_MARKTYPE* pMarkType = NULL;
969 OMX_COMMANDTYPE eCmd = OMX_CustomCommandStopThread;
970 int nRet = 0;
971
972 OMX_CHECK_PARAM(hComponent);
973 pHandle = (OMX_COMPONENTTYPE *)hComponent;
974 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
975 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
976
977 pPortDefIn = pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef;
978 pPortDefOut = pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef;
979
980 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion SendCommand_JPEGDec %u %lu\n", Cmd, nParam);
981
982 if (pComponentPrivate->nCurState == OMX_StateInvalid) {
983 OMX_PRSTATE4(pComponentPrivate->dbg, "INVALID STATE\n");
984 eError = OMX_ErrorInvalidState;
985 goto EXIT;
986 }
987 switch (Cmd) {
988
989 case OMX_CommandStateSet:
990 eCmd = OMX_CommandStateSet;
991 pComponentPrivate->nToState = nParam;
992 OMX_PRSTATE2(pComponentPrivate->dbg, "To state %d\n", pComponentPrivate->nToState);
993 break;
994
995 case OMX_CommandFlush:
996 if ((nParam != JPEGDEC_INPUT_PORT) &&
997 (nParam != JPEGDEC_OUTPUT_PORT) &&
998 ((int)nParam != -1)) {
999 eError = OMX_ErrorBadPortIndex;
1000 goto EXIT;
1001 }
1002 eCmd = OMX_CommandFlush;
1003 OMX_PRBUFFER2(pComponentPrivate->dbg, "get OMX_CommandFlush\n");
1004 break;
1005
1006 case OMX_CommandPortDisable:
1007 OMX_PRBUFFER2(pComponentPrivate->dbg, "Get port disable command %lu\n", nParam);
1008 if (nParam == JPEGDEC_INPUT_PORT || (int)nParam == -1) {
1009 pPortDefIn->bEnabled = OMX_FALSE;
1010 pComponentPrivate->bInportDisableComplete = OMX_FALSE;
1011 OMX_PRBUFFER2(pComponentPrivate->dbg, "pPortDefIn->bEnabled %d\n", pPortDefIn->bEnabled);
1012 }
1013 if (nParam == JPEGDEC_OUTPUT_PORT || (int)nParam == -1) {
1014 pPortDefOut->bEnabled = OMX_FALSE;
1015 pComponentPrivate->bOutportDisableComplete = OMX_FALSE;
1016 OMX_PRBUFFER2(pComponentPrivate->dbg, "pPortDefIn->bEnabled %d\n", pPortDefIn->bEnabled);
1017 }
1018 if ((nParam != JPEGDEC_INPUT_PORT) && (nParam != JPEGDEC_OUTPUT_PORT) && ((int)nParam != -1)) {
1019 eError = OMX_ErrorBadParameter;
1020 OMX_PRBUFFER4(pComponentPrivate->dbg, "OMX_ErrorBadParameter\n");
1021 goto EXIT;
1022 }
1023
1024 if (!pPortDefIn->bPopulated) {
1025 pComponentPrivate->bInportDisableComplete = OMX_TRUE;
1026 OMX_PRBUFFER2(pComponentPrivate->dbg, "JPEGDEC_INPUT_PORT: OMX_CommandPortDisable\n");
1027 pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle,
1028 pComponentPrivate->pHandle->pApplicationPrivate,
1029 OMX_EventCmdComplete,
1030 OMX_CommandPortDisable,
1031 JPEGDEC_INPUT_PORT,
1032 NULL);
1033 }
1034
1035 if (!pPortDefOut->bPopulated) {
1036 pComponentPrivate->bOutportDisableComplete = OMX_TRUE;
1037 OMX_PRBUFFER1(pComponentPrivate->dbg, "JPEGDEC_OUTPUT_PORT : OMX_CommandPortDisable\n");
1038 pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle,
1039 pComponentPrivate->pHandle->pApplicationPrivate,
1040 OMX_EventCmdComplete,
1041 OMX_CommandPortDisable,
1042 JPEGDEC_OUTPUT_PORT,
1043 NULL);
1044 }
1045 eCmd = OMX_CommandPortDisable;
1046 break;
1047
1048 case OMX_CommandPortEnable:
1049 if (nParam == JPEGDEC_INPUT_PORT || (int)nParam == -1) {
1050 pPortDefIn->bEnabled = OMX_TRUE;
1051 }
1052 if (nParam == JPEGDEC_OUTPUT_PORT || (int)nParam == -1) {
1053 pPortDefOut->bEnabled = OMX_TRUE;
1054 }
1055 if ((nParam != JPEGDEC_INPUT_PORT) && (nParam != JPEGDEC_OUTPUT_PORT) && ((int)nParam != -1)) {
1056 eError = OMX_ErrorBadParameter;
1057 goto EXIT;
1058 }
1059 eCmd = OMX_CommandPortEnable;
1060 break;
1061
1062 case OMX_CommandMarkBuffer:
1063 OMX_PRBUFFER2(pComponentPrivate->dbg, "JPEGDEC: Entered switch - Command Mark Buffer\n");
1064 eCmd = OMX_CommandMarkBuffer;
1065 /* we can only mark buffers on input port */
1066 if ( nParam != JPEGDEC_INPUT_PORT && nParam != JPEGDEC_OUTPUT_PORT){
1067 eError = OMX_ErrorBadPortIndex;
1068 goto EXIT;
1069 }
1070 pMarkType =(OMX_MARKTYPE*)pCmdData;
1071 pComponentPrivate->pMarkData = pMarkType->pMarkData;
1072 pComponentPrivate->hMarkTargetComponent = pMarkType->hMarkTargetComponent;
1073 pComponentPrivate->nMarkPort = nParam;
1074 break;
1075
1076 default:
1077 break;
1078 }
1079
1080 OMX_PRINT1(pComponentPrivate->dbg, "JPEGDEC: eCmd = %d\n",(int)eCmd);
1081
1082 #ifdef __PERF_INSTRUMENTATION__
1083 PERF_SendingCommand(pComponentPrivate->pPERF,
1084 eCmd, (eCmd == OMX_CommandMarkBuffer) ? (OMX_U32) pCmdData : nParam,
1085 PERF_ModuleComponent);
1086 #endif
1087
1088 nRet = write(pComponentPrivate->nCmdPipe[1], &eCmd, sizeof(eCmd));
1089 if (nRet == -1) {
1090 OMX_PRCOMM4(pComponentPrivate->dbg, "Failed to write into nCmdPipe\n");
1091 }
1092
1093 /* this needs to be fixed */
1094 /* port index is redundant for mark buffer as we have 1 input port */
1095 if (eCmd == OMX_CommandMarkBuffer) {
1096 nRet = write(pComponentPrivate->nCmdDataPipe[1], &pCmdData, sizeof(OMX_PTR));
1097 if (nRet == -1) {
1098 OMX_PRCOMM4(pComponentPrivate->dbg, "Failed to write into nCmdDataPipe, eCmd = MarkBuf\n");
1099 }
1100 }
1101 else {
1102 nRet = write(pComponentPrivate->nCmdDataPipe[1], &nParam, sizeof(nParam));
1103 OMX_PRCOMM2(pComponentPrivate->dbg, "write param %lu to pipe\n", nParam);
1104 if (nRet == -1) {
1105 OMX_PRCOMM4(pComponentPrivate->dbg, "Failed to write into nCmdDataPipe\n");
1106 }
1107 }
1108
1109 EXIT:
1110 return eError;
1111 } /* End of SendCommand_JPEGDec*/
1112
1113
1114
1115 /* ========================================================================== */
1116 /**
1117 * @fn GetParameter_JPEGDec - Gets Parameters from the Component.
1118 * This method will update parameters from the component to the app.
1119 * @param hComponent - handle for this instance of the component
1120 * @param nParamIndex - Component Index Port
1121 * @param ComponentParameterStructure - Component Parameter Structure
1122 * @return: OMX_ERRORTYPE
1123 * OMX_ErrorNone on success
1124 * !OMX_ErrorNone on any failure
1125 */
1126 /* ========================================================================== */
GetParameter_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,OMX_IN OMX_INDEXTYPE nParamIndex,OMX_INOUT OMX_PTR ComponentParameterStructure)1127 static OMX_ERRORTYPE GetParameter_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,
1128 OMX_IN OMX_INDEXTYPE nParamIndex,
1129 OMX_INOUT OMX_PTR ComponentParameterStructure)
1130 {
1131 OMX_ERRORTYPE eError = OMX_ErrorNone;
1132 OMX_COMPONENTTYPE *pComp = NULL;
1133 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
1134
1135 OMX_CHECK_PARAM(hComponent);
1136 OMX_CHECK_PARAM(ComponentParameterStructure);
1137 pComp = (OMX_COMPONENTTYPE *)hComponent;
1138 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE*)pComp->pComponentPrivate;
1139
1140 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
1141
1142 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion GetParameter_JPEGDec\n");
1143
1144 if (pComponentPrivate->nCurState == OMX_StateInvalid) {
1145 eError = OMX_ErrorIncorrectStateOperation;
1146 goto PRINT_EXIT;
1147 }
1148
1149 switch (nParamIndex) {
1150 #ifdef KHRONOS_1_1
1151 case OMX_IndexParamAudioInit:
1152 memcpy(ComponentParameterStructure, pComponentPrivate->pAudioPortType, sizeof(OMX_PORT_PARAM_TYPE));
1153 OMX_MEMCPY_CHECK(ComponentParameterStructure);
1154
1155 break;
1156
1157 case OMX_IndexParamVideoInit:
1158 memcpy(ComponentParameterStructure, pComponentPrivate->pVideoPortType, sizeof(OMX_PORT_PARAM_TYPE));
1159 OMX_MEMCPY_CHECK(ComponentParameterStructure);
1160
1161 break;
1162
1163 case OMX_IndexParamOtherInit:
1164 memcpy(ComponentParameterStructure, pComponentPrivate->pOtherPortType, sizeof(OMX_PORT_PARAM_TYPE));
1165 OMX_MEMCPY_CHECK(ComponentParameterStructure);
1166
1167 break;
1168 #endif
1169 case OMX_IndexParamImageInit:
1170 memcpy(ComponentParameterStructure, pComponentPrivate->pPortParamType, sizeof(OMX_PORT_PARAM_TYPE));
1171 OMX_MEMCPY_CHECK(ComponentParameterStructure);
1172 break;
1173
1174 case OMX_IndexParamPortDefinition:
1175 OMX_PRINT1(pComponentPrivate->dbg, "get param %lu\n", ((OMX_PARAM_PORTDEFINITIONTYPE *)(ComponentParameterStructure))->nPortIndex);
1176 OMX_PRINT1(pComponentPrivate->dbg, " port 0 enable: %d\n", pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->bEnabled);
1177 OMX_PRINT1(pComponentPrivate->dbg, " port 1 enable: %d\n", pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->bEnabled);
1178 if (((OMX_PARAM_PORTDEFINITIONTYPE *)(ComponentParameterStructure))->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nPortIndex) {
1179 memcpy(ComponentParameterStructure, pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
1180 }
1181 else if (((OMX_PARAM_PORTDEFINITIONTYPE *)(ComponentParameterStructure))->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nPortIndex) {
1182 memcpy(ComponentParameterStructure, pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
1183 }
1184 else {
1185 eError = OMX_ErrorBadPortIndex;
1186 }
1187 break;
1188
1189 case OMX_IndexParamImagePortFormat:
1190 if (((OMX_IMAGE_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nPortIndex) {
1191 if (((OMX_IMAGE_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nIndex > pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nIndex) {
1192 eError = OMX_ErrorNoMore;
1193 }
1194 else {
1195 memcpy(ComponentParameterStructure, pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE));
1196 }
1197 }
1198 else if (((OMX_IMAGE_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nPortIndex) {
1199 if (((OMX_IMAGE_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nIndex > pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nIndex) {
1200 eError = OMX_ErrorNoMore;
1201 }
1202 else {
1203 memcpy(ComponentParameterStructure, pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE));
1204
1205 }
1206 }
1207 else {
1208 eError = OMX_ErrorBadPortIndex;
1209 }
1210 break;
1211
1212 case OMX_IndexParamPriorityMgmt:
1213 memcpy(ComponentParameterStructure, pComponentPrivate->pPriorityMgmt, sizeof(OMX_PRIORITYMGMTTYPE));
1214 break;
1215
1216 case OMX_IndexParamCompBufferSupplier:
1217 {
1218 OMX_PARAM_BUFFERSUPPLIERTYPE *pBuffSupplierParam = (OMX_PARAM_BUFFERSUPPLIERTYPE *)ComponentParameterStructure;
1219 if (pBuffSupplierParam->nPortIndex == 1) {
1220 pBuffSupplierParam->eBufferSupplier = pComponentPrivate->pCompPort[pBuffSupplierParam->nPortIndex]->pParamBufSupplier->eBufferSupplier;
1221 }
1222 else if (pBuffSupplierParam->nPortIndex == 0) {
1223 pBuffSupplierParam->eBufferSupplier = pComponentPrivate->pCompPort[pBuffSupplierParam->nPortIndex]->pParamBufSupplier->eBufferSupplier;
1224 }
1225 else {
1226 eError = OMX_ErrorBadPortIndex;
1227 }
1228 break;
1229 }
1230
1231 #ifdef KHRONOS_1_1
1232
1233 case OMX_IndexParamQuantizationTable:
1234 {
1235 memcpy(ComponentParameterStructure, pComponentPrivate->pQuantTable, sizeof(OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE));
1236 OMX_MEMCPY_CHECK(ComponentParameterStructure);
1237 }
1238 break;
1239
1240 case OMX_IndexParamHuffmanTable:
1241 {
1242 memcpy(ComponentParameterStructure, pComponentPrivate->pHuffmanTable, sizeof(OMX_IMAGE_PARAM_HUFFMANTTABLETYPE));
1243 OMX_MEMCPY_CHECK(ComponentParameterStructure);
1244 }
1245 break;
1246
1247 #endif
1248 case OMX_IndexCustomSectionDecode:
1249 {
1250 memcpy(ComponentParameterStructure, pComponentPrivate->pSectionDecode, sizeof(OMX_CUSTOM_IMAGE_DECODE_SECTION));
1251 OMX_MEMCPY_CHECK(ComponentParameterStructure);
1252 }
1253 break;
1254
1255 case OMX_IndexCustomSubRegionDecode:
1256 {
1257 memcpy(ComponentParameterStructure, pComponentPrivate->pSubRegionDecode, sizeof(OMX_CUSTOM_IMAGE_DECODE_SUBREGION));
1258 OMX_MEMCPY_CHECK(ComponentParameterStructure);
1259 }
1260 break;
1261
1262 case OMX_IndexCustomSetMaxResolution:
1263 {
1264 memcpy(ComponentParameterStructure, &(pComponentPrivate->sMaxResolution), sizeof(OMX_CUSTOM_RESOLUTION));
1265 OMX_MEMCPY_CHECK(ComponentParameterStructure);
1266 }
1267 break;
1268
1269 default:
1270 eError = OMX_ErrorUnsupportedIndex;
1271 break;
1272 }
1273
1274 PRINT_EXIT:
1275 OMX_PRINT1(pComponentPrivate->dbg, "EXIT\n");
1276 EXIT:
1277 return eError;
1278 } /* End of GetParameter_JPEGDec */
1279
1280
1281
1282 /* ========================================================================== */
1283 /**
1284 * @fn SetParameter_JPEGDec - Sets the parameters sent by the Application and
1285 * sets it to the component
1286 * @param hComponent - handle for this instance of the component
1287 * @param nParamIndex - Component Index Port
1288 * @param ComponentParameterStructure - Component Parameter Structure to set
1289 * @return: OMX_ERRORTYPE
1290 * OMX_ErrorNone on success
1291 * !OMX_ErrorNone on any failure
1292 */
1293 /* ========================================================================== */
SetParameter_JPEGDec(OMX_HANDLETYPE hComponent,OMX_INDEXTYPE nParamIndex,OMX_PTR pCompParam)1294 static OMX_ERRORTYPE SetParameter_JPEGDec(OMX_HANDLETYPE hComponent,
1295 OMX_INDEXTYPE nParamIndex,
1296 OMX_PTR pCompParam)
1297 {
1298 OMX_COMPONENTTYPE* pHandle = NULL;
1299 OMX_ERRORTYPE eError = OMX_ErrorNone;
1300 JPEGDEC_COMPONENT_PRIVATE * pComponentPrivate = NULL;
1301
1302 OMX_CHECK_PARAM(hComponent);
1303 OMX_CHECK_PARAM(pCompParam);
1304
1305 pHandle = (OMX_COMPONENTTYPE*)hComponent;
1306 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate;
1307
1308 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
1309
1310 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion SetParameter_JPEGDec\n");
1311
1312 if (pComponentPrivate->nCurState != OMX_StateLoaded) {
1313 eError = OMX_ErrorIncorrectStateOperation;
1314 goto EXIT;
1315 }
1316
1317 switch (nParamIndex) {
1318 #ifdef KHRONOS_1_1
1319 case OMX_IndexParamAudioPortFormat:
1320 {
1321 OMX_AUDIO_PARAM_PORTFORMATTYPE* pComponentParam = (OMX_AUDIO_PARAM_PORTFORMATTYPE *)pCompParam;
1322 if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nPortIndex ) {
1323 memcpy(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE));
1324 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat);
1325 }
1326 else if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nPortIndex ) {
1327 memcpy(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE));
1328 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat);
1329 }
1330 else {
1331 eError = OMX_ErrorBadPortIndex;
1332 }
1333
1334 break;
1335 }
1336
1337 case OMX_IndexParamVideoPortFormat:
1338 {
1339 OMX_VIDEO_PARAM_PORTFORMATTYPE* pComponentParam = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pCompParam;
1340 if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nPortIndex ) {
1341 memcpy(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
1342 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat);
1343 }
1344 else if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nPortIndex ) {
1345 memcpy(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
1346 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat);
1347 }
1348 else {
1349 eError = OMX_ErrorBadPortIndex;
1350 }
1351
1352 break;
1353 }
1354
1355 case OMX_IndexParamOtherPortFormat:
1356 {
1357 OMX_OTHER_PARAM_PORTFORMATTYPE* pComponentParam = (OMX_OTHER_PARAM_PORTFORMATTYPE *)pCompParam;
1358 if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nPortIndex ) {
1359 memcpy(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_OTHER_PARAM_PORTFORMATTYPE));
1360 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat);
1361 }
1362 else if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nPortIndex ) {
1363 memcpy(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_OTHER_PARAM_PORTFORMATTYPE));
1364 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat);
1365 }
1366 else {
1367 eError = OMX_ErrorBadPortIndex;
1368 }
1369
1370 break;
1371 }
1372 #endif
1373 case OMX_IndexParamImagePortFormat:
1374 {
1375 OMX_IMAGE_PARAM_PORTFORMATTYPE* pComponentParam = (OMX_IMAGE_PARAM_PORTFORMATTYPE *)pCompParam;
1376 if (pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nPortIndex) {
1377 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat);
1378 memcpy(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE));
1379 }
1380 else if (pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nPortIndex) {
1381 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat);
1382 memcpy(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE));
1383 }
1384 else {
1385 eError = OMX_ErrorBadPortIndex;
1386 }
1387 break;
1388 }
1389
1390 case OMX_IndexParamImageInit:
1391 OMX_MEMCPY_CHECK(pComponentPrivate->pPortParamType);
1392 memcpy(pComponentPrivate->pPortParamType, (OMX_PORT_PARAM_TYPE*)pCompParam, sizeof(OMX_PORT_PARAM_TYPE));
1393 break;
1394
1395 case OMX_IndexParamPortDefinition:
1396 {
1397 OMX_PARAM_PORTDEFINITIONTYPE* pComponentParam = (OMX_PARAM_PORTDEFINITIONTYPE *)pCompParam;
1398 if (pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nPortIndex) {
1399 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef);
1400 memcpy(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef, pComponentParam, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
1401 }
1402 else if (pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nPortIndex) {
1403 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef);
1404 memcpy(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef, pComponentParam, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
1405 }
1406 else {
1407 eError = OMX_ErrorBadPortIndex;
1408 }
1409 break;
1410 }
1411
1412 case OMX_IndexParamPriorityMgmt:
1413 OMX_MEMCPY_CHECK(pComponentPrivate->pPriorityMgmt);
1414 memcpy(pComponentPrivate->pPriorityMgmt, (OMX_PRIORITYMGMTTYPE*)pCompParam, sizeof(OMX_PRIORITYMGMTTYPE));
1415 break;
1416
1417 case OMX_IndexParamCompBufferSupplier:
1418 {
1419 OMX_PARAM_BUFFERSUPPLIERTYPE *pBuffSupplierParam = (OMX_PARAM_BUFFERSUPPLIERTYPE *)pCompParam;
1420
1421 if (pBuffSupplierParam->nPortIndex == 1) {
1422 /* Copy parameters to input port buffer supplier type */
1423 pComponentPrivate->pCompPort[pBuffSupplierParam->nPortIndex]->pParamBufSupplier->eBufferSupplier= pBuffSupplierParam->eBufferSupplier;
1424 }
1425 else if (pBuffSupplierParam->nPortIndex == 0) {
1426 pComponentPrivate->pCompPort[pBuffSupplierParam->nPortIndex]->pParamBufSupplier->eBufferSupplier = pBuffSupplierParam->eBufferSupplier;
1427 }
1428 else {
1429 eError = OMX_ErrorBadPortIndex;
1430 break;
1431 }
1432 break;
1433 }
1434 #ifdef KHRONOS_1_1
1435
1436 case OMX_IndexParamQuantizationTable:
1437 {
1438 OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE* pQuantizationTable = (OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE*)pCompParam;
1439 OMX_MEMCPY_CHECK(pQuantizationTable);
1440 OMX_MEMCPY_CHECK(pComponentPrivate->pQuantTable);
1441 memcpy(pComponentPrivate->pQuantTable, pQuantizationTable, sizeof(OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE));
1442 }
1443 break;
1444
1445 case OMX_IndexParamStandardComponentRole:
1446 {
1447 OMX_PARAM_COMPONENTROLETYPE* pRole = (OMX_PARAM_COMPONENTROLETYPE *)pCompParam;
1448 OMX_MEMCPY_CHECK(pRole);
1449 OMX_MEMCPY_CHECK(pComponentPrivate->pCompRole);
1450 memcpy(pComponentPrivate->pCompRole, pRole, sizeof(OMX_PARAM_COMPONENTROLETYPE ));
1451 }
1452 break;
1453
1454
1455 case OMX_IndexParamHuffmanTable:
1456 {
1457 OMX_IMAGE_PARAM_HUFFMANTTABLETYPE* pHuffmanTable = (OMX_IMAGE_PARAM_HUFFMANTTABLETYPE *)pCompParam;
1458 OMX_MEMCPY_CHECK(pHuffmanTable);
1459 OMX_MEMCPY_CHECK(pComponentPrivate->pHuffmanTable);
1460 memcpy(pComponentPrivate->pHuffmanTable, pHuffmanTable, sizeof(OMX_IMAGE_PARAM_HUFFMANTTABLETYPE ));
1461 }
1462 break;
1463
1464 #endif
1465
1466 case OMX_IndexCustomSectionDecode:
1467 {
1468 OMX_CUSTOM_IMAGE_DECODE_SECTION* pSectionDecode = pCompParam;
1469 OMX_MEMCPY_CHECK(pSectionDecode);
1470 OMX_MEMCPY_CHECK(pComponentPrivate->pSectionDecode);
1471 memcpy(pComponentPrivate->pSectionDecode, pSectionDecode, sizeof(OMX_CUSTOM_IMAGE_DECODE_SECTION));
1472 }
1473 break;
1474
1475 case OMX_IndexCustomSubRegionDecode:
1476 {
1477 OMX_CUSTOM_IMAGE_DECODE_SUBREGION* pSubRegionDecode = pCompParam;
1478 OMX_MEMCPY_CHECK(pSubRegionDecode);
1479 OMX_MEMCPY_CHECK(pComponentPrivate->pSubRegionDecode);
1480 memcpy(pComponentPrivate->pSubRegionDecode, pSubRegionDecode, sizeof(OMX_CUSTOM_IMAGE_DECODE_SUBREGION));
1481 }
1482 break;
1483
1484 case OMX_IndexCustomSetMaxResolution:
1485 {
1486 OMX_MEMCPY_CHECK(pCompParam);
1487 memcpy(&(pComponentPrivate->sMaxResolution), pCompParam, sizeof(OMX_CUSTOM_RESOLUTION));
1488 }
1489 break;
1490
1491
1492 default:
1493 eError = OMX_ErrorUnsupportedIndex;
1494 break;
1495 }
1496
1497 EXIT:
1498 return eError;
1499 } /* End of SetParameter_JPEGDec */
1500
1501
1502
1503 /* ========================================================================== */
1504 /**
1505 * @fn GetConfig_JPEGDec - Gets Configuration data from the Component
1506 * @param hComp - handle for this instance of the component
1507 * @param nConfigIndex - Component Config Index Port
1508 * @param ComponentConfigStructure - Component Config Structure
1509 * @return: OMX_ERRORTYPE
1510 * OMX_ErrorNone on success
1511 * !OMX_ErrorNone on any failure
1512 */
1513 /* ========================================================================== */
GetConfig_JPEGDec(OMX_HANDLETYPE hComp,OMX_INDEXTYPE nConfigIndex,OMX_PTR ComponentConfigStructure)1514 static OMX_ERRORTYPE GetConfig_JPEGDec(OMX_HANDLETYPE hComp,
1515 OMX_INDEXTYPE nConfigIndex,
1516 OMX_PTR ComponentConfigStructure)
1517 {
1518 OMX_ERRORTYPE eError = OMX_ErrorNone;
1519 OMX_COMPONENTTYPE* pHandle = NULL;
1520 JPEGDEC_COMPONENT_PRIVATE * pComponentPrivate = NULL;
1521
1522 OMX_CHECK_PARAM(hComp);
1523 OMX_CHECK_PARAM(ComponentConfigStructure);
1524 pHandle = (OMX_COMPONENTTYPE*)hComp;
1525 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate;
1526
1527 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
1528
1529 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion GetConfig_JPEGDec\n");
1530
1531 switch (nConfigIndex) {
1532
1533 case OMX_IndexConfigCommonScale:
1534 {
1535 int scale=0;
1536 OMX_CONFIG_SCALEFACTORTYPE* pScaleFactor = (OMX_CONFIG_SCALEFACTORTYPE *)ComponentConfigStructure;
1537 memcpy(pScaleFactor, pComponentPrivate->pScalePrivate, sizeof(OMX_CONFIG_SCALEFACTORTYPE));
1538
1539 scale =(int)pScaleFactor->xWidth;
1540
1541 switch (scale)
1542 {
1543 case (0):
1544 pScaleFactor->xWidth = 100;
1545 break;
1546
1547 case (1):
1548 pScaleFactor->xWidth = 50;
1549 break;
1550
1551 case (2):
1552 pScaleFactor->xWidth = 25;
1553 break;
1554
1555 case (3):
1556 pScaleFactor->xWidth = 12;
1557 break;
1558
1559 case (4):
1560 pScaleFactor->xWidth = 200;
1561 break;
1562
1563 case (5):
1564 pScaleFactor->xWidth = 400;
1565 break;
1566
1567 case (6):
1568 pScaleFactor->xWidth = 800;
1569 break;
1570
1571 default:
1572 pScaleFactor->xWidth = 100;
1573 break;
1574 }
1575 break;
1576 }
1577
1578 case OMX_IndexCustomProgressiveFactor:
1579 {
1580 int *pnProgressiveFlag = (int*)ComponentConfigStructure;
1581 pnProgressiveFlag = (int*)pComponentPrivate->nProgressive;
1582 break;
1583 }
1584
1585 case OMX_IndexCustomDebug:
1586 {
1587 OMX_DBG_GETCONFIG(pComponentPrivate->dbg, ComponentConfigStructure);
1588 break;
1589 }
1590
1591 default:
1592 eError = OMX_ErrorUnsupportedIndex;
1593 break;
1594 }
1595
1596 EXIT:
1597 return eError;
1598 } /* End of GetConfig_JPEGDec */
1599
1600
1601
1602 /* ========================================================================== */
1603 /**
1604 * @fn SetConfig_JPEGDec - Sends command to set new configuration
1605 * @param hComp - handle for this instance of the component
1606 * @param nConfigIndex - Component Config Index Port
1607 * @param ComponentConfigStructure - Component Config Structure
1608 * @return: OMX_ERRORTYPE
1609 * OMX_ErrorNone on success
1610 * !OMX_ErrorNone on any failure
1611 */
1612 /* ========================================================================== */
SetConfig_JPEGDec(OMX_HANDLETYPE hComp,OMX_INDEXTYPE nConfigIndex,OMX_PTR ComponentConfigStructure)1613 static OMX_ERRORTYPE SetConfig_JPEGDec(OMX_HANDLETYPE hComp,
1614 OMX_INDEXTYPE nConfigIndex,
1615 OMX_PTR ComponentConfigStructure)
1616 {
1617 OMX_ERRORTYPE eError = OMX_ErrorNone;
1618 OMX_COMPONENTTYPE* pHandle = NULL;
1619 JPEGDEC_COMPONENT_PRIVATE * pComponentPrivate = NULL;
1620
1621 OMX_CHECK_PARAM(hComp);
1622 OMX_CHECK_PARAM(ComponentConfigStructure);
1623 pHandle = (OMX_COMPONENTTYPE*)hComp;
1624 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate;
1625
1626 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
1627
1628 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion SetConfig_JPEGDec\n");
1629
1630 switch (nConfigIndex) {
1631
1632 case OMX_IndexConfigCommonScale:
1633 {
1634 int scale=0;
1635 OMX_CONFIG_SCALEFACTORTYPE* pScaleFactor = (OMX_CONFIG_SCALEFACTORTYPE *)ComponentConfigStructure;
1636 scale =(int)pScaleFactor->xWidth;
1637
1638 switch (scale)
1639 {
1640 case (800):
1641 pScaleFactor->xWidth = 6;
1642 break;
1643
1644 case (400):
1645 pScaleFactor->xWidth = 5;
1646 break;
1647
1648 case (200):
1649 pScaleFactor->xWidth = 4;
1650 break;
1651
1652 case (100):
1653 pScaleFactor->xWidth = 0;
1654 break;
1655
1656 case (50):
1657 pScaleFactor->xWidth = 1;
1658 break;
1659
1660 case (25):
1661 pScaleFactor->xWidth = 2;
1662 break;
1663
1664 case (12):
1665 pScaleFactor->xWidth = 3;
1666 break;
1667
1668 default:
1669 pScaleFactor->xWidth = 0;
1670 break;
1671 }
1672
1673 OMX_MEMCPY_CHECK(pComponentPrivate->pScalePrivate);
1674 memcpy(pComponentPrivate->pScalePrivate, pScaleFactor, sizeof(OMX_CONFIG_SCALEFACTORTYPE));
1675 break;
1676 }
1677
1678 case OMX_IndexCustomProgressiveFactor:
1679 {
1680 int *pnProgressive = (int*)ComponentConfigStructure;
1681 pComponentPrivate->nProgressive = (int)*pnProgressive;
1682 break;
1683 }
1684
1685 case OMX_IndexCustomInputFrameWidth:
1686 {
1687 int *pnInputFrameWidth = (int*)ComponentConfigStructure;
1688 pComponentPrivate->nInputFrameWidth = (int)*pnInputFrameWidth;
1689 break;
1690 }
1691
1692 case OMX_IndexCustomOutputColorFormat:
1693 {
1694 int *pnOutputColorFormat = (int*)ComponentConfigStructure;
1695 pComponentPrivate->nOutputColorFormat = (int)*pnOutputColorFormat;
1696 break;
1697 }
1698
1699 case OMX_IndexCustomDebug:
1700 {
1701 OMX_DBG_SETCONFIG(pComponentPrivate->dbg, ComponentConfigStructure);
1702 break;
1703 }
1704 default:
1705 eError = OMX_ErrorUnsupportedIndex;
1706 break;
1707 }
1708 EXIT:
1709 return eError;
1710 } /* End of SetConfig_JPEGDec */
1711
1712
1713
1714 /* ========================================================================== */
1715 /**
1716 * @fn GetState - Gets OMX Component State
1717 * @param hComp - handle for this instance of the component
1718 * @param pState - pointer to store State
1719 * @return: OMX_ERRORTYPE
1720 * OMX_ErrorNone on success
1721 * !OMX_ErrorNone on any failure
1722 */
1723 /* ========================================================================== */
GetState(OMX_HANDLETYPE pComponent,OMX_STATETYPE * pState)1724 static OMX_ERRORTYPE GetState(OMX_HANDLETYPE pComponent,
1725 OMX_STATETYPE* pState)
1726 {
1727 OMX_ERRORTYPE eError = 80001012;
1728 OMX_COMPONENTTYPE *pHandle = NULL;
1729 OMX_CHECK_PARAM(pComponent);
1730 pHandle = (OMX_COMPONENTTYPE *)pComponent;
1731 JPEGDEC_COMPONENT_PRIVATE * pComponentPrivate = NULL;
1732 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate;
1733
1734 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
1735
1736 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion GetState\n");
1737
1738 if (!pState) {
1739 eError = OMX_ErrorBadParameter;
1740 goto EXIT;
1741 }
1742 if (pHandle && pHandle->pComponentPrivate) {
1743 *pState = ((JPEGDEC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate)->nCurState;
1744 }
1745 else {
1746 *pState = OMX_StateLoaded;
1747 }
1748
1749 eError = OMX_ErrorNone;
1750
1751 EXIT:
1752 return eError;
1753 } /* End of GetState */
1754
1755
1756 /* ========================================================================== */
1757 /**
1758 * @fn EmptyThisBuffer - Send Input Buffers. * The application uses this to
1759 * send the input buffers filled with data to the input port of the component.
1760 * @param hComponent - handle for this instance of the component
1761 * @param pBuffHead - Pointer to data filled
1762 * @return: OMX_ERRORTYPE
1763 * OMX_ErrorNone on success
1764 * !OMX_ErrorNone on any failure
1765 */
1766 /* ========================================================================== */
EmptyThisBuffer(OMX_HANDLETYPE hComponent,OMX_BUFFERHEADERTYPE * pBuffHead)1767 static OMX_ERRORTYPE EmptyThisBuffer(OMX_HANDLETYPE hComponent,
1768 OMX_BUFFERHEADERTYPE* pBuffHead)
1769 {
1770 OMX_ERRORTYPE eError = OMX_ErrorNone;
1771 OMX_COMPONENTTYPE *pHandle = NULL;
1772 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
1773 JPEGDEC_BUFFER_PRIVATE* pBuffPrivate;
1774 int nRet;
1775 int i;
1776
1777 OMX_CHECK_PARAM(hComponent);
1778 pHandle = (OMX_COMPONENTTYPE *)hComponent;
1779 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
1780
1781 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
1782
1783 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion EmptyThisBuffer %p\n", pBuffHead);
1784
1785 if ( pComponentPrivate->nCurState != OMX_StateExecuting &&
1786 pComponentPrivate->nCurState != OMX_StatePause &&
1787 pComponentPrivate->nCurState != OMX_StateIdle) {
1788 eError= OMX_ErrorIncorrectStateOperation;
1789 goto EXIT;
1790 }
1791
1792 if (pBuffHead == NULL) {
1793 eError = OMX_ErrorBadParameter;
1794 goto EXIT;
1795 }
1796
1797 if (pBuffHead->nSize != sizeof(OMX_BUFFERHEADERTYPE)) {
1798 eError = OMX_ErrorBadParameter;
1799 goto EXIT;
1800 }
1801 if (!pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->bEnabled) {
1802 eError = OMX_ErrorIncorrectStateOperation;
1803 goto EXIT;
1804 }
1805
1806 pBuffPrivate = pBuffHead->pInputPortPrivate;
1807
1808 OMX_PRBUFFER1(pComponentPrivate->dbg, "pBuffHead->nAllocLen = %d\n",(int)pBuffHead->nAllocLen);
1809 OMX_PRBUFFER1(pComponentPrivate->dbg, "pBuffHead->nFilledLen = %d\n",(int)pBuffHead->nFilledLen);
1810 OMX_PRBUFFER1(pComponentPrivate->dbg, "pBuffHead->nFlags = %d\n",(int)pBuffHead->nFlags);
1811
1812 if ((pBuffHead->nVersion.s.nVersionMajor != 0x1) ||
1813 (pBuffHead->nVersion.s.nVersionMinor != 0x0) ||
1814 (pBuffHead->nVersion.s.nRevision != 0x0) ||
1815 (pBuffHead->nVersion.s.nStep != 0x0)) {
1816
1817 eError= OMX_ErrorVersionMismatch;
1818 goto EXIT;
1819 }
1820
1821 if (pBuffHead->nInputPortIndex != 0x0) {
1822 eError= OMX_ErrorBadPortIndex;
1823 goto EXIT;
1824 }
1825 pComponentPrivate->nInPortIn ++;
1826
1827 if (pBuffHead->nFlags & OMX_BUFFERFLAG_EOS) {
1828 for (i = 0; i < (int)pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nBufferCountActual; i ++) {
1829 if (pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->sBufferFlagTrack[i].buffer_id == 0xFFFFFFFF)
1830 {
1831 OMX_PRBUFFER1(pComponentPrivate->dbg, "record buffer id in array %d\n", i);
1832 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->sBufferFlagTrack[i].flag = pBuffHead->nFlags;
1833 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->sBufferFlagTrack[i].buffer_id = pComponentPrivate->nInPortIn;
1834 break;
1835 }
1836 }
1837 }
1838
1839 /* mark the first buffer from input port after receiving mark buffer command */
1840 if (pComponentPrivate->nMarkPort == JPEGDEC_INPUT_PORT) {
1841 if (pComponentPrivate->pMarkData) {
1842 OMX_PRBUFFER2(pComponentPrivate->dbg, "get mark buffer command, mark buffer %p\n", pBuffHead);
1843 pBuffHead->pMarkData = pComponentPrivate->pMarkData;
1844 pBuffHead->hMarkTargetComponent = pComponentPrivate->hMarkTargetComponent;
1845 pComponentPrivate->pMarkData = NULL;
1846 pComponentPrivate->hMarkTargetComponent = NULL;
1847 }
1848 }
1849
1850 /* if a buffer from input port is marked, record this port # in the buffer queue */
1851 if (pBuffHead->pMarkData) {
1852 for (i = 0; i < (int)pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nBufferCountActual; i ++) {
1853 if (pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->sBufferMarkTrack[i].buffer_id == 0xFFFFFFFF)
1854 {
1855 JPEGDEC_BUFFERMARK_TRACK *pMarkTrack;
1856 pMarkTrack = &(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->sBufferMarkTrack[i]);
1857 pMarkTrack->buffer_id = pComponentPrivate->nInPortIn;
1858 pMarkTrack->pMarkData = pBuffHead->pMarkData;
1859 pMarkTrack->hMarkTargetComponent = pBuffHead->hMarkTargetComponent;
1860 OMX_PRBUFFER2(pComponentPrivate->dbg, "mark buffer at ID %lu\n", pComponentPrivate->nInPortIn);
1861 break;
1862 }
1863 }
1864 }
1865
1866
1867 pBuffPrivate->bReadFromPipe = OMX_FALSE;
1868 #ifdef __PERF_INSTRUMENTATION__
1869 PERF_ReceivedFrame(pComponentPrivate->pPERF,
1870 pBuffHead->pBuffer,
1871 pBuffHead->nFilledLen,
1872 PERF_ModuleHLMM);
1873 #endif
1874
1875
1876 pBuffPrivate->eBufferOwner = JPEGDEC_BUFFER_COMPONENT_IN;
1877
1878 nRet = write (pComponentPrivate->nFilled_inpBuf_Q[1], &(pBuffHead), sizeof(pBuffHead));
1879 if (nRet == -1) {
1880 OMX_PRCOMM4(pComponentPrivate->dbg, "Error while writing to the nFilled_inpBuf_Q pipe\n");
1881 }
1882
1883 EXIT:
1884 return eError;
1885 } /* End of EmptyThisBuffer */
1886
1887
1888
1889 /* ========================================================================== */
1890 /**
1891 * @fn FillThisBuffer_JPEGDec - Send Output Buffers. The application uses this
1892 * to send the empty output buffers to the output port of the component.
1893 * @param hComponent - handle for this instance of the component
1894 * @param pBuffHead - Pointer to buffer header
1895 * @return: OMX_ERRORTYPE
1896 * OMX_ErrorNone on success
1897 * !OMX_ErrorNone on any failure
1898 */
1899 /* ========================================================================== */
FillThisBuffer_JPEGDec(OMX_HANDLETYPE pComponent,OMX_BUFFERHEADERTYPE * pBuffHead)1900 static OMX_ERRORTYPE FillThisBuffer_JPEGDec(OMX_HANDLETYPE pComponent,
1901 OMX_BUFFERHEADERTYPE* pBuffHead)
1902 {
1903 OMX_ERRORTYPE eError = OMX_ErrorNone;
1904 OMX_COMPONENTTYPE *pHandle = NULL;
1905 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
1906 JPEGDEC_BUFFER_PRIVATE* pBuffPrivate = NULL;
1907 int nRet;
1908
1909 if (pBuffHead == NULL) {
1910 eError = OMX_ErrorBadParameter;
1911 goto EXIT;
1912 }
1913
1914 OMX_CHECK_PARAM(pComponent);
1915 pHandle = (OMX_COMPONENTTYPE *)pComponent;
1916 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
1917 pBuffPrivate = pBuffHead->pOutputPortPrivate;
1918
1919 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
1920
1921 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion FillThisBuffer_JPEGDec\n");
1922
1923 if ( pBuffHead->nSize != sizeof(OMX_BUFFERHEADERTYPE) ) {
1924
1925 eError = OMX_ErrorBadParameter;
1926 goto EXIT;
1927 }
1928
1929 if (pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->bEnabled == OMX_FALSE) {
1930 eError = OMX_ErrorIncorrectStateOperation;
1931 OMX_PRSTATE4(pComponentPrivate->dbg, "eError = OMX_ErrorIncorrectStateOperation\n");
1932 goto EXIT;
1933 }
1934
1935
1936
1937 if ((pBuffHead->nVersion.s.nVersionMajor != 0x1) ||
1938 (pBuffHead->nVersion.s.nVersionMinor != 0x0) ||
1939 (pBuffHead->nVersion.s.nRevision != 0x0) ||
1940 (pBuffHead->nVersion.s.nStep != 0x0)) {
1941
1942 eError= OMX_ErrorVersionMismatch;
1943 goto EXIT;
1944 }
1945
1946 OMX_PRBUFFER1(pComponentPrivate->dbg, "pBuffHead->nOutputPortIndex %lu\n", pBuffHead->nOutputPortIndex);
1947
1948 if (pBuffHead->nOutputPortIndex != 0x1) {
1949 eError = OMX_ErrorBadPortIndex;
1950 goto EXIT;
1951 }
1952
1953 pBuffHead->nFilledLen = 0;
1954
1955 if ( pComponentPrivate->nCurState != OMX_StateExecuting &&
1956 pComponentPrivate->nCurState != OMX_StatePause &&
1957 pComponentPrivate->nCurState != OMX_StateIdle) {
1958 eError= OMX_ErrorIncorrectStateOperation;
1959 goto EXIT;
1960
1961 }
1962
1963 #ifdef __PERF_INSTRUMENTATION__
1964 PERF_ReceivedFrame(pComponentPrivate->pPERF,
1965 pBuffHead->pBuffer,
1966 pBuffHead->nFilledLen,
1967 PERF_ModuleHLMM);
1968 #endif
1969
1970 pBuffPrivate->bReadFromPipe = OMX_FALSE;
1971 pBuffPrivate->eBufferOwner = JPEGDEC_BUFFER_COMPONENT_IN;
1972 nRet = write (pComponentPrivate->nFree_outBuf_Q[1], &(pBuffHead), sizeof (pBuffHead));
1973 if (nRet == -1) {
1974 OMX_PRCOMM4(pComponentPrivate->dbg, "Error while writing in nFree_outBuf_Q pipe\n");
1975 }
1976
1977 EXIT:
1978 return eError;
1979 } /* End of FillThisBuffer_JPEGDec */
1980
1981
1982 /* ========================================================================== */
1983 /**
1984 * @fn ComponentDeInit - Deinitialize Component. This method will clean all
1985 * resources in the component
1986 * @param hComponent - handle for this instance of the component
1987 * @return: OMX_ERRORTYPE
1988 * OMX_ErrorNone on success
1989 * !OMX_ErrorNone on any failure
1990 */
1991 /* ========================================================================== */
ComponentDeInit(OMX_HANDLETYPE hComponent)1992 OMX_ERRORTYPE ComponentDeInit(OMX_HANDLETYPE hComponent)
1993 {
1994 OMX_ERRORTYPE eError = OMX_ErrorNone;
1995 OMX_COMPONENTTYPE *pHandle = NULL;
1996 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
1997 struct OMX_TI_Debug dbg;
1998
1999 OMX_DBG_INIT_BASE(dbg);
2000 OMX_CHECK_PARAM(hComponent);
2001 pHandle = (OMX_COMPONENTTYPE *)hComponent;
2002
2003 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
2004 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
2005
2006 dbg = pComponentPrivate->dbg;
2007
2008 OMX_PRINT1(dbg, "Entering funtion ComponentDeInit\n");
2009
2010 #ifdef __PERF_INSTRUMENTATION__
2011 PERF_Boundary(pComponentPrivate->pPERF,
2012 PERF_BoundaryComplete | PERF_BoundaryCleanup);
2013 PERF_Done(pComponentPrivate->pPERF);
2014 #endif
2015
2016 Free_ComponentResourcesJpegDec(pHandle->pComponentPrivate);
2017
2018 #ifdef RESOURCE_MANAGER_ENABLED
2019 eError= RMProxy_NewSendCommand(pHandle, RMProxy_FreeResource, OMX_JPEG_Decoder_COMPONENT, 0, 3456, NULL);
2020 if (eError != OMX_ErrorNone) {
2021 OMX_PRMGR4(dbg, "Cannot Free RMProxy Resources\n");
2022 }
2023 eError = RMProxy_DeinitalizeEx(OMX_COMPONENTTYPE_IMAGE);
2024 if (eError != OMX_ErrorNone) {
2025 OMX_PRMGR4(dbg, "Error returned from destroy ResourceManagerProxy thread\n");
2026 }
2027 #endif
2028
2029 EXIT:
2030 OMX_PRINT1(dbg, "Error from Component DeInit = %d\n",eError);
2031 OMX_DBG_CLOSE(dbg);
2032 return eError;
2033 } /* End of ComponentDeInit */
2034
2035
2036
2037 /* ========================================================================== */
2038 /**
2039 * @fn VerifyTunnelConnection_JPEGDec - This function verifies the tunnel connection
2040 * @param pPort - port info
2041 * @param hTunneledComp - handle of the component to tunnel
2042 * @param pPortDef - pointer to the port definition.
2043 * @return: OMX_ERRORTYPE
2044 * OMX_ErrorNone on success
2045 * !OMX_ErrorNone on any failure
2046 */
2047 /* ========================================================================== */
VerifyTunnelConnection_JPEGDec(JPEGDEC_PORT_TYPE * pPort,OMX_HANDLETYPE hTunneledComp,OMX_PARAM_PORTDEFINITIONTYPE * pPortDef)2048 static OMX_ERRORTYPE VerifyTunnelConnection_JPEGDec(JPEGDEC_PORT_TYPE *pPort,
2049 OMX_HANDLETYPE hTunneledComp,
2050 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef)
2051 {
2052 /* 1.4 Check if input port is compatible with output port */
2053 OMX_PARAM_PORTDEFINITIONTYPE sPortDef;
2054 OMX_ERRORTYPE eError = OMX_ErrorNone;
2055 OMX_COMPONENTTYPE *pHandle = NULL;
2056 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
2057 pHandle = (OMX_COMPONENTTYPE *)hTunneledComp;
2058 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
2059
2060 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
2061 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion VerifyTunnelConnection_JPEGDec\n");
2062
2063 sPortDef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
2064 sPortDef.nVersion.s.nVersionMajor = 0x01;
2065 sPortDef.nVersion.s.nVersionMinor = 0x00;
2066 sPortDef.nPortIndex = pPort->nTunnelPort;
2067
2068 eError = OMX_GetParameter(hTunneledComp, OMX_IndexParamPortDefinition, &sPortDef);
2069
2070 if (eError != OMX_ErrorNone) {
2071 OMX_PRCOMM4(pComponentPrivate->dbg, "Error \n");
2072 return eError;
2073 }
2074
2075 switch (pPortDef->eDomain) {
2076
2077 case OMX_PortDomainOther:
2078 if (sPortDef.format.other.eFormat!= pPortDef->format.other.eFormat) {
2079 pPort->hTunnelComponent = 0;
2080 pPort->nTunnelPort = 0;
2081 return OMX_ErrorPortsNotCompatible;
2082 }
2083 break;
2084
2085 case OMX_PortDomainAudio:
2086 if (sPortDef.format.audio.eEncoding != pPortDef->format.audio.eEncoding) {
2087 pPort->hTunnelComponent = 0;
2088 pPort->nTunnelPort = 0;
2089 return OMX_ErrorPortsNotCompatible;
2090 }
2091 break;
2092
2093 case OMX_PortDomainVideo:
2094 if (sPortDef.format.video.eCompressionFormat != pPortDef->format.video.eCompressionFormat) {
2095 pPort->hTunnelComponent = 0;
2096 pPort->nTunnelPort = 0;
2097 return OMX_ErrorPortsNotCompatible;
2098 }
2099 break;
2100
2101 case OMX_PortDomainImage:
2102 if (sPortDef.format.image.eCompressionFormat != pPortDef->format.image.eCompressionFormat) {
2103 pPort->hTunnelComponent = 0;
2104 pPort->nTunnelPort = 0;
2105 return OMX_ErrorPortsNotCompatible;
2106 }
2107 break;
2108
2109 default:
2110 pPort->hTunnelComponent = 0;
2111 pPort->nTunnelPort = 0;
2112 return OMX_ErrorPortsNotCompatible; /* Our current port is not set up correctly */
2113 }
2114 EXIT:
2115 return eError;
2116 } /* End of VerifyTunnelConnection_JPEGDec */
2117
2118
2119
2120 /* ========================================================================== */
2121 /**
2122 * @fn ComponentTunnelRequest_JPEGDec - Set a tunnel between two OMx components
2123 * @param hComponent - handle for this instance of the component
2124 * @param nPort - Index Port
2125 * @param hTunneledComp - handle for the istance of the tunneled component
2126 * @param nTunneledPort - index port of the tunneled component
2127 * @param pTunnelSetup - Tunnel setup type
2128 * @return: OMX_ERRORTYPE
2129 * OMX_ErrorNone on success
2130 * !OMX_ErrorNone on any failure
2131 */
2132 /* ========================================================================== */
ComponentTunnelRequest_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,OMX_IN OMX_U32 nPort,OMX_IN OMX_HANDLETYPE hTunneledComp,OMX_IN OMX_U32 nTunneledPort,OMX_INOUT OMX_TUNNELSETUPTYPE * pTunnelSetup)2133 static OMX_ERRORTYPE ComponentTunnelRequest_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,
2134 OMX_IN OMX_U32 nPort,
2135 OMX_IN OMX_HANDLETYPE hTunneledComp,
2136 OMX_IN OMX_U32 nTunneledPort,
2137 OMX_INOUT OMX_TUNNELSETUPTYPE* pTunnelSetup)
2138 {
2139 OMX_ERRORTYPE eError = OMX_ErrorNone;
2140 OMX_COMPONENTTYPE *pHandle = NULL;
2141 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
2142 OMX_PARAM_BUFFERSUPPLIERTYPE sBufferSupplier;
2143 JPEGDEC_PORT_TYPE *pPort = NULL;
2144
2145 OMX_CHECK_PARAM(hComponent);
2146 pHandle = (OMX_COMPONENTTYPE *)hComponent;
2147 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
2148
2149 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
2150
2151 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion ComponentTunnelRequest_JPEGDec\n");
2152 OMX_PRINT1(pComponentPrivate->dbg, "nPort = %lu\n",nPort);
2153
2154 pPort = pComponentPrivate->pCompPort[nPort];
2155 if (pTunnelSetup == NULL || hTunneledComp == 0) {
2156 /* cancel previous tunnel */
2157 pPort->hTunnelComponent = 0;
2158 pPort->nTunnelPort = 0;
2159 OMX_PRBUFFER2(pComponentPrivate->dbg, "OMX_BufferSupplyUnspecified\n");
2160 pPort->pParamBufSupplier->eBufferSupplier = OMX_BufferSupplyUnspecified;
2161 }
2162 else {
2163 if (pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->eDir != OMX_DirInput && pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->eDir != OMX_DirOutput) {
2164
2165 OMX_PRBUFFER4(pComponentPrivate->dbg, "OMX_ErrorBadParameter\n");
2166 return OMX_ErrorBadParameter;
2167 }
2168
2169 /* Check if the other component is developed by TI */
2170 if(IsTIOMXComponent(hTunneledComp) != OMX_TRUE)
2171 {
2172 OMX_PRCOMM4(pComponentPrivate->dbg, "OMX_ErrorTunnelingUnsupported\n");
2173 eError = OMX_ErrorTunnelingUnsupported;
2174 goto EXIT;
2175 }
2176
2177 pPort->hTunnelComponent = hTunneledComp;
2178 pPort->nTunnelPort = nTunneledPort;
2179
2180 if (pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef && pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nPortIndex == nPort) {
2181 /* Component is the output (source of data) */
2182 pTunnelSetup->eSupplier = pPort->pParamBufSupplier->eBufferSupplier;
2183 }
2184 else {
2185 /* Component is the input (sink of data) */
2186 eError = VerifyTunnelConnection_JPEGDec(pPort, hTunneledComp, pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef);
2187 if (OMX_ErrorNone != eError) {
2188 OMX_PRCOMM5(pComponentPrivate->dbg, "########### Error !! PP VerifyTunnelConnection_JPEGDec failed\n");
2189 /* Invalid connection formats. Return eError */
2190 return OMX_ErrorPortsNotCompatible;
2191 }
2192 /* If specified obey output port's preferences. Otherwise choose output */
2193 pPort->pParamBufSupplier->eBufferSupplier = pTunnelSetup->eSupplier;
2194 if (OMX_BufferSupplyUnspecified == pPort->pParamBufSupplier->eBufferSupplier) {
2195 pPort->pParamBufSupplier->eBufferSupplier = pTunnelSetup->eSupplier = OMX_BufferSupplyOutput;
2196 }
2197
2198 /* Tell the output port who the supplier is */
2199 sBufferSupplier.nSize = sizeof(sBufferSupplier);
2200 sBufferSupplier.nVersion.s.nVersionMajor = 0x01;
2201 sBufferSupplier.nVersion.s.nVersionMinor = 0x00;
2202 sBufferSupplier.nPortIndex = nTunneledPort;
2203 sBufferSupplier.eBufferSupplier = pPort->pParamBufSupplier->eBufferSupplier;
2204 eError = OMX_SetParameter(hTunneledComp, OMX_IndexParamCompBufferSupplier, &sBufferSupplier);
2205 eError = OMX_GetParameter(hTunneledComp, OMX_IndexParamCompBufferSupplier, &sBufferSupplier);
2206
2207 if (sBufferSupplier.eBufferSupplier != pPort->pParamBufSupplier->eBufferSupplier) {
2208
2209 return OMX_ErrorUndefined;
2210 }
2211 }
2212 }
2213 EXIT:
2214 return eError;
2215 } /* End of ComponentTunnelRequest_JPEGDec */
2216
2217
2218 /* ========================================================================== */
2219 /**
2220 * @fn Allocate_DSPResources_JPEGDec - Allocate the Ialg structure for each port's
2221 * buffer header.
2222 * @param hComponent - handle for this instance of the component
2223 * @param nPort - Index Port
2224 * @return: OMX_ERRORTYPE
2225 * OMX_ErrorNone on success
2226 * !OMX_ErrorNone on any failure
2227 */
2228 /* ========================================================================== */
Allocate_DSPResources_JPEGDec(OMX_IN JPEGDEC_COMPONENT_PRIVATE * pComponentPrivate,OMX_IN OMX_U32 nPortIndex)2229 static OMX_ERRORTYPE Allocate_DSPResources_JPEGDec(OMX_IN JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate,
2230 OMX_IN OMX_U32 nPortIndex)
2231 {
2232 OMX_ERRORTYPE eError = OMX_ErrorNone;
2233 void *pUalgOutParams;
2234 void *pUalgInpParams;
2235 OMX_U8* pTemp;
2236 OMX_U8 nBufferCount = -1;
2237
2238 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1);
2239
2240 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion Allocate_DSPResources_JPEGDec\n");
2241
2242 nBufferCount = pComponentPrivate->pCompPort[nPortIndex]->nBuffCount;
2243 if (nPortIndex == JPEGDEC_INPUT_PORT) {
2244 OMX_MALLOC(pUalgInpParams, sizeof(JPEGDEC_UAlgInBufParamStruct) + 256);
2245 pTemp = (OMX_U8*)pUalgInpParams;
2246 pTemp += 128;
2247 pUalgInpParams = pTemp;
2248 (pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pUALGParams) = (JPEGDEC_UAlgInBufParamStruct *)(pUalgInpParams);
2249 }
2250 else if (nPortIndex == JPEGDEC_OUTPUT_PORT) {
2251 OMX_MALLOC(pUalgOutParams, sizeof(JPEGDEC_UAlgOutBufParamStruct) + 256);
2252 pTemp = (OMX_U8*)pUalgOutParams;
2253 pTemp += 128;
2254 pUalgOutParams = pTemp;
2255 (pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pUALGParams) = (JPEGDEC_UAlgOutBufParamStruct *)(pUalgOutParams);
2256 }
2257 else {
2258 eError = OMX_ErrorBadPortIndex;
2259 goto EXIT;
2260 }
2261
2262 EXIT:
2263 return eError;
2264 } /* End of Allocate_DSPResources_JPEGDec */
2265
2266
2267
2268
JPEGDEC_InitBufferFlagTrack(JPEGDEC_COMPONENT_PRIVATE * pComponentPrivate,OMX_U32 nPortIndex)2269 static void JPEGDEC_InitBufferFlagTrack(
2270 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate,
2271 OMX_U32 nPortIndex)
2272
2273 {
2274 JPEGDEC_PORT_TYPE *pPortType = NULL;
2275 int i;
2276
2277 pPortType = pComponentPrivate->pCompPort[nPortIndex];
2278
2279 /* assume pPortType->pPortDef->nBufferCountActual <= NUM_OF_BUFFERSJPEG */
2280 for (i = 0; i < (int)pPortType->pPortDef->nBufferCountActual; i ++) {
2281 pPortType->sBufferFlagTrack[i].flag = 0;
2282 pPortType->sBufferFlagTrack[i].buffer_id = 0xFFFFFFFF;
2283 pPortType->sBufferMarkTrack[i].buffer_id = 0xFFFFFFFF;
2284 pPortType->sBufferMarkTrack[i].pMarkData = NULL;
2285 }
2286 }
2287
2288
2289
2290 #ifdef KHRONOS_1_1
2291 /* ========================================================================== */
2292 /**
2293 * @fn ComponentRoleEnum -
2294 * @param hComponent - handle for this instance of the component
2295 * @param cRole - role performed by the component
2296 * @param nIndex - Index
2297 * @return: OMX_ERRORTYPE
2298 * OMX_ErrorNone on success
2299 * !OMX_ErrorNone on any failure
2300 */
2301 /* ========================================================================== */
ComponentRoleEnum(OMX_IN OMX_HANDLETYPE hComponent,OMX_OUT OMX_U8 * cRole,OMX_IN OMX_U32 nIndex)2302 static OMX_ERRORTYPE ComponentRoleEnum(OMX_IN OMX_HANDLETYPE hComponent,
2303 OMX_OUT OMX_U8 *cRole,
2304 OMX_IN OMX_U32 nIndex)
2305 {
2306 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate;
2307 OMX_ERRORTYPE eError = OMX_ErrorNone;
2308 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
2309
2310 if(nIndex == 0){
2311 strncpy((char *)cRole, (char *)pComponentPrivate->componentRole.cRole, sizeof(OMX_U8) * OMX_MAX_STRINGNAME_SIZE);
2312 }
2313 else {
2314 eError = OMX_ErrorNoMore;
2315 }
2316
2317 return eError;
2318 }
2319 #endif
2320
2321
2322
2323 /*-------------------------------------------------------------------*/
2324 /**
2325 * GetExtensionIndex_JpegDec()
2326 *
2327 * Free a video driver buffer.
2328 *
2329 * @retval OMX_ErrorNone Successful operation.
2330 * OMX_ErrorBadParameter Invalid operation.
2331 * OMX_ErrorIncorrectStateOperation If called when port is disabled.
2332 **/
2333 /*-------------------------------------------------------------------*/
GetExtensionIndex_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent,OMX_IN OMX_STRING cParameterName,OMX_OUT OMX_INDEXTYPE * pIndexType)2334 OMX_ERRORTYPE GetExtensionIndex_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_STRING cParameterName, OMX_OUT OMX_INDEXTYPE* pIndexType)
2335 {
2336 OMX_U16 nIndex;
2337 OMX_ERRORTYPE eError = OMX_ErrorUndefined;
2338 JPEGDEC_CUSTOM_PARAM_DEFINITION sJpegDecCustomParams[] = {
2339 {"OMX.TI.JPEG.decoder.Config.ProgressiveFactor", OMX_IndexCustomProgressiveFactor},
2340 {"OMX.TI.JPEG.decoder.Config.InputFrameWidth", OMX_IndexCustomInputFrameWidth},
2341 {"OMX.TI.JPEG.decoder.Config.OutputColorFormat", OMX_IndexCustomOutputColorFormat},
2342 {"OMX.TI.JPEG.decoder.Param.SectionDecode", OMX_IndexCustomSectionDecode},
2343 {"OMX.TI.JPEG.decoder.Param.SubRegionDecode", OMX_IndexCustomSubRegionDecode},
2344 {"OMX.TI.JPEG.decoder.Param.SetMaxResolution", OMX_IndexCustomSetMaxResolution},
2345 {"OMX.TI.JPEG.decoder.Debug", OMX_IndexCustomDebug},
2346 {"",0x0}
2347 };
2348
2349 /* Check parameter validity */
2350 OMX_CHECK_PARAM(hComponent);
2351 OMX_CHECK_PARAM(pIndexType);
2352 *pIndexType = OMX_IndexMax;
2353
2354 for (nIndex = 0; strlen((const char*)sJpegDecCustomParams[nIndex].cCustomParamName); nIndex++){
2355 if (!strcmp((const char*)cParameterName, (const char*)(&(sJpegDecCustomParams[nIndex].cCustomParamName)))){
2356 *pIndexType = sJpegDecCustomParams[nIndex].nCustomParamIndex;
2357 eError = OMX_ErrorNone;
2358 break;
2359 }
2360 }
2361
2362 if(*pIndexType == OMX_IndexMax){
2363 eError = OMX_ErrorUnsupportedIndex;
2364 }
2365
2366
2367 EXIT:
2368 return eError;
2369 }
2370