Home | History | Annotate | Download | only in inc
      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_JpegDec_Utils.h
     30 *
     31 ** This is a header file for a JPEG decoder.
     32 
     33 * ================================================================================
     34 */
     35 
     36 #ifndef OMX_JPEGDEC_UTILS__H
     37 #define OMX_JPEGDEC_UTILS__H
     38 
     39 #include <OMX_Component.h>
     40 #include <OMX_IVCommon.h>
     41 #include "LCML_DspCodec.h"
     42 #include "LCML_Types.h"
     43 #include "LCML_CodecInterface.h"
     44 #include <pthread.h>
     45 #include <OMX_Core.h>
     46 #include <OMX_Types.h>
     47 #include <OMX_Image.h>
     48 #include <sys/time.h>
     49 #include <stdio.h>
     50 #include <errno.h>
     51 #include <OMX_TI_Common.h>
     52 #include <OMX_TI_Debug.h>
     53 
     54 #include <utils/Log.h>
     55 #define LOG_TAG "OMX_JPGDEC"
     56 
     57 #ifdef RESOURCE_MANAGER_ENABLED
     58 #include <ResourceManagerProxyAPI.h>
     59 #endif
     60 
     61 #ifdef __PERF_INSTRUMENTATION__
     62     #include "perf.h"
     63 #endif
     64 
     65 
     66 #ifdef UNDER_CE
     67     #include <oaf_debug.h>
     68 #endif
     69 
     70 
     71 #define JPEGDEC1MPImage 1000000
     72 #define JPEGDEC2MPImage 2000000
     73 #define JPEGDEC3MPImage 3000000
     74 #define JPEGDEC4MPImage 4000000
     75 
     76 #define COMP_MAX_NAMESIZE 127
     77 
     78 /*Linked List */
     79 
     80 typedef struct Node {
     81     struct Node *pNextNode;
     82     void *pValue;
     83 } Node;
     84 
     85 typedef struct LinkedList {
     86     Node *pRoot;
     87 }   LinkedList;
     88 
     89 LinkedList AllocList;
     90 
     91 void LinkedList_Create(LinkedList *LinkedList);
     92 void LinkedList_AddElement(LinkedList *LinkedList, void *pValue);
     93 void LinkedList_FreeElement(LinkedList *LinkedList, void *pValue);
     94 void LinkedList_FreeAll(LinkedList *LinkedList);
     95 void LinkedList_DisplayAll(LinkedList *LinkedList);
     96 void LinkedList_Destroy(LinkedList *LinkedList);
     97 
     98 /*
     99  *     M A C R O S
    100  */
    101 #define KHRONOS_1_1
    102 
    103 #define OMX_CONF_INIT_STRUCT(_s_, _name_)   \
    104     memset((_s_), 0x0, sizeof(_name_)); \
    105     (_s_)->nSize = sizeof(_name_);      \
    106     (_s_)->nVersion.s.nVersionMajor = 0x1;  \
    107     (_s_)->nVersion.s.nVersionMinor = 0x0;  \
    108     (_s_)->nVersion.s.nRevision = 0x0;      \
    109     (_s_)->nVersion.s.nStep = 0x0
    110 
    111 
    112 #define OMX_MEMCPY_CHECK(_s_)\
    113 {\
    114     if (_s_ == NULL) { \
    115     eError = OMX_ErrorInsufficientResources;  \
    116     goto EXIT;   \
    117     } \
    118 }
    119 #define OMX_CHECK_PARAM(_ptr_)  \
    120 {   \
    121     if(!_ptr_) {    \
    122     eError = OMX_ErrorBadParameter; \
    123     goto EXIT; \
    124     }   \
    125 }
    126 
    127 #define JPEGDEC_OMX_CONF_CHECK_CMD(_ptr1, _ptr2, _ptr3)\
    128 do {					       \
    129     if(!_ptr1 || !_ptr2 || !_ptr3){	       \
    130         eError = OMX_ErrorBadParameter;        \
    131         goto EXIT;                             \
    132     }					       \
    133 } while(0)
    134 
    135 #define OMX_MALLOC(_pStruct_, _size_)   \
    136     _pStruct_ = malloc(_size_);  \
    137     if(_pStruct_ == NULL){  \
    138         eError = OMX_ErrorInsufficientResources;    \
    139         goto EXIT;  \
    140     } \
    141     memset(_pStruct_, 0, _size_);\
    142     LinkedList_AddElement(&AllocList, _pStruct_);
    143 
    144 #define OMX_FREE(_ptr)   \
    145 {                     \
    146     if (_ptr != NULL) { \
    147         LinkedList_FreeElement(&AllocList, _ptr);\
    148         _ptr = NULL; \
    149     }                \
    150 }
    151 
    152 #define OMX_FREEALL()   \
    153 {                     \
    154         LinkedList_FreeAll(&AllocList);\
    155 }
    156 
    157 #define JPEGDEC_WAIT_PORT_POPULATION(_pComponentPrivate_)    \
    158 {                                                                           \
    159     int nRet = 0x0;                                                         \
    160     struct timespec  ts;                                                    \
    161     struct timeval sTime;                                                   \
    162     struct timezone sTimeZone;                                              \
    163                                                                             \
    164     pthread_mutex_lock(&((_pComponentPrivate_)->mJpegDecMutex));     \
    165     gettimeofday(&sTime, &sTimeZone);                                       \
    166     ts.tv_sec = sTime.tv_sec;                                               \
    167     ts.tv_sec += JPEGDEC_TIMEOUT;                                      \
    168                                                                    \
    169     nRet = pthread_cond_timedwait(&((_pComponentPrivate_)->sPortPopulated_cond),\
    170                                   &((_pComponentPrivate_)->mJpegDecMutex), \
    171                                   &ts);                                 \
    172     if (nRet == ETIMEDOUT)                                              \
    173     {                                                                   \
    174         OMX_PRBUFFER4((_pComponentPrivate_)->dbg, "Wait for port to be Populated time-out"); \
    175         pthread_mutex_unlock(&((_pComponentPrivate_)->mJpegDecMutex));\
    176         \
    177         eError = OMX_ErrorPortUnresponsiveDuringAllocation;\
    178         \
    179         break;                                  \
    180     }                                                                   \
    181    pthread_mutex_unlock(&((_pComponentPrivate_)->mJpegDecMutex));     \
    182 }
    183 
    184 #define JPEGDEC_WAIT_PORT_UNPOPULATION(_pComponentPrivate_)    \
    185 {                                                                           \
    186     int nRet = 0x0;                                                         \
    187     struct timespec  ts;                                                    \
    188     struct timeval sTime;                                                   \
    189     struct timezone sTimeZone;                                              \
    190                                                                             \
    191     pthread_mutex_lock(&((_pComponentPrivate_)->mJpegDecMutex));     \
    192     gettimeofday(&sTime, &sTimeZone);                                       \
    193     ts.tv_sec = sTime.tv_sec;                                               \
    194     ts.tv_sec += JPEGDEC_TIMEOUT;                                      \
    195                                                                    \
    196     nRet = pthread_cond_timedwait(&((_pComponentPrivate_)->sPortPopulated_cond),\
    197                                   &((_pComponentPrivate_)->mJpegDecMutex), \
    198                                   &ts);                                 \
    199     if (nRet == ETIMEDOUT)                                              \
    200     {                                                                   \
    201         OMX_PRBUFFER4((_pComponentPrivate_)->dbg, "Wait for port to be Unpopulated time-out"); \
    202         pthread_mutex_unlock(&((_pComponentPrivate_)->mJpegDecMutex));\
    203         \
    204         eError = OMX_ErrorPortUnresponsiveDuringDeallocation;\
    205         \
    206         break;                                  \
    207     }                                                                   \
    208    pthread_mutex_unlock(&((_pComponentPrivate_)->mJpegDecMutex));     \
    209 }
    210 
    211 #define JPEGDEC_WAIT_FLUSH(_pComponentPrivate_)     \
    212 {                                                                                           \
    213     int nRet = 0x0;                                                         \
    214     struct timespec  ts;                                                    \
    215     struct timeval sTime;                                                   \
    216     struct timezone sTimeZone;                                              \
    217                                                                             \
    218     pthread_mutex_lock(&((_pComponentPrivate_)->mJpegDecFlushMutex));     \
    219     gettimeofday(&sTime, &sTimeZone);                                       \
    220     ts.tv_sec = sTime.tv_sec;                                               \
    221     ts.tv_sec += JPEGDEC_TIMEOUT;                                      \
    222                                                                    \
    223     nRet = pthread_cond_timedwait(&((_pComponentPrivate_)->sFlush_cond),\
    224                                   &((_pComponentPrivate_)->mJpegDecFlushMutex), \
    225                                   &ts);                                 \
    226     if (nRet == ETIMEDOUT)                                              \
    227     {                                                                   \
    228 	OMX_PRBUFFER4((_pComponentPrivate_)->dbg, "Wait for port to be Unpopulated time-out"); \
    229         pthread_mutex_unlock(&((_pComponentPrivate_)->mJpegDecFlushMutex));\
    230         _pComponentPrivate_->cbInfo.EventHandler(_pComponentPrivate_->pHandle,\
    231                                                _pComponentPrivate_->pHandle->pApplicationPrivate,\
    232                                                OMX_EventError,\
    233                                                OMX_ErrorTimeout,\
    234                                                OMX_TI_ErrorMajor,\
    235                                                "TimeOut - whlie doing flush");\
    236         break;                                  \
    237     }                                                                   \
    238    pthread_mutex_unlock(&((_pComponentPrivate_)->mJpegDecFlushMutex));     \
    239 }
    240 
    241 
    242 #define OMX_DPRINT_ADDRESS(_s_, _ptr_)  \
    243     OMX_PRINT2(pComponentPrivate->dbg, "%s = %p\n", _s_, _ptr_);
    244 
    245 #ifdef RESOURCE_MANAGER_ENABLED
    246 #define OMX_GET_RM_VALUE(_Res_, _RM_) \
    247 {   \
    248     if (_Res_ <= JPEGDEC1MPImage){  \
    249         _RM_ = 25;  \
    250         }   \
    251     else if (_Res_ <= JPEGDEC2MPImage){ \
    252         _RM_ = 40;  \
    253         }   \
    254     else if (_Res_ <= JPEGDEC3MPImage){ \
    255         _RM_ = 55;  \
    256         }   \
    257     else if (_Res_ <= JPEGDEC4MPImage){ \
    258         _RM_ = 70;  \
    259         }   \
    260     else {  \
    261         _RM_ = 90;  \
    262         }   \
    263         \
    264     OMX_PRMGR2(pComponentPrivate->dbg, "Value in MHz requested to RM = %d\n",_RM_); \
    265 }
    266 #endif
    267 
    268 #define NUM_OF_BUFFERS 4
    269 #define NUM_OF_PORTS 2
    270 
    271 
    272 #define OMX_JPEGDEC_NUM_DLLS (3)
    273 #ifdef UNDER_CE
    274     #define JPEG_DEC_NODE_DLL "/windows/jpegdec_sn.dll64P"
    275     #define JPEG_COMMON_DLL "/windows/usn.dll64P"
    276     #define USN_DLL "/windows/usn.dll64P"
    277 #else
    278 #define JPEG_DEC_NODE_DLL "jpegdec_sn.dll64P"
    279 #define JPEG_COMMON_DLL "usn.dll64P"
    280 #define USN_DLL "usn.dll64P"
    281 #endif
    282 
    283 #define JPGDEC_SNTEST_STRMCNT       2
    284 #define JPGDEC_SNTEST_INSTRMID      0
    285 #define JPGDEC_SNTEST_OUTSTRMID     1
    286 #define JPGDEC_SNTEST_MAX_HEIGHT    3000
    287 #define JPGDEC_SNTEST_MAX_WIDTH     4000
    288 #define JPGDEC_SNTEST_PROG_FLAG     1
    289 #define JPGDEC_SNTEST_INBUFCNT      4
    290 #define JPGDEC_SNTEST_OUTBUFCNT     4
    291 
    292 #define OMX_NOPORT 0xFFFFFFFE
    293 
    294 #define JPEGD_DSPSTOP       0x01
    295 #define JPEGD_BUFFERBACK    0x02
    296 #define JPEGD_IDLEREADY     ( JPEGD_DSPSTOP | JPEGD_BUFFERBACK )
    297 
    298 #define DSP_MMU_FAULT_HANDLING
    299 
    300 #define OMX_CustomCommandStopThread (OMX_CommandMax - 1)
    301 
    302 typedef OMX_ERRORTYPE (*jpegdec_fpo)(OMX_HANDLETYPE);
    303 
    304 static const struct DSP_UUID JPEGDSOCKET_TI_UUID = {
    305     0x5D9CB711, 0x4645, 0x11d6, 0xb0, 0xdc, {
    306         0x00, 0xc0, 0x4f, 0x1f, 0xc0, 0x36
    307     }
    308 };
    309 
    310 static const struct DSP_UUID USN_UUID = {
    311     0x79A3C8B3, 0x95F2, 0x403F, 0x9A, 0x4B, {
    312         0xCF, 0x80, 0x57, 0x73, 0x05, 0x41
    313     }
    314 };
    315 
    316 typedef enum JPEGDEC_COMP_PORT_TYPE
    317 {
    318     JPEGDEC_INPUT_PORT = 0,
    319     JPEGDEC_OUTPUT_PORT
    320 }JPEGDEC_COMP_PORT_TYPE;
    321 
    322 
    323 typedef enum JPEGDEC_BUFFER_OWNER
    324 {
    325     JPEGDEC_BUFFER_CLIENT = 0x0,
    326     JPEGDEC_BUFFER_COMPONENT_IN,
    327     JPEGDEC_BUFFER_COMPONENT_OUT,
    328     JPEGDEC_BUFFER_DSP,
    329     JPEGDEC_BUFFER_TUNNEL_COMPONENT
    330 } JPEGDEC_BUFFER_OWNER;
    331 
    332 typedef struct _JPEGDEC_BUFFERFLAG_TRACK {
    333     OMX_U32 flag;
    334     OMX_U32 buffer_id;
    335     OMX_HANDLETYPE hMarkTargetComponent;
    336     OMX_PTR pMarkData;
    337 } JPEGDEC_BUFFERFLAG_TRACK;
    338 
    339 typedef struct _JPEGDEC_BUFFERMARK_TRACK {
    340     OMX_U32 buffer_id;
    341     OMX_HANDLETYPE hMarkTargetComponent;
    342     OMX_PTR pMarkData;
    343 } JPEGDEC_BUFFERMARK_TRACK;
    344 
    345 typedef struct JPEGDEC_BUFFER_PRIVATE {
    346     OMX_BUFFERHEADERTYPE* pBufferHdr;
    347     OMX_PTR pUALGParams;
    348     JPEGDEC_BUFFER_OWNER eBufferOwner;
    349     OMX_BOOL bAllocbyComponent;
    350     OMX_BOOL bReadFromPipe;
    351 } JPEGDEC_BUFFER_PRIVATE;
    352 
    353 typedef struct JPEGDEC_PORT_TYPE
    354 {
    355     OMX_HANDLETYPE hTunnelComponent;
    356     OMX_U32 nTunnelPort;
    357     JPEGDEC_BUFFER_PRIVATE* pBufferPrivate[NUM_OF_BUFFERS];
    358     JPEGDEC_BUFFERFLAG_TRACK sBufferFlagTrack[NUM_OF_BUFFERS];
    359     JPEGDEC_BUFFERMARK_TRACK sBufferMarkTrack[NUM_OF_BUFFERS];
    360     OMX_PARAM_PORTDEFINITIONTYPE* pPortDef;
    361     OMX_PARAM_BUFFERSUPPLIERTYPE *pParamBufSupplier;
    362     OMX_IMAGE_PARAM_PORTFORMATTYPE* pPortFormat;
    363     OMX_U8 nBuffCount;
    364 } JPEGDEC_PORT_TYPE;
    365 
    366 typedef struct OMX_CUSTOM_IMAGE_DECODE_SECTION
    367 {
    368     OMX_U32 nSize;
    369     OMX_VERSIONTYPE nVersion;
    370     OMX_U32 nMCURow;
    371     OMX_U32 nAU;
    372     OMX_BOOL bSectionsInput;
    373     OMX_BOOL bSectionsOutput;
    374 }OMX_CUSTOM_IMAGE_DECODE_SECTION;
    375 
    376 typedef struct OMX_CUSTOM_IMAGE_DECODE_SUBREGION
    377 {
    378     OMX_U32 nSize;
    379     OMX_VERSIONTYPE nVersion;
    380     OMX_U32 nXOrg;         /*Sectional decoding: X origin*/
    381     OMX_U32 nYOrg;         /*Sectional decoding: Y origin*/
    382     OMX_U32 nXLength;      /*Sectional decoding: X lenght*/
    383     OMX_U32 nYLength;      /*Sectional decoding: Y lenght*/
    384 }OMX_CUSTOM_IMAGE_DECODE_SUBREGION;
    385 
    386 
    387 typedef struct OMX_CUSTOM_RESOLUTION
    388 {
    389 	OMX_U32 nWidth;
    390 	OMX_U32 nHeight;
    391 } OMX_CUSTOM_RESOLUTION;
    392 
    393 
    394 typedef struct JPEGDEC_COMPONENT_PRIVATE
    395 {
    396     JPEGDEC_PORT_TYPE *pCompPort[NUM_OF_PORTS];
    397     OMX_PORT_PARAM_TYPE* pPortParamType;
    398     OMX_PRIORITYMGMTTYPE* pPriorityMgmt;
    399     OMX_CONFIG_SCALEFACTORTYPE* pScalePrivate;
    400     OMX_PORT_PARAM_TYPE* pAudioPortType;
    401     OMX_PORT_PARAM_TYPE* pVideoPortType;
    402     OMX_PORT_PARAM_TYPE* pOtherPortType;
    403     /* Handle for use with async callbacks */
    404     OMX_CALLBACKTYPE cbInfo;
    405     /*Component name OMX.TI.JPEG.decoder*/
    406     OMX_STRING      cComponentName;
    407     OMX_VERSIONTYPE ComponentVersion;
    408     OMX_VERSIONTYPE SpecVersion;
    409 
    410     OMX_U8 nSize;
    411     OMX_STATETYPE nToState;
    412     OMX_U8        ExeToIdleFlag;  /* StateCheck */
    413     /* This is component handle */
    414     OMX_COMPONENTTYPE* pHandle;
    415     /* Current state of this component */
    416     OMX_STATETYPE nCurState;
    417     /* The component thread handle */
    418     pthread_t pComponentThread;
    419     /* The pipes to maintain free buffers */
    420     int nFree_outBuf_Q[2];
    421     /* The pipes to maintain input buffers sent from app*/
    422     int nFilled_inpBuf_Q[2];
    423     /* The pipes for sending buffers to the thread */
    424     int nCmdPipe[2];
    425     int nCmdDataPipe[2];
    426     void* pLcmlHandle;
    427     void * pDllHandle;
    428     int nProgressive;
    429     int nProfileID;
    430     int nIsLCMLActive;
    431     OMX_PTR pMarkData;
    432     OMX_MARKTYPE *pMarkBuf;
    433     OMX_HANDLETYPE hMarkTargetComponent;
    434     LCML_DSP_INTERFACE* pLCML;
    435     OMX_BOOL bFlushComplete;
    436     OMX_U32 nInPortIn;
    437     OMX_U32 nOutPortOut;
    438     OMX_BOOL bInportDisableComplete;
    439     OMX_BOOL bOutportDisableComplete;
    440     OMX_U32 nMarkPort;
    441 
    442     pthread_mutex_t mJpegDecMutex;
    443     pthread_cond_t  sStop_cond;
    444 
    445     /* Condition to signal threads PortTransition */
    446     pthread_cond_t sPortPopulated_cond;
    447     /*Condition signal Flush & Mutex*/
    448     pthread_mutex_t mJpegDecFlushMutex;
    449     pthread_cond_t sFlush_cond;
    450 
    451 #ifdef KHRONOS_1_1
    452     OMX_PARAM_COMPONENTROLETYPE* pCompRole;
    453     OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE* pQuantTable;
    454     OMX_IMAGE_PARAM_HUFFMANTTABLETYPE* pHuffmanTable;
    455 #endif
    456 
    457     int nInputFrameWidth;
    458     int nOutputColorFormat;
    459 
    460 #ifdef RESOURCE_MANAGER_ENABLED
    461     RMPROXY_CALLBACKTYPE rmproxyCallback;
    462 #endif
    463 
    464     OMX_BOOL bPreempted;
    465 
    466 #ifdef __PERF_INSTRUMENTATION__
    467     PERF_OBJHANDLE pPERF, pPERFcomp;
    468 #endif
    469 #ifdef KHRONOS_1_1
    470     OMX_PARAM_COMPONENTROLETYPE componentRole;
    471 #endif
    472     OMX_CUSTOM_IMAGE_DECODE_SECTION* pSectionDecode;
    473     OMX_CUSTOM_IMAGE_DECODE_SUBREGION* pSubRegionDecode;
    474     OMX_CUSTOM_RESOLUTION sMaxResolution;
    475     struct OMX_TI_Debug dbg;
    476 } JPEGDEC_COMPONENT_PRIVATE;
    477 
    478 
    479 typedef struct
    480 {
    481     long int lInBufCount;       /*set it to zero*/
    482     OMX_U32 ulInNumFrame;       /*set it to 1*/
    483     OMX_U32 ulInFrameAlign;     /*set it to 4*/
    484     OMX_U32 ulInFrameSize;      /*same as buffer size*/
    485     OMX_U32 ulInDisplayWidth;   /*Width of the buffer into which the image is to be decoded*/
    486     OMX_U32 ulInReserved0;      /*could be like thumbnail decode only*/
    487     OMX_U32 ulInReserved1;      /*could be output format  later. Lets fix it to 422 always now*/
    488     OMX_U32 ulInReserved2;      /*could be post processing flag*/
    489     OMX_U32 ulInReserved3;
    490     OMX_U32 ulInResizeOption;   /*Rescale factor */
    491     OMX_U32 ulnumAU;            /*Number of MCUs to decode; set as DEFAULT for full image decoding*/
    492     OMX_U32 uldecodeHeader;     /*DECODE_AU = Decode at one shot; PARSE_HEADER = Parse header   */
    493     OMX_U32 maxHeight;          /*Maximum height of image that can be decoded*/
    494     OMX_U32 maxWidth;           /*Maximum width of image that can be decoded*/
    495     OMX_U32 maxScans;           /*Maximum number of frames in the input image*/
    496     OMX_U32 uldataEndianness;   /*Endianness of input data*/
    497     OMX_U32 forceChromaFormat;  /*Set to CHROMAFORMAT ; Set to DEFAULT to avoid resampling.*/
    498     OMX_U32 RGB_Format;         /* Set the output RGB format */
    499                                                     /* 0: BGR24                                 */
    500                                                     /* 1: BGR32                                 */
    501                                                     /* 2: RGB16                                 */
    502     OMX_U32 ulNumMCURow;    /*Slide decoding: Set the numbers of lines to decode*/
    503     OMX_U32 ulXOrg;         /*Sectional decoding: X origin*/
    504     OMX_U32 ulYOrg;         /*Sectional decoding: Y origin*/
    505     OMX_U32 ulXLength;      /*Sectional decoding: X lenght*/
    506     OMX_U32 ulYLength;      /*Sectional decoding: Y lenght*/
    507     OMX_U32 ulAlphaRGB;   /* Alpha RGB value, it only takes values from 0 to 255 */
    508 }JPEGDEC_UAlgInBufParamStruct;
    509 
    510 typedef struct
    511 {
    512     long int lOutBufCount;      /*set it to zero*/
    513     OMX_U32 ulOutNumFrame;      /*set it to 1*/
    514     OMX_U32 ulOutFrameAlign;    /*set it to 4*/
    515     OMX_U32 ulOutFrameSize;     /*same as buffer size*/
    516     OMX_U32 ulOutImgFormat;     /*output format*/
    517     OMX_U32 ulOutImageWidth;    /*Width of the image*/
    518     OMX_U32 ulOutImageHeight;   /*Height of the image*/
    519     OMX_U32 ulOutnProgressiveFlag; /*nProgressive flag*/
    520     OMX_U32 ulOutErrorCode;     /*error code*/
    521     OMX_U32 ulOutReserved0;
    522     OMX_U32 ulOutReserved1;
    523     OMX_U32 ulOutReserved2;
    524     OMX_U32 lastMCU;            /* 1-Decoded all MCUs0 - Decoding not completed*/
    525     OMX_U32 stride[3];          /*Stride values for Y, U, and V components*/
    526     OMX_U32 ulOutputHeight;     /* Output Height */
    527     OMX_U32 ulOutputWidth;      /* Output Width*/
    528     OMX_U32 ultotalAU;          /* Total number of Access unit(MCU)*/
    529     OMX_U32 ulbytesConsumed;    /* Total number of bytes consumed*/
    530     OMX_U32 ulcurrentAU;        /* current access unit number */
    531     OMX_U32 ulcurrentScan;      /*current scan number*/
    532 }JPEGDEC_UAlgOutBufParamStruct;
    533 
    534 typedef enum OMX_INDEXIMAGETYPE
    535 {
    536     OMX_IndexCustomProgressiveFactor = 0xFF000001,
    537     OMX_IndexCustomInputFrameWidth,
    538     OMX_IndexCustomOutputColorFormat,
    539     OMX_IndexCustomSectionDecode,
    540     OMX_IndexCustomSubRegionDecode,
    541     OMX_IndexCustomSetMaxResolution,
    542     OMX_IndexCustomDebug
    543 }OMX_INDEXIMAGETYPE;
    544 
    545 typedef struct _JPEGDEC_CUSTOM_PARAM_DEFINITION
    546 {
    547     OMX_U8 cCustomParamName[128];
    548     OMX_INDEXTYPE nCustomParamIndex;
    549 } JPEGDEC_CUSTOM_PARAM_DEFINITION;
    550 
    551 /* function declarations */
    552 OMX_ERRORTYPE ComponentDeInit(OMX_HANDLETYPE hComponent);
    553 OMX_U32 HandleCommandJpegDec(JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1);
    554 OMX_U32 HandleCommandFlush(JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1);
    555 OMX_ERRORTYPE DisablePortJpegDec(JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1);
    556 OMX_ERRORTYPE EnablePortJpegDec(JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1);
    557 OMX_ERRORTYPE Start_ComponentThreadJpegDec(OMX_HANDLETYPE pHandle);
    558 OMX_ERRORTYPE HandleDataBuf_FromAppJpegDec(JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate );
    559 OMX_ERRORTYPE HandleDataBuf_FromDspJpegDec(JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE* pBuffHead);
    560 OMX_ERRORTYPE HandleFreeDataBufJpegDec(JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE* pBuffHead );
    561 OMX_ERRORTYPE HandleFreeOutputBufferFromAppJpegDec( JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate );
    562 OMX_ERRORTYPE JpegDec_AllocResources( JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate );
    563 OMX_ERRORTYPE LCML_CallbackJpegDec(TUsnCodecEvent event,void * argsCb [10]);
    564 OMX_ERRORTYPE Free_ComponentResourcesJpegDec(JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate);
    565 OMX_ERRORTYPE Fill_LCMLInitParamsJpegDec(LCML_DSP *lcml_dsp, OMX_U16 arr[], OMX_HANDLETYPE pComponent);
    566 OMX_ERRORTYPE GetLCMLHandleJpegDec(OMX_HANDLETYPE pComponent);
    567 OMX_ERRORTYPE HandleInternalFlush(JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1);
    568 OMX_BOOL IsTIOMXComponent(OMX_HANDLETYPE hComp);
    569 void* OMX_JpegDec_Thread (void* pThreadData);
    570 
    571 #ifdef RESOURCE_MANAGER_ENABLED
    572 void ResourceManagerCallback(RMPROXY_COMMANDDATATYPE cbData);
    573 #endif
    574 
    575 
    576 #endif
    577