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-----------------------------------*/
83OMX_STRING cJPEGencName = "OMX.TI.JPEG.encoder";
84/*--------function prototypes ---------------------------------*/
85static OMX_ERRORTYPE JPEGENC_SetCallbacks (OMX_HANDLETYPE hComp,
86                                   OMX_CALLBACKTYPE* pCallBacks,
87                                   OMX_PTR pAppData);
88
89static OMX_ERRORTYPE JPEGENC_GetComponentVersion (OMX_HANDLETYPE hComp,
90                                          OMX_STRING pComponentName,
91                                          OMX_VERSIONTYPE* pComponentVersion,
92                                          OMX_VERSIONTYPE* pSpecVersion,
93                                          OMX_UUIDTYPE* pComponentUUID);
94
95static OMX_ERRORTYPE JPEGENC_SendCommand (OMX_HANDLETYPE hComponent,
96                                  OMX_COMMANDTYPE Cmd,
97                                  OMX_U32 nParam,
98                                  OMX_PTR pCmdData);
99
100static OMX_ERRORTYPE JPEGENC_GetParameter (OMX_IN OMX_HANDLETYPE hComponent,
101                                   OMX_IN OMX_INDEXTYPE nParamIndex,
102                                   OMX_INOUT OMX_PTR ComponentParameterStructure);
103
104static OMX_ERRORTYPE JPEGENC_SetParameter (OMX_HANDLETYPE hComp,
105                                   OMX_INDEXTYPE nParamIndex,
106                                   OMX_PTR ComponentParameterStructure);
107
108static OMX_ERRORTYPE JPEGENC_GetConfig (OMX_HANDLETYPE hComp,
109                                OMX_INDEXTYPE nConfigIndex,
110                                OMX_PTR ComponentConfigStructure);
111
112static OMX_ERRORTYPE JPEGENC_SetConfig (OMX_HANDLETYPE hComp,
113                                OMX_INDEXTYPE nConfigIndex,
114                                OMX_PTR ComponentConfigStructure);
115
116static OMX_ERRORTYPE JPEGENC_EmptyThisBuffer (OMX_HANDLETYPE hComp,
117                                      OMX_BUFFERHEADERTYPE* pBuffer);
118
119static OMX_ERRORTYPE JPEGENC_FillThisBuffer (OMX_HANDLETYPE hComp,
120                                     OMX_BUFFERHEADERTYPE* pBuffer);
121
122static OMX_ERRORTYPE JPEGENC_GetState (OMX_HANDLETYPE hComp,
123                               OMX_STATETYPE* pState);
124
125static 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
132static OMX_ERRORTYPE JPEGENC_VerifyTunnelConnection(JPEG_PORT_TYPE*pPort,
133                                            OMX_HANDLETYPE hTunneledComp,
134					    OMX_PARAM_PORTDEFINITIONTYPE* pPortDef,
135					    struct OMX_TI_Debug *dbg);
136
137static 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
144static OMX_ERRORTYPE JPEGENC_FreeBuffer(OMX_IN  OMX_HANDLETYPE hComponent,
145                                OMX_IN  OMX_U32 nPortIndex,
146                                OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
147
148static OMX_ERRORTYPE JPEGENC_ComponentDeInit(OMX_HANDLETYPE pHandle);
149
150static 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
156static void JPEGENC_InitBufferFlagTrack(JPEGENC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nPortIndex);
157
158#ifdef KHRONOS_1_1
159static OMX_ERRORTYPE ComponentRoleEnum(
160                OMX_IN OMX_HANDLETYPE hComponent,
161                OMX_OUT OMX_U8 *cRole,
162                OMX_IN OMX_U32 nIndex);
163#endif
164
165static 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
173static 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
272PRINT_EXIT:
273    OMX_PRINT1(pComponentPrivate->dbg, "Exit from FreeBuffer\n");
274EXIT:
275    return eError;
276}
277
278OMX_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
402EXIT:
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/*-------------------------------------------------------------------*/
418OMX_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/*-------------------------------------------------------------------*/
742static 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
764EXIT:
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/*-------------------------------------------------------------------*/
785static 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    }
817EXIT:
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/*-------------------------------------------------------------------*/
836static 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
974EXIT:
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/*-------------------------------------------------------------------*/
994static 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    }
1135PRINT_EXIT:
1136    OMX_PRINT1(pComponentPrivate->dbg, "Exit function eError = %x\n", eError);
1137EXIT:
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/*-------------------------------------------------------------------*/
1158static 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/*-------------------------------------------------------------------*/
1320static 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
1360static 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");
1565EXIT:
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/*-------------------------------------------------------------------*/
1584static 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/*-------------------------------------------------------------------*/
1664static 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
1806EXIT:
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/*-------------------------------------------------------------------*/
1825static 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
1923static 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
1951EXIT:
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
1982OMX_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  *
2057static 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
2066OMX_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
2148EXIT:
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/*-------------------------------------------------------------------*/
2169OMX_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
2282EXIT:
2283    OMX_PRINT1(pComponentPrivate->dbg, "Exiting pHandle = %d\n", (int)pHandle);
2284    return eError;
2285}
2286
2287
2288static 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
2309static 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/*-------------------------------------------------------------------*/
2342OMX_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
2382EXIT:
2383    return eError;
2384}
2385
2386
2387
2388