Home | History | Annotate | Download | only in tests
      1 
      2 /*
      3  *  Copyright 2001-2008 Texas Instruments - http://www.ti.com/
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 /* ====================================================================
     18 *             Texas Instruments OMAP(TM) Platform Software
     19 * (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
     20 *
     21 * Use of this software is controlled by the terms and conditions found
     22 * in the license agreement under which this software has been supplied.
     23 * ==================================================================== */
     24 #ifdef UNDER_CE
     25 #include <windows.h>
     26 #else
     27 #include <sys/stat.h>
     28 #include <sys/time.h>
     29 #endif
     30 #include <stdio.h>
     31 #include <stdlib.h>
     32 #include <stdarg.h>
     33 #include <string.h>
     34 #include <sched.h>
     35 #include <unistd.h>
     36 #include <sys/types.h>
     37 #include <sys/select.h>
     38 #include <time.h>
     39 #include <OMX_Component.h>
     40 #include "JPEGTest.h"
     41 
     42 /* DSP recovery includes */
     43 #include <qosregistry.h>
     44 #include <qosti.h>
     45 #include <dbapi.h>
     46 #include <DSPManager.h>
     47 #include <DSPProcessor.h>
     48 #include <DSPProcessor_OEM.h>
     49 
     50 #ifdef UNDER_CE
     51 #define PRINT printf
     52 #else
     53 /*#define OMX_DEB*/
     54 #ifdef OMX_DEB
     55 #define PRINT(str,args...) fprintf(stdout,"[%s] %s():%d: *** "str"",__FILE__,__FUNCTION__,__LINE__,##args)
     56 #else
     57 #define PRINT(str, args...)
     58 #endif
     59 #endif
     60 
     61 typedef unsigned char uchar;
     62 /**
     63  * Pipe used to communicate back to the main thread from the component thread;
     64 **/
     65 
     66 int IpBuf_Pipe[2];
     67 int OpBuf_Pipe[2];
     68 int Event_Pipe[2];
     69 struct timeval tim;
     70 int DEINIT_FLAG = 0;
     71 int bPreempted=0;
     72 
     73 
     74 /* safe routine to get the maximum of 2 integers */
     75 
     76 inline int maxint(int a, int b)
     77 {
     78     return(a>b) ? a : b;
     79 }
     80 
     81 
     82  /*Define prototypes*/
     83 
     84 #ifdef DSP_MMU_FAULT_HANDLING
     85 int LoadBaseImage();
     86 #endif
     87 
     88  static OMX_ERRORTYPE WaitForEvent_JPEG(OMX_HANDLETYPE* pHandle,
     89                                   OMX_EVENTTYPE DesiredEvent,
     90                                   OMX_U32 data,
     91                                   OMX_STATETYPE DesiredState);
     92 
     93 
     94 static int Get16m(const void * Short)
     95 {
     96     return(((uchar *)Short)[0] << 8) | ((uchar *)Short)[1];
     97 }
     98 
     99 void  FixFrameSize ( IMAGE_INFO* imageinfo)
    100 {
    101 
    102     int nWidth=imageinfo->nWidth, nHeight=imageinfo->nHeight;
    103 
    104     /*round up if nWidth is not multiple of 32*/
    105     ( (nWidth%32 ) !=0 ) ?  nWidth=32 * (  (  nWidth/32 ) + 1 )  : nWidth;
    106     PRINT("411 file new nWidth %d \n", nWidth);
    107 
    108     /*round up if nHeight is not multiple of 16*/
    109     ( (nHeight%16) !=0 ) ?  nHeight=16 * (  (  nHeight/16 ) + 1 )  : nHeight;
    110     PRINT("new nHeight %d \n", nHeight);
    111 
    112     imageinfo->nWidth = nWidth;
    113     imageinfo->nHeight = nHeight;
    114 }
    115 
    116 
    117 int GetYUVformat(uchar * Data)
    118 {
    119     unsigned char Nf;
    120     int j;
    121      int temp_index;
    122      int temp;
    123      int image_format;
    124     short           H[4],V[4];
    125 
    126      Nf = Data[7];
    127 
    128 
    129     for (j = 0; j < Nf; j++)
    130     {
    131        temp_index = j * 3 + 7 + 2;
    132         /*---------------------------------------------------------*/
    133        /* H[j]: upper 4 bits of a byte, horizontal sampling fator.                  */
    134        /* V[j]: lower 4 bits of a byte, vertical sampling factor.                    */
    135        /*---------------------------------------------------------*/
    136          H[j] = (0x0f & (Data[temp_index] >> 4));
    137          V[j] = (0x0f & Data[temp_index]);
    138     }
    139 
    140     /*------------------------------------------------------------------*/
    141     /* Set grayscale flag, namely if image is gray then set it to 1,    */
    142     /* else set it to 0.                                                */
    143     /*------------------------------------------------------------------*/
    144     image_format = -1;
    145 
    146 
    147     if (Nf == 1){
    148       image_format = OMX_COLOR_FormatL8;
    149     }
    150 
    151 
    152     if (Nf == 3)
    153     {
    154        temp = (V[0]*H[0])/(V[1]*H[1]) ;
    155 
    156       if (temp == 4 && H[0] == 2)
    157         image_format = OMX_COLOR_FormatYUV420PackedPlanar;
    158 
    159       if (temp == 4 && H[0] == 4)
    160         image_format = OMX_COLOR_FormatYUV411Planar;
    161 
    162       if (temp == 2)
    163         image_format = OMX_COLOR_FormatCbYCrY; /* YUV422 interleaved, little endian */
    164 
    165       if (temp == 1)
    166         image_format = OMX_COLOR_FormatYUV444Interleaved;
    167     }
    168 
    169     return (image_format);
    170 
    171 }
    172 
    173 /*--------------------------------------------------------------------------
    174 * Parse the marker stream until SOS or EOI is seen;
    175 * ------------------------------------------------------------------------*/
    176 
    177 #ifdef UNDER_CE
    178 int ReadJpegSections (HANDLE infile,
    179                       IMAGE_INFO* imageinfo)
    180 #else
    181 int ReadJpegSections (FILE * infile,
    182                       IMAGE_INFO* imageinfo)
    183 #endif
    184 {
    185     int a = 0;
    186     long lSize = 0;
    187 #ifdef UNDER_CE
    188     int got = 0;
    189     int b = 0;
    190     lSize = GetFileSize(infile, NULL );
    191     SetFilePointer(infile, 0, NULL, FILE_BEGIN);
    192 #else
    193     fseek (infile , 0 , SEEK_END);
    194     lSize = ftell (infile);
    195     rewind (infile);
    196 #endif
    197 
    198     PRINT ("Size is %d \n", (int)lSize);
    199     imageinfo->nProgressive = 0; /*Default value is non progressive*/
    200 
    201 
    202 #ifdef UNDER_CE
    203     ReadFile(infile, &a, 1, &got, NULL);
    204 #else
    205     a = fgetc(infile);
    206 #endif
    207 
    208 #ifdef UNDER_CE
    209     ReadFile(infile, &b, 1, &got, NULL);
    210     if ( a != 0xff || b != M_SOI )  {
    211 #else
    212     if ( a != 0xff || fgetc(infile) != M_SOI )  {
    213 #endif
    214         return 0;
    215     }
    216     for ( ;; )  {
    217         int itemlen = 0;
    218         int marker = 0;
    219         int ll = 0,lh = 0, got = 0;
    220         uchar * Data = NULL;
    221 
    222         for ( a=0;a<7;a++ ) {
    223 #ifdef UNDER_CE
    224             ReadFile(infile, &marker, 1, &got, NULL);
    225 #else
    226             marker = fgetc(infile);
    227 #endif
    228             PRINT("MARKER IS %x\n",marker);
    229 
    230             if ( marker != 0xff )   {
    231                 break;
    232             }
    233             if ( a >= 6 )   {
    234                 PRINT("too many padding bytes\n");
    235                 if ( Data != NULL ) {
    236                     free(Data);
    237                     Data=NULL;
    238                 }
    239                 return 0;
    240             }
    241         }
    242         if ( marker == 0xff )   {
    243             /* 0xff is legal padding, but if we get that many, something's wrong.*/
    244             PRINT("too many padding bytes!");
    245         }
    246 
    247         /* Read the length of the section.*/
    248 #ifdef UNDER_CE
    249         ReadFile(infile, &lh, 1, &got, NULL);
    250         ReadFile(infile, &ll, 1, &got, NULL);
    251 #else
    252         lh = fgetc(infile);
    253         ll = fgetc(infile);
    254 #endif
    255 
    256         itemlen = (lh << 8) | ll;
    257 
    258         if ( itemlen < 2 )  {
    259             PRINT("invalid marker");
    260         }
    261 
    262         Data = (uchar *)malloc(itemlen);
    263         if ( Data == NULL ) {
    264             PRINT("Could not allocate memory");
    265         }
    266 
    267         /* Store first two pre-read bytes. */
    268         Data[0] = (uchar)lh;
    269         Data[1] = (uchar)ll;
    270 
    271 #ifdef UNDER_CE
    272         ReadFile(infile, Data+2, itemlen-2, &got, NULL);
    273 #else
    274         got = fread(Data+2, 1, itemlen-2, infile); /* Read the whole section.*/
    275 #endif
    276         if ( got != itemlen-2 ) {
    277             PRINT("Premature end of file?");
    278         }
    279 
    280         PRINT("Jpeg section marker 0x%02x size %d\n",marker, itemlen);
    281         switch ( marker )   {
    282 
    283         case M_SOS:
    284             if ( Data != NULL ) {
    285                 free(Data);
    286                 Data=NULL;
    287             }
    288 
    289             return lSize;
    290 
    291         case M_EOI:
    292             PRINT("No image in jpeg!\n");
    293             if ( Data != NULL ) {
    294                 free(Data);
    295                 Data=NULL;
    296             }
    297             return 0;
    298 
    299         case M_COM: /* Comment section  */
    300 
    301             break;
    302 
    303         case M_JFIF:
    304 
    305             break;
    306 
    307         case M_EXIF:
    308 
    309             break;
    310 
    311         case M_SOF2:
    312             PRINT("nProgressive IMAGE!\n");
    313             imageinfo->nProgressive=1;
    314 
    315         case M_SOF0:
    316         case M_SOF1:
    317         case M_SOF3:
    318         case M_SOF5:
    319         case M_SOF6:
    320         case M_SOF7:
    321         case M_SOF9:
    322         case M_SOF10:
    323         case M_SOF11:
    324         case M_SOF13:
    325         case M_SOF14:
    326         case M_SOF15:
    327 
    328             imageinfo->nHeight = Get16m(Data+3);
    329             imageinfo->nWidth = Get16m(Data+5);
    330             imageinfo->format = GetYUVformat(Data);
    331             switch (imageinfo->format) {
    332             case OMX_COLOR_FormatYUV420PackedPlanar:
    333                 printf("APP:: Image chroma format is OMX_COLOR_FormatYUV420PackedPlanar\n");
    334                 break;
    335             case OMX_COLOR_FormatYUV411Planar:
    336                 printf("APP:: Image chroma format is OMX_COLOR_FormatYUV411Planar\n");
    337                 break;
    338             case OMX_COLOR_FormatCbYCrY:
    339                 printf("APP:: Image chroma format is OMX_COLOR_FormatYUV422Interleaved\n");
    340                 break;
    341             case OMX_COLOR_FormatYUV444Interleaved:
    342                  printf("APP:: Image chroma format is OMX_COLOR_FormatYUV444Interleaved\n");
    343                  break;
    344             case OMX_COLOR_FormatL8:
    345                 printf("APP:: Image chroma format is OMX_COLOR_FormatL8 \n");
    346                 break;
    347             default:
    348                  printf("APP:: Cannot find Image chroma format \n");
    349                  imageinfo->format = OMX_COLOR_FormatUnused;
    350                  break;
    351             }
    352             printf("APP:: Image Width x Height = %u * %u\n", Get16m(Data+5), Get16m(Data+3)  );
    353             /*
    354             PRINT("JPEG image is %uw * %uh,\n", Get16m(Data+3), Get16m(Data+5)  );
    355 
    356             if ( *(Data+9)==0x41 )  {
    357                 PRINT("THIS IS A YUV 411 ENCODED IMAGE \n" );
    358                 imageinfo->format= 1;
    359             }
    360             */
    361 
    362             if ( Data != NULL ) {
    363                 free(Data);
    364                 Data=NULL;
    365             }
    366             break;
    367         default:
    368             /* Skip any other sections.*/
    369             break;
    370         }
    371 
    372         if ( Data != NULL ) {
    373             free(Data);
    374             Data=NULL;
    375         }
    376     }
    377 
    378 
    379     return 0;
    380 }
    381 
    382 
    383 
    384 OMX_ERRORTYPE EventHandler(OMX_HANDLETYPE hComponent,
    385                                                OMX_PTR pAppData,
    386                                                OMX_EVENTTYPE eEvent,
    387                                     OMX_U32 nData1,
    388                                                OMX_U32 data2,
    389                                                OMX_PTR pEventData)
    390 {
    391     JPEGD_EVENTPRIVATE MyEvent;
    392 
    393     MyEvent.eEvent = eEvent;
    394     MyEvent.nData1 = nData1;
    395     MyEvent.nData2 = data2;
    396     MyEvent.pAppData = pAppData;
    397     MyEvent.pEventInfo = pEventData;
    398 
    399     PRINT("eEvent = %x, nData1 = %x\n\n", eEvent, (unsigned int)nData1);
    400 
    401     switch ( eEvent ) {
    402         case OMX_EventCmdComplete:
    403             PRINT ("Component State Changed To %ld\n", data2);
    404             break;
    405 
    406         case OMX_EventError:
    407             if ( nData1 != OMX_ErrorNone ){
    408                 printf ("APP:: ErrorNotification received: Error Num %x,\tSeverity = %ld\n", (unsigned int)nData1, data2);
    409                 if ((nData1 == OMX_ErrorHardware) || (nData1 == OMX_ErrorInsufficientResources)){
    410                     printf("\nAPP:: OMX_ErrorHardware. Deinitialization of the component....\n\n");
    411                     break;
    412                 }
    413                 else if(nData1 == OMX_ErrorResourcesPreempted) {
    414                     bPreempted = 1;
    415                     PRINT("APP:: OMX_ErrorResourcesPreempted !\n\n");
    416                 }
    417                 else if(nData1 == OMX_ErrorInvalidState){
    418                     return OMX_ErrorNone;
    419                 }
    420                 else if(nData1 == OMX_ErrorTimeout){
    421                     return OMX_ErrorNone;
    422                 }
    423                 else {
    424                     DEINIT_FLAG = 1;
    425                 }
    426             }
    427             break;
    428 
    429         case OMX_EventResourcesAcquired:
    430             bPreempted = 0;
    431             break;
    432         case OMX_EventBufferFlag:
    433             printf("APP:: OMX_EventBufferFlag received\n");
    434             break;
    435         case OMX_EventPortSettingsChanged:
    436         case OMX_EventMax:
    437         case OMX_EventMark:
    438             break;
    439 
    440         default:
    441             break;
    442     }
    443 
    444     write(Event_Pipe[1], &MyEvent, sizeof(JPEGD_EVENTPRIVATE));
    445 
    446     return OMX_ErrorNone;
    447 }
    448 
    449 
    450 
    451 void FillBufferDone (OMX_HANDLETYPE hComponent,
    452                      OMX_PTR ptr,
    453                      OMX_BUFFERHEADERTYPE* pBuffHead)
    454 {
    455     PRINT("OutBufHeader %p, pBuffer = %p\n", pBuffHead, pBuffHead->pBuffer);
    456     write(OpBuf_Pipe[1], &pBuffHead, sizeof(pBuffHead));
    457     /*	if (eError == -1) {
    458        PRINT ("Error while writing in OpBuf_pipe from app\n");
    459 
    460     }*/
    461 
    462 }
    463 
    464 
    465 
    466 
    467 void EmptyBufferDone(OMX_HANDLETYPE hComponent,
    468                      OMX_PTR ptr,
    469                      OMX_BUFFERHEADERTYPE* pBuffer)
    470 {
    471     write(IpBuf_Pipe[1], &pBuffer, sizeof(pBuffer));
    472     /*	if (eError == -1) {
    473     	PRINT ("Error while writing in IpBuf_pipe from EmptyBufferDone\n");
    474     }*/
    475 }
    476 
    477 
    478 
    479 #ifdef UNDER_CE
    480 int fill_data (OMX_BUFFERHEADERTYPE *pBuf,
    481                HANDLE fIn, long lBuffUsed)
    482 #else
    483 int fill_data (OMX_BUFFERHEADERTYPE *pBuf,
    484                FILE *fIn, int lBuffUsed)
    485 #endif
    486 {
    487     int nRead;
    488 
    489     PRINT(" checking buf address %x\n", (unsigned int)pBuf->pBuffer);
    490 
    491 #ifdef UNDER_CE
    492     lSize = GetFileSize(fIn, NULL );
    493     SetFilePointer(fIn, 0, NULL, FILE_BEGIN);
    494 #else
    495     //fseek (fIn , 0 , SEEK_END);
    496     //lSize = ftell (fIn);
    497     //rewind (fIn);
    498 #endif
    499 
    500 #ifdef UNDER_CE
    501     ReadFile(fIn, pBuf->pBuffer, lBuffUsed, &nRead, NULL);
    502 #else
    503     nRead = fread(pBuf->pBuffer,1, lBuffUsed, fIn);
    504 #endif
    505 
    506     PRINT ("printing lsize %d \n", (int) lBuffUsed);
    507     PRINT( "Read %d bytes from file\n", nRead);
    508 
    509     pBuf->nFilledLen = nRead;
    510     return nRead;
    511 }
    512 /* This method will wait for the component to get to the event
    513  * specified by the DesiredEvent input. */
    514 static OMX_ERRORTYPE WaitForEvent_JPEG(OMX_HANDLETYPE* pHandle,
    515                                   OMX_EVENTTYPE DesiredEvent,
    516                                   OMX_U32 nFDmax,
    517                                   OMX_STATETYPE DesiredState)
    518 {
    519     OMX_ERRORTYPE error = OMX_ErrorNone;
    520     OMX_STATETYPE CurrentState;
    521     OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle;
    522     int nRetval;
    523     sigset_t set;
    524 
    525     while(1) {
    526 
    527         error = pComponent->GetState(pHandle, &CurrentState);
    528         if(error || CurrentState == DesiredState) {
    529             break;
    530         }
    531 
    532         fd_set rfds;
    533         FD_ZERO(&rfds);
    534         FD_SET(Event_Pipe[0], &rfds);
    535         sigemptyset(&set);
    536         sigaddset(&set,SIGALRM);
    537 
    538         nRetval = pselect(nFDmax+1, &rfds, NULL, NULL, NULL, &set);
    539 
    540         if ( nRetval == -1 ) {
    541 #ifndef UNDER_CE
    542             perror("select()");
    543 #endif
    544             fprintf (stderr, " : Error \n");
    545             break;
    546         }
    547 
    548         if ( nRetval == 0 ) {
    549             PRINT("Waiting: Desired Event = %x, Desired State = %x \n",DesiredEvent, DesiredState);
    550         }
    551 
    552         if ( FD_ISSET(Event_Pipe[0], &rfds)) {
    553 
    554             JPEGD_EVENTPRIVATE EventPrivate;
    555             read(Event_Pipe[0], &EventPrivate, sizeof(JPEGD_EVENTPRIVATE));
    556 
    557             if (EventPrivate.eEvent == DesiredEvent &&
    558                 EventPrivate.nData1 == OMX_CommandStateSet &&
    559                 EventPrivate.nData2 == DesiredState) {
    560                 PRINT("OMX_EventCmdComplete :: nData2 = %x\n", (unsigned int)EventPrivate.nData2);
    561                 break;
    562             }
    563             else if (EventPrivate.eEvent == OMX_EventError &&
    564                 EventPrivate.nData1 == OMX_ErrorInsufficientResources &&
    565                 DesiredState == OMX_StateIdle) {
    566                 printf("\n\n Received OMX_EventError: Error = 0x%x,\tSeverity = %ld\n\n", (unsigned int)EventPrivate.nData1, EventPrivate.nData2);
    567                 error = OMX_ErrorInsufficientResources;
    568                 break;
    569             }
    570             else if (EventPrivate.eEvent == OMX_EventError &&
    571                 EventPrivate.nData1 == OMX_ErrorResourcesLost &&
    572                 DesiredState == OMX_StateLoaded) {
    573                 printf("\n\n Received OMX_EventError: Error = 0x%x,\tSeverity = %ld\n\n", (unsigned int)EventPrivate.nData1, EventPrivate.nData2);
    574                 break;
    575             }
    576         }
    577 
    578     }
    579 
    580     PRINT("Exit from Wait For Event function JPEGD\n");
    581     return error;
    582 }
    583 
    584 
    585 
    586 #ifdef UNDER_CE
    587 int _tmain(int argc, TCHAR **argv)
    588 #else
    589 int main(int argc, char** argv)
    590 #endif
    591 {
    592 
    593     OMX_HANDLETYPE pHandle = NULL;
    594     OMX_U32 AppData = 100;
    595     OMX_CALLBACKTYPE JPEGCaBa = {   (void *)EventHandler,
    596                                                             (void*) EmptyBufferDone,
    597                                                             (void*)FillBufferDone};
    598 
    599     OMX_ERRORTYPE eError = OMX_ErrorNone;
    600     OMX_BOOL bError = OMX_FALSE;
    601     int nRetval;
    602     int nWidth;
    603     int nHeight;
    604     /*int nFramesent= 0;*/
    605     long lBuffused;
    606     int nOutformat;
    607     int nResizeMode;
    608     int nIndex1;
    609     int nIndex2;
    610     OMX_U32 nMCURow = 0;
    611     OMX_U32 nXOrg = 0;         /*Sectional decoding: X origin*/
    612     OMX_U32 nYOrg = 0;         /*Sectional decoding: Y origin*/
    613     OMX_U32 nXLength = 0;      /*Sectional decoding: X lenght*/
    614     OMX_U32 nYLength = 0;    /*Sectional decoding: Y lenght*/
    615     OMX_U32 i = 0;      /*Temporary counter*/
    616 
    617     IMAGE_INFO* imageinfo = NULL;
    618     OMX_PORT_PARAM_TYPE* pPortParamType = NULL;
    619     OMX_PARAM_PORTDEFINITIONTYPE* pParamPortDef = NULL;
    620     OMX_PARAM_PORTDEFINITIONTYPE* pInPortDef = NULL;
    621     OMX_PARAM_PORTDEFINITIONTYPE* pOutPortDef = NULL;
    622     OMX_CONFIG_SCALEFACTORTYPE* pScaleFactor = NULL;
    623     OMX_PORT_PARAM_TYPE* pPortType = NULL;
    624     OMX_CUSTOM_IMAGE_DECODE_SECTION* pSectionDecode = NULL;
    625     OMX_CUSTOM_IMAGE_DECODE_SUBREGION* pSubRegionDecode = NULL;
    626 	OMX_CUSTOM_RESOLUTION *pMaxResolution = NULL;
    627 
    628 #ifdef UNDER_CE
    629     TCHAR* szInFile = NULL;
    630     TCHAR* szOutFile = NULL;
    631     HANDLE fIn = NULL;
    632     HANDLE fOut = NULL;
    633     DWORD dwWritten;
    634 #else
    635     char* szInFile = NULL;
    636     char* szOutFile = NULL;
    637     FILE* fIn = NULL;
    638     FILE* fOut = NULL;
    639 #endif
    640 
    641     int nFramesDecoded = 0;
    642     double t1 = 0;
    643     double t2 = 0;
    644     /*int nCountstarted = 0;*/
    645     OMX_S32 nPostProcCompId = 200;
    646     /*int nDone = 0;*/
    647     int nExternal= 0;
    648     OMX_U8 * pTemp;
    649     OMX_BUFFERHEADERTYPE* pInBuffHead[NUM_OF_BUFFERS];
    650     OMX_BUFFERHEADERTYPE* pOutBuffHead[NUM_OF_BUFFERS];
    651     OMX_U8* pInBuffer = NULL;
    652     OMX_U8* pOutBuffer = NULL;
    653     int nFdmax;
    654     int nRead;
    655     OMX_INDEXTYPE nCustomIndex = OMX_IndexMax;
    656     OMX_U16 nBufferHdrSend = 0;
    657     OMX_U16 nSampleFactor = 32;
    658     OMX_U8 nNUM_OF_DECODING_BUFFERS = 1;
    659     sigset_t set;
    660     OMX_BOOL bWaitForLoaded = OMX_FALSE;
    661     int  nMaxFrames = 1;
    662     OMX_BUFFERHEADERTYPE* pInBufferHdr;
    663     struct timeval tv1, tv2;
    664 
    665     /* validate command line args */
    666     if ( (argc < 5) || ((argc > 7) && (argc < 11)) ||(argc > 11)) {
    667 #ifdef UNDER_CE
    668         printf("usage: %S <input.jpg> <output.yuv> <nOutformat-1:420 4:422 9:RGB16 10: RGB24 11:RGB32 12:BGR32> <nResizeMode> <nRepeat> <nSections> <nXOrigin> <nYOrigin> <nXLenght> <nYLenght>\n",
    669         argv[0]);
    670 #else
    671         printf("usage: %s <input.jpg> <output.yuv> <nOutformat-1:Original(default)  4:422 9:RGB16 10: RGB24 11:RGB32 12:BGR32> <nResizeMode> <nRepeat> <nSections> <nXOrigin> <nYOrigin> <nXLenght> <nYLenght>\n",
    672         argv[0]);
    673 #endif
    674         printf("nResizeMode 100:No Rescaling\nnResizeMode 50:Rescale to 50 percent of original size \n");
    675         printf("nResizeMode 25:Rescale to 25 percent of original size\nnResizeMode 12:Rescale to 12.5 percent of original size\n\n");
    676         printf("Example ./JpegTestCommon patterns/shrek.jpg shrek.yuv 1 50 \n");
    677         printf("Input: 720x480. Output: YUV420, 360x240\n\n");
    678         printf("nRepeat: It is an optional parameter. Range is 0 to 100. Repeatedly encode the same frame 'nRepeat+1' times");
    679         printf("Example ./JpegTestCommon patterns/shrek.jpg shrek.yuv 1 50 0\n");
    680         printf("Example ./JpegTestCommon patterns/shrek.jpg shrek.yuv 1 50 9\n");
    681         printf("Output: YUV420, 360x240\n\n");
    682         printf("<nSections> It's an optional parameter. Values: 0, 1, 2, ...\n");
    683         printf("Example ./JpegTestCommon patterns/shrek.jpg shrek.yuv 4 50 0 1\n");
    684         printf("Output: YUV422, 360x240\n\n");
    685         printf("SubRegion decode:\n");
    686         printf("<nXOrigin> <nYOrigin> <nXLenght> <nYLenght>\n");
    687         printf("Example ./JpegTestCommon patterns/shrek.jpg shrek.yuv 1 100 0 0 192 48 288 256\n");
    688         printf("Output: YUV420, 288x256\n\n");
    689         return -1;
    690     }
    691 
    692 
    693     szInFile = argv[1];
    694     szOutFile = argv[2];
    695 #ifdef UNDER_CE
    696     nOutformat = _wtoi(argv[3]);
    697     nResizeMode = _wtoi(argv[4]);
    698 #else
    699     nOutformat = atoi(argv[3]);
    700     nResizeMode = atoi(argv[4]);
    701 #endif
    702 
    703     if (argc >= 6){
    704         nMaxFrames = atoi(argv[5]) + 1;
    705     }
    706 
    707     if(argc >= 7){
    708         nMCURow = atoi(argv[6]);
    709         if(nOutformat >= 9){
    710             printf("\nAPP: WARNING Sectional decoding is not supported for RGB color formats\n\n");
    711             nMCURow = 0;
    712         }
    713         if(nMCURow){
    714             nNUM_OF_DECODING_BUFFERS = NUM_OF_BUFFERS;
    715         }
    716         else{
    717             nNUM_OF_DECODING_BUFFERS = 1;
    718         }
    719     }
    720 
    721     if(argc > 7){
    722         nXOrg = atoi(argv[7]);
    723         nYOrg = atoi(argv[8]);
    724         nXLength = atoi(argv[9]);
    725         nYLength = atoi(argv[10]);
    726     }
    727 
    728     imageinfo = (IMAGE_INFO *)malloc (sizeof (IMAGE_INFO ) );
    729     pPortParamType = (OMX_PORT_PARAM_TYPE*)malloc(sizeof(OMX_PORT_PARAM_TYPE));
    730     pParamPortDef = (OMX_PARAM_PORTDEFINITIONTYPE*)malloc(sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
    731     pInPortDef = (OMX_PARAM_PORTDEFINITIONTYPE*)malloc(sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
    732     pOutPortDef = (OMX_PARAM_PORTDEFINITIONTYPE*)malloc(sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
    733     pScaleFactor = (OMX_CONFIG_SCALEFACTORTYPE*)malloc(sizeof(OMX_CONFIG_SCALEFACTORTYPE));
    734     pPortType = (OMX_PORT_PARAM_TYPE*)malloc(sizeof(OMX_PORT_PARAM_TYPE));
    735     pSectionDecode = (OMX_CUSTOM_IMAGE_DECODE_SECTION*)malloc(sizeof(OMX_CUSTOM_IMAGE_DECODE_SECTION));
    736     pSubRegionDecode = (OMX_CUSTOM_IMAGE_DECODE_SUBREGION*)malloc(sizeof(OMX_CUSTOM_IMAGE_DECODE_SUBREGION));
    737 	pMaxResolution = (OMX_CUSTOM_RESOLUTION *)malloc(sizeof(OMX_CUSTOM_RESOLUTION ));
    738 
    739 
    740     printf("\n------------------------------------------------\n");
    741     printf("OMX JPEG Decoder Test App built on " __DATE__ ":" __TIME__ "\n");
    742     printf("------------------------------------------------\n");
    743     printf("\nAPP:: Output File Name is %s \n", szOutFile);
    744 
    745     /* Create a pipe used to queue data from the callback. */
    746     nRetval = pipe(IpBuf_Pipe);
    747     PRINT("Pipe InBuf_Pipe just created\n");
    748     if ( nRetval != 0 )	{
    749         fprintf(stderr, "Error:Fill Data Pipe failed to open\n");
    750         goto EXIT;
    751     }
    752 
    753     PRINT("Pipe OpBuf_Pipe just created\n");
    754     nRetval = pipe(OpBuf_Pipe);
    755     if ( nRetval != 0 ) {
    756         fprintf(stderr, "Error:Empty Data Pipe failed to open\n");
    757         goto EXIT;
    758     }
    759 
    760     PRINT("Pipe Event_Pipe just created\n");
    761     nRetval = pipe(Event_Pipe);
    762     if ( nRetval != 0 ) {
    763         fprintf(stderr, "Error:Empty Data Pipe failed to open\n");
    764         goto EXIT;
    765     }
    766 
    767     /* save off the "max" of the handles for the selct statement */
    768     nFdmax = maxint(IpBuf_Pipe[0], OpBuf_Pipe[0]);
    769     nFdmax = maxint(Event_Pipe[0], nFdmax);
    770 
    771 #ifdef DSP_MMU_FAULT_HANDLING
    772     /* LOAD BASE IMAGE FIRST TIME */
    773     LoadBaseImage();
    774 #endif
    775 
    776     eError = TIOMX_Init();
    777     if ( eError != OMX_ErrorNone ) {
    778         PRINT("%d :: Error returned by TIOMX_Init()\n",__LINE__);
    779         goto EXIT;
    780     }
    781 
    782     /*--------------------------------------------------------------------------------
    783     *
    784     * Open the file of data to be rendered.  Since this is a just sample
    785     * application, the data is "rendered" to a test mixer.  So, the test
    786     * file better contain data that can be printed to the terminal w/o
    787     * problems or you will not be a happy [JPEGTest.c] fill_data():473: *** Read 997386 bytes from file
    788     **/
    789     PRINT("Opening input & output file\n");
    790 #ifdef UNDER_CE
    791     fOut = CreateFile(szOutFile, GENERIC_WRITE, 0,
    792     NULL,CREATE_ALWAYS, 0, NULL);
    793     if (INVALID_HANDLE_VALUE == fOut)
    794     {
    795         PRINT("Error:  failed to create the output file %S\n",
    796         szOutFile);
    797         goto EXIT;
    798     }
    799 
    800     fIn = CreateFile(szInFile, GENERIC_READ, 0,
    801     NULL,OPEN_EXISTING, 0, NULL);
    802     if (INVALID_HANDLE_VALUE == fIn) {
    803         PRINT("Error:  failed to open the file %s for readonly\n" \
    804         "access\n", szInFile);
    805         goto EXIT;
    806     }
    807 
    808 #else
    809 
    810     fIn = fopen(szInFile, "r");
    811     if ( fIn == NULL ) {
    812         printf("\nError: failed to open the file <%s> for reading\n",
    813         szInFile);
    814         goto EXIT;
    815     }
    816     PRINT("APP:: File %s opened \n" , szInFile);
    817 #endif
    818 
    819     lBuffused = ReadJpegSections(fIn , imageinfo);
    820 
    821     if (lBuffused == 0) {
    822         printf("The file size is 0. Maybe the format of the file is not correct\n");
    823         goto EXIT;
    824     }
    825 
    826     /* Load the JPEGDecoder Component */
    827 
    828     PRINT("Calling TIOMX_GetHandle\n");
    829     eError = TIOMX_GetHandle(&pHandle,StrJpegDecoder, (void *)&AppData, &JPEGCaBa);
    830     if ( (eError != OMX_ErrorNone) ||  (pHandle == NULL) ) {
    831         fprintf (stderr,"Error in Get Handle function\n");
    832         goto EXIT;
    833     }
    834 
    835     eError = OMX_GetParameter(pHandle, OMX_IndexParamImageInit, pPortType);
    836     if ( eError != OMX_ErrorNone ) {
    837         goto EXIT;
    838     }
    839 
    840 
    841     nIndex1 = pPortType->nStartPortNumber;
    842     nIndex2 = nIndex1 + 1;
    843     nHeight = imageinfo->nHeight;
    844     nWidth = imageinfo->nWidth;
    845 
    846     FixFrameSize(imageinfo);
    847 
    848     pScaleFactor->xWidth = (int)nResizeMode;
    849     pScaleFactor->xHeight = (int)nResizeMode;
    850 
    851     eError = OMX_SetConfig (pHandle, OMX_IndexConfigCommonScale, pScaleFactor);
    852     if ( eError != OMX_ErrorNone ) {
    853         goto EXIT;
    854     }
    855 
    856     eError = OMX_GetParameter (pHandle, OMX_IndexParamPortDefinition, pInPortDef);
    857     if ( eError != OMX_ErrorNone ) {
    858         eError = OMX_ErrorBadParameter;
    859         goto EXIT;
    860     }
    861 
    862     if (pInPortDef->eDir == nIndex1 ) {
    863         pInPortDef->nPortIndex = nIndex1;
    864     }
    865     else {
    866         pInPortDef->nPortIndex = nIndex2;
    867     }
    868 
    869     /* Set the component's OMX_PARAM_PORTDEFINITIONTYPE structure (input) */
    870     /**********************************************************************/
    871 
    872     pInPortDef->nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
    873     pInPortDef->nVersion.s.nVersionMajor = 0x1;
    874     pInPortDef->nVersion.s.nVersionMinor = 0x0;
    875     pInPortDef->nVersion.s.nRevision = 0x0;
    876     pInPortDef->nVersion.s.nStep = 0x0;
    877     pInPortDef->nPortIndex = 0x0;
    878     pInPortDef->eDir = OMX_DirInput;
    879     pInPortDef->nBufferCountActual =1;
    880     pInPortDef->nBufferCountMin = 1;
    881     pInPortDef->bEnabled = OMX_TRUE;
    882     pInPortDef->bPopulated = OMX_FALSE;
    883     pInPortDef->eDomain = OMX_PortDomainImage;
    884     pInPortDef->format.image.cMIMEType = "JPEGDEC";
    885     pInPortDef->format.image.pNativeRender = NULL;
    886     pInPortDef->format.image.nFrameWidth = imageinfo->nWidth;
    887     pInPortDef->format.image.nFrameHeight = imageinfo->nHeight;
    888     pInPortDef->format.image.nStride = -1;
    889     pInPortDef->format.image.nSliceHeight = -1;
    890     pInPortDef->format.image.bFlagErrorConcealment = OMX_FALSE;
    891     pInPortDef->format.image.eColorFormat =OMX_COLOR_FormatCbYCrY ;
    892     pInPortDef->format.image.eCompressionFormat = OMX_IMAGE_CodingJPEG;
    893     pInPortDef->nBufferSize = lBuffused;
    894 
    895 
    896     if (imageinfo->format == OMX_COLOR_FormatYCbYCr ||
    897         imageinfo->format == OMX_COLOR_FormatYUV444Interleaved ||
    898         imageinfo->format == OMX_COLOR_FormatUnused) {
    899         pInPortDef->format.image.eColorFormat = OMX_COLOR_FormatCbYCrY;
    900     }
    901     else {
    902         pInPortDef->format.image.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
    903     }
    904 
    905     PRINT("Calling OMX_SetParameter\n");
    906 
    907 	/* Set max width & height value*/
    908     eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.decoder.Param.SetMaxResolution", (OMX_INDEXTYPE*)&nCustomIndex);
    909     if ( eError != OMX_ErrorNone ) {
    910         printf ("JPEGDec test:: %d:error= %x\n", __LINE__, eError);
    911         goto EXIT;
    912     }
    913 
    914 	pMaxResolution->nWidth = imageinfo->nWidth;
    915 	pMaxResolution->nHeight = imageinfo->nHeight;
    916 
    917 	eError = OMX_SetParameter (pHandle, nCustomIndex, pMaxResolution);
    918     if ( eError != OMX_ErrorNone ) {
    919         printf ("JPEGDec test:: %d:error= %x\n", __LINE__, eError);
    920         goto EXIT;
    921     }
    922 
    923     eError = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, pInPortDef);
    924     if ( eError != OMX_ErrorNone ) {
    925         eError = OMX_ErrorBadParameter;
    926         goto EXIT;
    927     }
    928 
    929     memset(pOutPortDef, 0x0, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
    930     eError = OMX_GetParameter (pHandle, OMX_IndexParamPortDefinition, pOutPortDef);
    931     if ( eError != OMX_ErrorNone ) {
    932         eError = OMX_ErrorBadParameter;
    933         goto EXIT;
    934     }
    935 
    936     if (pOutPortDef->eDir == nIndex1 ) {
    937         pOutPortDef->nPortIndex = nIndex1;
    938     }
    939     else {
    940         pOutPortDef->nPortIndex = nIndex2;
    941     }
    942 
    943     /*****************************************************************/
    944     /* Set the component's OMX_PARAM_PORTDEFINITIONTYPE structure (Output) */
    945     /**********************************************************************/
    946     pOutPortDef->nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
    947     pOutPortDef->nVersion.s.nVersionMajor = 0x1;
    948     pOutPortDef->nVersion.s.nVersionMinor = 0x0;
    949     pOutPortDef->nVersion.s.nRevision = 0x0;
    950     pOutPortDef->nVersion.s.nStep = 0x0;
    951     pOutPortDef->nPortIndex = 0x1;
    952     pOutPortDef->eDir = OMX_DirOutput;
    953     pOutPortDef->nBufferCountActual = nNUM_OF_DECODING_BUFFERS;
    954     pOutPortDef->nBufferCountMin = 1;
    955     pOutPortDef->bEnabled = OMX_TRUE;
    956     pOutPortDef->bPopulated = OMX_FALSE;
    957     pOutPortDef->eDomain = OMX_PortDomainImage;
    958 
    959     /* OMX_IMAGE_PORTDEFINITION values for Output port */
    960     pOutPortDef->format.image.cMIMEType = "JPEGDEC";
    961     pOutPortDef->format.image.pNativeRender = NULL;
    962     pOutPortDef->format.image.nFrameWidth = imageinfo->nWidth;
    963     pOutPortDef->format.image.nFrameHeight = imageinfo->nHeight;
    964     pOutPortDef->format.image.nStride = -1;
    965     pOutPortDef->format.image.nSliceHeight = -1;
    966     pOutPortDef->format.image.bFlagErrorConcealment = OMX_FALSE;
    967     pOutPortDef->format.image.eCompressionFormat = OMX_IMAGE_CodingUnused;
    968 
    969     PRINT("nWidth and nHeight = %d and %d\n",nWidth,nHeight);
    970     if ( nOutformat == 4 ) {
    971         pOutPortDef->format.image.eColorFormat = OMX_COLOR_FormatCbYCrY;
    972     }
    973     else if (nOutformat == 9) {
    974         pOutPortDef->format.image.eColorFormat = OMX_COLOR_Format16bitRGB565;
    975         PRINT("color format is %d\n", pOutPortDef->format.image.eColorFormat);
    976     }
    977     else if (nOutformat == 10) {
    978         pOutPortDef->format.image.eColorFormat = OMX_COLOR_Format24bitRGB888;
    979     }
    980     else if (nOutformat == 11) {
    981         pOutPortDef->format.image.eColorFormat = OMX_COLOR_Format32bitARGB8888;
    982     }
    983     else if (nOutformat == 12) {
    984         pOutPortDef->format.image.eColorFormat = OMX_COLOR_Format32bitBGRA8888;
    985     }
    986     else { /*Set DEFAULT (original) color format*/
    987         pOutPortDef->format.image.eColorFormat = imageinfo->format; /*Setting input original format */
    988 
    989         if(imageinfo->format == OMX_COLOR_Format16bitRGB565 ||
    990                 imageinfo->format == OMX_COLOR_Format24bitRGB888 ||
    991                 imageinfo->format == OMX_COLOR_Format32bitARGB8888 ||
    992                 imageinfo->format == OMX_COLOR_Format32bitBGRA8888 ||
    993                 imageinfo->format == OMX_COLOR_FormatL8){
    994             for(i = 0; i < strlen(szOutFile); i++){
    995                 if(szOutFile[i]=='.'){
    996                     if(szOutFile[i+1]=='y'){
    997                         szOutFile[i+1]='r';
    998                         szOutFile[i+2]='a';
    999                         szOutFile[i+3]='w';
   1000                         szOutFile[i+4]='\0';
   1001                         printf("\n\nAPP::--WARNING:\nIncorrect output file extension. Changing output file name extension--\n");
   1002                         printf("APP:: New file name: %s\n\n\n", szOutFile);
   1003                         break;
   1004                     }
   1005                     break;
   1006                 }
   1007             }
   1008         }
   1009     }
   1010 
   1011     fOut = fopen(szOutFile, "w");
   1012     if ( fOut == NULL ) {
   1013         printf("\nError: failed to open the file <%s> for writing", szOutFile);
   1014         goto EXIT;
   1015     }
   1016 
   1017     if(nResizeMode == 800){
   1018         nWidth *= 8;
   1019         nHeight *= 8;
   1020     }
   1021     else if(nResizeMode == 400){
   1022         nWidth *= 4;
   1023         nHeight *= 4;
   1024     }
   1025     else if(nResizeMode == 200){
   1026         nWidth *= 2;
   1027         nHeight *= 2;
   1028     }
   1029     else if (nResizeMode == 50) {
   1030         nWidth /= 2;
   1031         nHeight /= 2;
   1032     } else if (nResizeMode == 25) {
   1033         nWidth /= 4;
   1034         nHeight /= 4;
   1035     } else if (nResizeMode == 12) {
   1036         nWidth /= 4;
   1037         nHeight /= 4;
   1038     }
   1039 
   1040     if(nMCURow == 0){ /*Full frame decoding*/
   1041         if ( nOutformat == 1 ) { /* Buffer size depends on the Original color format*/
   1042             if (imageinfo->format == OMX_COLOR_FormatYUV420PackedPlanar ||
   1043                 imageinfo->format == OMX_COLOR_FormatYUV411Planar) {
   1044                 pOutPortDef->nBufferSize = ( int )((( nWidth * nHeight) *3 ) /2);
   1045                 }
   1046             else if (imageinfo->format == OMX_COLOR_FormatCbYCrY) {
   1047                 pOutPortDef->nBufferSize =  ( int ) ((nWidth * nHeight) *2);
   1048             }
   1049             else if (imageinfo->format == OMX_COLOR_FormatYUV444Interleaved) {
   1050                     pOutPortDef->nBufferSize =  ( int ) ((nWidth * nHeight) *3);
   1051             }
   1052             else {
   1053                 pOutPortDef->nBufferSize = ( int ) (nWidth * nHeight) * 2;
   1054             }
   1055         }
   1056         else if (nOutformat == 4 || nOutformat == 9) {        /* OMX_COLOR_FormatCbYCrY & OMX_COLOR_Format16bitRGB565*/
   1057             pOutPortDef->nBufferSize =  (int)((nWidth * nHeight) * 2);
   1058         }
   1059         else if (nOutformat == 10) { /* OMX_COLOR_Format24bitRGB888 */
   1060            pOutPortDef->nBufferSize = (int) ((nWidth * nHeight) * 3);
   1061         }
   1062         else if (nOutformat == 11 || nOutformat == 12) { /* OMX_COLOR_Format32bitARGB8888 & OMX_COLOR_Format32bitBGRA8888*/
   1063            pOutPortDef->nBufferSize = (int) ((nWidth * nHeight) * 4);
   1064         }
   1065         else {
   1066             eError = OMX_ErrorBadParameter;
   1067             goto EXIT;
   1068         }
   1069     }
   1070     else{ /*Slice Decoding*/
   1071         switch(imageinfo->format){
   1072             case OMX_COLOR_FormatYUV420PackedPlanar:
   1073                 nSampleFactor = 16;
   1074                 break;
   1075             case OMX_COLOR_FormatYUV411Planar:
   1076             case OMX_COLOR_FormatCbYCrY:
   1077             case OMX_COLOR_FormatYUV444Interleaved:
   1078                 nSampleFactor = 8;
   1079                 break;
   1080             default:
   1081                 nSampleFactor = 8;
   1082                 break;
   1083         }
   1084 
   1085 
   1086         if(nResizeMode == 12){ /* setting to 13 instead of 12.5 */
   1087             nResizeMode = 13;
   1088         }
   1089 
   1090         if ( nOutformat == 1 ) { /* Buffer size depends on the Original color format*/
   1091             if (imageinfo->format == OMX_COLOR_FormatYUV420PackedPlanar ||
   1092                     imageinfo->format == OMX_COLOR_FormatYUV411Planar) {
   1093                 pOutPortDef->nBufferSize = (OMX_U32)(((nWidth*3)/2)*(nSampleFactor*nMCURow*nResizeMode)/100);
   1094 
   1095             }
   1096             else if (imageinfo->format == OMX_COLOR_FormatCbYCrY){
   1097                     pOutPortDef->nBufferSize =  (OMX_U32) ( (nWidth * 2) * (nSampleFactor * nMCURow*nResizeMode)/100);
   1098             }
   1099             else if (imageinfo->format == OMX_COLOR_FormatYUV444Interleaved) {
   1100                 pOutPortDef->nBufferSize =  (OMX_U32) ( (nWidth * 3) * (nSampleFactor * nMCURow*nResizeMode)/100);
   1101             }
   1102             else{
   1103                 pOutPortDef->nBufferSize =  (OMX_U32) ( (nWidth) * (nSampleFactor * nMCURow*nResizeMode)/100);
   1104             }
   1105         }
   1106         else if(nOutformat == 4){ /*YUV422 ILE */
   1107             pOutPortDef->nBufferSize = (OMX_U32)((nWidth * 2) * (nSampleFactor * nMCURow * nResizeMode)/100);
   1108         }
   1109     }
   1110 
   1111     printf("APP:: Output buffer size is %ld\n", pOutPortDef->nBufferSize);
   1112     printf("APP:: Output color format is ");
   1113     if (nOutformat == 4){
   1114         printf("OMX_COLOR_FormatCbYCrY (YUV422ILE)\n");
   1115     }
   1116     else if (nOutformat == 9){
   1117         printf("OMX_COLOR_Format16bitRGB565 (RGB16)\n");
   1118     }
   1119     else if (nOutformat == 10){
   1120         printf("OMX_COLOR_Format24bitRGB888 (BGR24)\n");
   1121     }
   1122     else if (nOutformat == 11){
   1123         printf("OMX_COLOR_Format32bitARGB8888 (ARGB32)\n");
   1124 	}
   1125     else if (nOutformat == 12){
   1126         printf("OMX_COLOR_Format32bitBGRA8888 (BGRA32)\n");
   1127     }
   1128     else{
   1129          if (imageinfo->format == OMX_COLOR_FormatYUV420PackedPlanar){
   1130             printf("OMX_COLOR_FormatYUV420PackedPlanar\n");
   1131          }
   1132          else if (imageinfo->format == OMX_COLOR_FormatYUV411Planar) {
   1133             printf("OMX_COLOR_FormatYUV411Planar\n");
   1134         }
   1135         else if (imageinfo->format == OMX_COLOR_FormatCbYCrY){
   1136                 printf("OMX_COLOR_FormatCbYCrY (YUV422ILE)\n");
   1137         }
   1138         else if (imageinfo->format == OMX_COLOR_FormatYUV444Interleaved) {
   1139             printf("OMX_COLOR_FormatYUV444Interleaved\n");
   1140         }
   1141         else if (imageinfo->format == OMX_COLOR_FormatL8){
   1142             printf("OMX_COLOR_FormatL8 (Gray 8)\n");
   1143         }
   1144         else{
   1145             printf("Unknow format\n");
   1146         }
   1147     }
   1148 
   1149     eError = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, pOutPortDef);
   1150     if ( eError != OMX_ErrorNone ) {
   1151         eError = OMX_ErrorBadParameter;
   1152         goto EXIT;
   1153     }
   1154 
   1155     eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.decoder.Config.ProgressiveFactor", (OMX_INDEXTYPE*)&nCustomIndex);
   1156     if ( eError != OMX_ErrorNone ) {
   1157         printf ("JPEGDec test:: %d:error= %x\n", __LINE__, eError);
   1158         goto EXIT;
   1159     }
   1160     eError = OMX_SetConfig (pHandle, nCustomIndex, &(imageinfo->nProgressive));
   1161     if ( eError != OMX_ErrorNone ) {
   1162         printf ("JPEGDec test:: %d:error= %x\n", __LINE__, eError);
   1163         goto EXIT;
   1164     }
   1165 
   1166     eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.decoder.Config.OutputColorFormat", (OMX_INDEXTYPE*)&nCustomIndex);
   1167     if ( eError != OMX_ErrorNone ) {
   1168         printf ("JPEGDec test:: %d:error= %x\n", __LINE__, eError);
   1169         goto EXIT;
   1170     }
   1171 
   1172     eError = OMX_SetConfig (pHandle, nCustomIndex, &(pOutPortDef->format.image.eColorFormat));
   1173     if ( eError != OMX_ErrorNone ) {
   1174         printf ("JPEGDec test:: %d:error= %x\n", __LINE__, eError);
   1175         goto EXIT;
   1176     }
   1177 
   1178     if(nMCURow){
   1179         eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.decoder.Param.SectionDecode", (OMX_INDEXTYPE*)&nCustomIndex);
   1180         if ( eError != OMX_ErrorNone ) {
   1181             printf ("JPEGDec test:: %d:error= %x\n", __LINE__, eError);
   1182             goto EXIT;
   1183         }
   1184         eError = OMX_GetParameter(pHandle, nCustomIndex, pSectionDecode);
   1185         if ( eError != OMX_ErrorNone ) {
   1186             printf ("JPEGDec test:: %d:error= %x\n", __LINE__, eError);
   1187             goto EXIT;
   1188         }
   1189         pSectionDecode->nMCURow = nMCURow; /*number of slices*/
   1190         pSectionDecode->bSectionsInput = OMX_FALSE; /*Should be false at input port. Unsupported slice dec at input port at the moment*/
   1191         pSectionDecode->bSectionsOutput = OMX_TRUE; /*Should be true if slice at output port*/
   1192         eError = OMX_SetParameter(pHandle, nCustomIndex, pSectionDecode);
   1193         if ( eError != OMX_ErrorNone ) {
   1194             printf ("JPEGDec test:: %d:error= %x\n", __LINE__, eError);
   1195             goto EXIT;
   1196         }
   1197     }
   1198 
   1199     if(nXOrg || nYOrg || nXLength || nYLength){
   1200         eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.decoder.Param.SubRegionDecode", (OMX_INDEXTYPE*)&nCustomIndex);
   1201         if ( eError != OMX_ErrorNone ) {
   1202             printf ("JPEGDec test:: %d:error= %x\n", __LINE__, eError);
   1203             goto EXIT;
   1204         }
   1205 
   1206         eError = OMX_GetParameter(pHandle, nCustomIndex, pSubRegionDecode);
   1207         if ( eError != OMX_ErrorNone ) {
   1208             printf ("JPEGDec test:: %d:error= %x\n", __LINE__, eError);
   1209             goto EXIT;
   1210         }
   1211 
   1212         pSubRegionDecode->nXOrg = nXOrg;
   1213         pSubRegionDecode->nYOrg = nYOrg;
   1214         pSubRegionDecode->nXLength = nXLength;
   1215         pSubRegionDecode->nYLength = nYLength;
   1216         eError = OMX_SetParameter(pHandle, nCustomIndex, pSubRegionDecode);
   1217         if ( eError != OMX_ErrorNone ) {
   1218             printf ("JPEGDec test:: %d:error= %x\n", __LINE__, eError);
   1219             goto EXIT;
   1220         }
   1221         PRINT("pSubRegionDecode set\n");
   1222     }
   1223 
   1224     /********* EXTERNAL BUFFER ****************/
   1225 
   1226     if ( nExternal == 1 ) {
   1227         pTemp=(OMX_U8*)malloc(pInPortDef->nBufferSize+256);
   1228         pTemp+=128;
   1229         pInBuffer = pTemp;
   1230         pTemp=(OMX_U8*)malloc(pOutPortDef->nBufferSize+256);
   1231         pTemp+=128;
   1232         pOutBuffer = pTemp;
   1233 
   1234         eError = OMX_UseBuffer(pHandle, &pInBuffHead[0], nIndex1, pInBuffHead, pInPortDef->nBufferSize, pInBuffer);
   1235         for(nBufferHdrSend = 0; (nBufferHdrSend < nNUM_OF_DECODING_BUFFERS); nBufferHdrSend++){
   1236             eError = OMX_UseBuffer(pHandle, &pOutBuffHead[nBufferHdrSend], nIndex2 , pOutBuffHead, pOutPortDef->nBufferSize, pOutBuffer);
   1237         }
   1238     }
   1239     else {
   1240 
   1241         OMX_AllocateBuffer(pHandle, &pInBuffHead[0], nIndex1, (void *)&nPostProcCompId, pInPortDef->nBufferSize);
   1242 
   1243         for(nBufferHdrSend = 0; (nBufferHdrSend < nNUM_OF_DECODING_BUFFERS); nBufferHdrSend++){
   1244             OMX_AllocateBuffer(pHandle, &pOutBuffHead[nBufferHdrSend], nIndex2, (void *)&nPostProcCompId, pOutPortDef->nBufferSize);
   1245             PRINT("APP:: AllocateBuff Hdr = %p ; pBuffer = %p\n", pOutBuffHead[nBufferHdrSend], pOutBuffHead[nBufferHdrSend]->pBuffer);
   1246        }
   1247 
   1248     }
   1249 
   1250     gettimeofday(&tv1, NULL);
   1251     eError = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateIdle ,NULL);
   1252     if ( eError != OMX_ErrorNone ) {
   1253         fprintf (stderr,"Error from SendCommand-Idle(Init) State function\n");
   1254         goto EXIT;
   1255     }
   1256 
   1257     WaitForEvent_JPEG(pHandle, OMX_EventCmdComplete, nFdmax, OMX_StateIdle);
   1258 
   1259     PRINT("Transitioned to IDLE State\n");
   1260     /*PRINT("from loaded to idle: %ld %ld %ld %ld\n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec);*/
   1261 
   1262     gettimeofday(&tv1, NULL);
   1263     eError = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateExecuting, NULL);
   1264     if ( eError != OMX_ErrorNone ) {
   1265         fprintf (stderr,"eError from SendCommand-Executing State function\n");
   1266         goto EXIT;
   1267     }
   1268 
   1269     WaitForEvent_JPEG(pHandle, OMX_EventCmdComplete, nFdmax, OMX_StateExecuting);
   1270     gettimeofday(&tv2, NULL);
   1271 
   1272     PRINT("Transitioned to EXECUTE State\n");
   1273     /*PRINT("from idle to exec: %ld %ld %ld %ld\n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec);*/
   1274 
   1275     rewind(fIn);
   1276     nRead = fill_data(pInBuffHead[0], fIn, lBuffused);
   1277 
   1278 #ifndef UNDER_CE
   1279 
   1280     gettimeofday(&tim, NULL);
   1281     t1=tim.tv_sec+(tim.tv_usec/1000000.0);
   1282 #endif
   1283 
   1284     pInBuffHead[0]->nFilledLen = nRead;
   1285     pInBuffHead[0]->nFlags = OMX_BUFFERFLAG_EOS;
   1286 
   1287     OMX_EmptyThisBuffer(pHandle, pInBuffHead[0]);
   1288     DEINIT_FLAG = 0;
   1289 
   1290     if(nMCURow){
   1291         for(nBufferHdrSend = 0; nBufferHdrSend < nNUM_OF_DECODING_BUFFERS; nBufferHdrSend++){
   1292             OMX_FillThisBuffer(pHandle, pOutBuffHead[nBufferHdrSend]);
   1293         }
   1294     }
   1295     else{
   1296         OMX_FillThisBuffer(pHandle, pOutBuffHead[0]);
   1297     }
   1298 
   1299     /** Handle the component's requests for data until we run out of data.  Do this
   1300     * in a way that will allow the UI to continue to run (if there is a UI, which
   1301     * this sample application does NOT have)
   1302     **/
   1303 
   1304     PRINT("\n\n\n*******************************************\n\n\n");
   1305 
   1306     while (DEINIT_FLAG == 0){
   1307 
   1308         if (bPreempted){
   1309             goto DEINIT2;
   1310         }
   1311 
   1312         fd_set rfds;
   1313         FD_ZERO(&rfds);
   1314 
   1315         FD_SET(IpBuf_Pipe[0], &rfds);
   1316         FD_SET(OpBuf_Pipe[0], &rfds);
   1317         FD_SET(Event_Pipe[0], &rfds);
   1318 
   1319         sigemptyset(&set);
   1320         sigaddset(&set,SIGALRM);
   1321         nRetval = pselect(nFdmax+1, &rfds, NULL, NULL, NULL, &set);
   1322         if ( nRetval == -1 ) {
   1323 #ifndef UNDER_CE
   1324             perror("select()");
   1325 #endif
   1326             fprintf (stderr, " : Error \n");
   1327             break;
   1328         }
   1329 
   1330         /**
   1331         * If FD_ISSET then there is data available in the pipe.
   1332         * Read it and get the buffer data out.
   1333         * Then re-fill the buffer and send it back.
   1334         **/
   1335         if ( FD_ISSET(Event_Pipe[0], &rfds)) {
   1336 
   1337             JPEGD_EVENTPRIVATE EventPrivate;
   1338             read(Event_Pipe[0], &EventPrivate, sizeof(JPEGD_EVENTPRIVATE));
   1339             switch(EventPrivate.eEvent) {
   1340 
   1341                 case OMX_EventError:
   1342                     DEINIT_FLAG = OMX_TRUE;
   1343                     bError = OMX_TRUE;
   1344                     printf("APP:: Waiting for OMX_StateInvalid... \n");
   1345                     WaitForEvent_JPEG(pHandle, OMX_EventCmdComplete, nFdmax, OMX_StateInvalid);
   1346                     printf("APP:: At Invalid state.\n");
   1347                     goto EXIT;
   1348                     break;
   1349 
   1350                 case OMX_EventBufferFlag:
   1351                     printf("APP:: Unloading component...\n");
   1352                     break;
   1353 
   1354                 default:
   1355                     printf("APP:: Non-error event rise. Event -> 0x%x\n", EventPrivate.eEvent);
   1356                     break;
   1357             }
   1358         }
   1359 
   1360         if ( FD_ISSET(IpBuf_Pipe[0], &rfds)){
   1361             read(IpBuf_Pipe[0], &pInBufferHdr, sizeof(pInBufferHdr));
   1362 
   1363             if ( (!nMCURow) &&  (nFramesDecoded < nMaxFrames)){
   1364                 pInBuffHead[0]->nFilledLen = nRead;
   1365                 pInBuffHead[0]->nFlags = OMX_BUFFERFLAG_EOS;
   1366                 OMX_EmptyThisBuffer(pHandle, pInBufferHdr);
   1367             }
   1368         }
   1369 
   1370         if ( FD_ISSET(OpBuf_Pipe[0], &rfds) ) {
   1371             OMX_BUFFERHEADERTYPE* pBuf;
   1372 #ifndef UNDER_CE
   1373             gettimeofday(&tim, NULL);
   1374             t2=tim.tv_sec+(tim.tv_usec/1000000.0);
   1375             /*	printf("\n%.6lf seconds elapsed\n", t2-t1);  */
   1376 #endif
   1377             read(OpBuf_Pipe[0], &pBuf, sizeof(pBuf));
   1378 
   1379             PRINT("%d ::App: Read from OpBuf_Pipe OutBufHeader %p, nFilledLen = %d\n", __LINE__, pBuf, (int)pBuf->nFilledLen);
   1380 
   1381 #ifdef UNDER_CE
   1382             WriteFile(fOut, pBuf->pBuffer, pBuf->nFilledLen, &dwWritten, NULL);
   1383 #else
   1384             fwrite(pBuf->pBuffer, 1, (int ) (int)pBuf->nFilledLen, fOut);
   1385             fflush(fOut);
   1386 #endif
   1387 
   1388             nFramesDecoded++;
   1389             PRINT("\n\n\n*******************************************\n\n\n");
   1390 
   1391             if (( (nMCURow) &&  (pBuf->nFlags && OMX_BUFFERFLAG_EOS)) ||
   1392                ( (!nMCURow) &&  (nFramesDecoded >= nMaxFrames))){
   1393                 break;
   1394             }
   1395             PRINT("---------------------------- Output Buff FRAME %d ----------------------------\n", nFramesDecoded);
   1396 
   1397             eError = OMX_FillThisBuffer(pHandle, pBuf);
   1398             if ( eError != OMX_ErrorNone ) {
   1399                 printf ("Error from OMX_FillThisBuffer\n");
   1400                 goto EXIT;
   1401             }
   1402 
   1403             if (!nMCURow){
   1404                 rewind(fOut);
   1405             }
   1406         }
   1407     }/***** End of While Loop *****/
   1408 
   1409     if (bError == OMX_FALSE){
   1410         PRINT("APP:: Sending back to Idle\n");
   1411 
   1412         eError = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
   1413         if ( eError != OMX_ErrorNone ) {
   1414             fprintf (stderr,"Error from SendCommand-Idle(nStop) State function\n");
   1415             goto EXIT;
   1416         }
   1417     }
   1418 DEINIT2:
   1419 
   1420     if (bError == OMX_FALSE){
   1421         WaitForEvent_JPEG(pHandle, OMX_EventCmdComplete, nFdmax, OMX_StateIdle);
   1422 
   1423         eError = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateLoaded, NULL);
   1424         if ( eError != OMX_ErrorNone ) {
   1425             fprintf (stderr,"Error from SendCommand-Idle State function\n");
   1426             goto EXIT;
   1427         }
   1428 
   1429         bWaitForLoaded = OMX_TRUE;
   1430     }
   1431 //DEINIT1:
   1432 
   1433     eError = OMX_SendCommand(pHandle, OMX_CommandPortDisable, 0x0, NULL);
   1434     if ( eError != OMX_ErrorNone ) {
   1435         fprintf (stderr,"APP:: Error from SendCommand-PortDisable function. Input port.\n");
   1436         goto EXIT;
   1437     }
   1438 
   1439     eError = OMX_SendCommand(pHandle, OMX_CommandPortDisable, 0x1, NULL);
   1440     if ( eError != OMX_ErrorNone ) {
   1441         fprintf (stderr,"APP:: Error from SendCommand-PortDisable function. Output port.\n");
   1442         goto EXIT;
   1443     }
   1444 
   1445     /* Free buffers */
   1446     if ( nExternal==1 )
   1447     {
   1448         pOutBuffer-=128;
   1449         pInBuffer-=128;
   1450         eError = OMX_FreeBuffer(pHandle, nIndex1, pInBuffHead[0]);
   1451         for(nBufferHdrSend = 0; nBufferHdrSend < nNUM_OF_DECODING_BUFFERS; nBufferHdrSend++){
   1452             eError = OMX_FreeBuffer(pHandle, nIndex2, pOutBuffHead[nBufferHdrSend]);
   1453         }
   1454 
   1455         free(pOutBuffer);
   1456         free(pInBuffer);
   1457 
   1458     }
   1459     else {
   1460         eError = OMX_FreeBuffer(pHandle, nIndex1, pInBuffHead[0]);
   1461         for (nBufferHdrSend = 0; nBufferHdrSend < nNUM_OF_DECODING_BUFFERS; nBufferHdrSend ++) {
   1462             eError = OMX_FreeBuffer(pHandle, nIndex2, pOutBuffHead[nBufferHdrSend]);
   1463         }
   1464     }
   1465 
   1466     if (bWaitForLoaded && (bError == OMX_FALSE)){
   1467         WaitForEvent_JPEG(pHandle, OMX_EventCmdComplete, nFdmax, OMX_StateLoaded);
   1468     }
   1469 
   1470 EXIT:
   1471     if (pPortParamType) {
   1472         free(pPortParamType);
   1473         pPortParamType = NULL;
   1474     }
   1475     if (pParamPortDef) {
   1476         free(pParamPortDef);
   1477         pParamPortDef = NULL;
   1478     }
   1479     if (pInPortDef) {
   1480         free(pInPortDef);
   1481         pInPortDef = NULL;
   1482     }
   1483     if (pOutPortDef) {
   1484         free(pOutPortDef);
   1485         pOutPortDef = NULL;
   1486     }
   1487     if (imageinfo) {
   1488         free(imageinfo);
   1489         imageinfo = NULL;
   1490     }
   1491     if (pScaleFactor) {
   1492         free(pScaleFactor);
   1493         pScaleFactor = NULL;
   1494     }
   1495     if (pPortType) {
   1496         free(pPortType);
   1497         pPortType = NULL;
   1498     }
   1499     if(pSectionDecode){
   1500         free(pSectionDecode);
   1501         pSectionDecode = NULL;
   1502     }
   1503     if(pSubRegionDecode){
   1504         free(pSubRegionDecode);
   1505         pSubRegionDecode = NULL;
   1506     }
   1507 	if(pMaxResolution) {
   1508 		free(pMaxResolution);
   1509 		pMaxResolution = NULL;
   1510 	}
   1511 
   1512     if ( fOut != NULL ) {
   1513         PRINT("Closing Output File\n");
   1514 #ifdef UNDER_CE
   1515         CloseHandle(fOut);
   1516 #else
   1517         fclose(fOut);
   1518 #endif
   1519     }
   1520 
   1521     if ( fIn != NULL ) {
   1522         PRINT("Closing Input File\n");
   1523 #ifdef UNDER_CE
   1524         CloseHandle(fIn);
   1525 #else
   1526         fclose(fIn);
   1527 #endif
   1528     }
   1529 
   1530     if (pHandle) {
   1531         eError = TIOMX_FreeHandle(pHandle);
   1532         if ( (eError != OMX_ErrorNone) )	{
   1533             fprintf (stderr,"Error in Free Handle function\n");
   1534         }
   1535     }
   1536 
   1537 #ifdef DSP_MMU_FAULT_HANDLING
   1538     if(bError) {
   1539         LoadBaseImage();
   1540     }
   1541 #endif
   1542 
   1543     eError = TIOMX_Deinit();
   1544     if ( eError != OMX_ErrorNone ) {
   1545         PRINT("Error returned by OMX_Init()\n");
   1546         goto EXIT;
   1547     }
   1548 
   1549     return eError;
   1550 }
   1551 
   1552 
   1553 #ifdef DSP_MMU_FAULT_HANDLING
   1554 
   1555 int LoadBaseImage() {
   1556     unsigned int uProcId = 0;	/* default proc ID is 0. */
   1557     unsigned int index = 0;
   1558 
   1559     struct DSP_PROCESSORINFO dspInfo;
   1560     DSP_HPROCESSOR hProc;
   1561     DSP_STATUS status = DSP_SOK;
   1562     unsigned int numProcs;
   1563     char* argv[2];
   1564 
   1565     argv[0] = "/lib/dsp/baseimage.dof";
   1566 
   1567     status = (DBAPI)DspManager_Open(0, NULL);
   1568     if (DSP_FAILED(status)) {
   1569         printf("DSPManager_Open failed \n");
   1570         return -1;
   1571     }
   1572     while (DSP_SUCCEEDED(DSPManager_EnumProcessorInfo(index,&dspInfo,
   1573         (unsigned int)sizeof(struct DSP_PROCESSORINFO),&numProcs))) {
   1574         if ((dspInfo.uProcessorType == DSPTYPE_55) ||
   1575             (dspInfo.uProcessorType == DSPTYPE_64)) {
   1576             uProcId = index;
   1577             status = DSP_SOK;
   1578             break;
   1579         }
   1580         index++;
   1581     }
   1582     status = DSPProcessor_Attach(uProcId, NULL, &hProc);
   1583     if (DSP_SUCCEEDED(status)) {
   1584         status = DSPProcessor_Stop(hProc);
   1585         if (DSP_SUCCEEDED(status)) {
   1586             status = DSPProcessor_Load(hProc,1,(const char **)argv,NULL);
   1587             if (DSP_SUCCEEDED(status)) {
   1588                 status = DSPProcessor_Start(hProc);
   1589                 if (DSP_SUCCEEDED(status)) {
   1590                 }
   1591                 else {
   1592                 }
   1593             }
   1594 			else {
   1595             }
   1596             DSPProcessor_Detach(hProc);
   1597         }
   1598         else {
   1599         }
   1600     }
   1601     else {
   1602     }
   1603     fprintf(stderr,"Baseimage Loaded\n");
   1604 
   1605     return 0;
   1606 }
   1607 #endif
   1608 
   1609