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