Home | History | Annotate | Download | only in mpeg4
      1 /*
      2  *
      3  * Copyright 2012 Samsung Electronics S.LSI Co. LTD
      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 /*
     19  * @file      Exynos_OMX_Mpeg4dec.c
     20  * @brief
     21  * @author    Yunji Kim (yunji.kim (at) samsung.com)
     22  * @author    SeungBeom Kim (sbcrux.kim (at) samsung.com)
     23  * @version   2.0.0
     24  * @history
     25  *   2012.02.20 : Create
     26  */
     27 
     28 #include <stdio.h>
     29 #include <stdlib.h>
     30 #include <string.h>
     31 
     32 #include "Exynos_OMX_Macros.h"
     33 #include "Exynos_OMX_Basecomponent.h"
     34 #include "Exynos_OMX_Baseport.h"
     35 #include "Exynos_OMX_Vdec.h"
     36 #include "Exynos_OSAL_ETC.h"
     37 #include "Exynos_OSAL_Semaphore.h"
     38 #include "Exynos_OSAL_Thread.h"
     39 #include "library_register.h"
     40 #include "Exynos_OMX_Mpeg4dec.h"
     41 #include "ExynosVideoApi.h"
     42 #include "Exynos_OSAL_SharedMemory.h"
     43 #include "Exynos_OSAL_Event.h"
     44 
     45 #ifdef USE_ANB
     46 #include "Exynos_OSAL_Android.h"
     47 #endif
     48 
     49 /* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
     50 /* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
     51 #include "csc.h"
     52 
     53 #undef  EXYNOS_LOG_TAG
     54 #define EXYNOS_LOG_TAG    "EXYNOS_MPEG4_DEC"
     55 #define EXYNOS_LOG_OFF
     56 //#define EXYNOS_TRACE_ON
     57 #include "Exynos_OSAL_Log.h"
     58 
     59 #define MPEG4_DEC_NUM_OF_EXTRA_BUFFERS 7
     60 
     61 //#define FULL_FRAME_SEARCH
     62 
     63 /* MPEG4 Decoder Supported Levels & profiles */
     64 EXYNOS_OMX_VIDEO_PROFILELEVEL supportedMPEG4ProfileLevels[] ={
     65     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0},
     66     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0b},
     67     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1},
     68     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level2},
     69     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3},
     70     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4},
     71     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4a},
     72     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5},
     73     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0},
     74     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0b},
     75     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level1},
     76     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level2},
     77     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level3},
     78     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4},
     79     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4a},
     80     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level5}};
     81 
     82 /* H.263 Decoder Supported Levels & profiles */
     83 EXYNOS_OMX_VIDEO_PROFILELEVEL supportedH263ProfileLevels[] = {
     84     /* Baseline (Profile 0) */
     85     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level10},
     86     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level20},
     87     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level30},
     88     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level40},
     89     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level45},
     90     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level50},
     91     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level60},
     92     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level70},
     93     /* Profile 1 */
     94     {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level10},
     95     {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level20},
     96     {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level30},
     97     {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level40},
     98     {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level45},
     99     {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level50},
    100     {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level60},
    101     {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level70},
    102     /* Profile 2 */
    103     {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level10},
    104     {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level20},
    105     {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level30},
    106     {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level40},
    107     {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level45},
    108     {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level50},
    109     {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level60},
    110     {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level70},
    111     /* Profile 3, restricted up to SD resolution */
    112     {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level10},
    113     {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level20},
    114     {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level30},
    115     {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level40},
    116     {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level45},
    117     {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level50},
    118     {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level60},
    119     {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level70}};
    120 
    121 
    122 static OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, void *pVirtAddr, OMX_U32 *dataSize)
    123 {
    124     OMX_ERRORTYPE       ret = OMX_ErrorNone;
    125 
    126 EXIT:
    127     return ret;
    128 }
    129 
    130 static OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, void *addr[], int size[])
    131 {
    132     OMX_ERRORTYPE       ret = OMX_ErrorNone;
    133     ExynosVideoBuffer  *pCodecBuffer;
    134 
    135     if (codecBuffer == NULL) {
    136         ret = OMX_ErrorBadParameter;
    137         goto EXIT;
    138     }
    139 
    140     pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
    141 
    142     if (addr != NULL) {
    143         addr[0] = pCodecBuffer->planes[0].addr;
    144         addr[1] = pCodecBuffer->planes[1].addr;
    145         addr[2] = pCodecBuffer->planes[2].addr;
    146     }
    147 
    148     if (size != NULL) {
    149         size[0] = pCodecBuffer->planes[0].allocSize;
    150         size[1] = pCodecBuffer->planes[1].allocSize;
    151         size[2] = pCodecBuffer->planes[2].allocSize;
    152     }
    153 
    154 EXIT:
    155     return ret;
    156 }
    157 
    158 static OMX_BOOL gbFIMV1 = OMX_FALSE;
    159 
    160 static int Check_Mpeg4_Frame(
    161     OMX_U8   *pInputStream,
    162     OMX_U32   buffSize,
    163     OMX_U32   flag,
    164     OMX_BOOL  bPreviousFrameEOF,
    165     OMX_BOOL *pbEndOfFrame)
    166 {
    167     OMX_U32  len;
    168     int      readStream;
    169     unsigned startCode;
    170     OMX_BOOL bFrameStart;
    171 
    172     len = 0;
    173     bFrameStart = OMX_FALSE;
    174 
    175     if (flag & OMX_BUFFERFLAG_CODECCONFIG) {
    176         if (*pInputStream == 0x03) { /* FIMV1 */
    177             BitmapInfoHhr *pInfoHeader;
    178 
    179             pInfoHeader = (BitmapInfoHhr *)(pInputStream + 1);
    180             /* FIXME */
    181             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "############## NOT SUPPORTED #################");
    182             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "width(%d), height(%d)", pInfoHeader->BiWidth, pInfoHeader->BiHeight);
    183             gbFIMV1 = OMX_TRUE;
    184             *pbEndOfFrame = OMX_TRUE;
    185             return buffSize;
    186         }
    187     }
    188 
    189     if (gbFIMV1) {
    190         *pbEndOfFrame = OMX_TRUE;
    191         return buffSize;
    192     }
    193 
    194     if (bPreviousFrameEOF == OMX_FALSE)
    195         bFrameStart = OMX_TRUE;
    196 
    197     startCode = 0xFFFFFFFF;
    198     if (bFrameStart == OMX_FALSE) {
    199         /* find VOP start code */
    200         while(startCode != 0x1B6) {
    201             readStream = *(pInputStream + len);
    202             startCode = (startCode << 8) | readStream;
    203             len++;
    204             if (len > buffSize)
    205                 goto EXIT;
    206         }
    207     }
    208 
    209     /* find next VOP start code */
    210     startCode = 0xFFFFFFFF;
    211     while ((startCode != 0x1B6)) {
    212         readStream = *(pInputStream + len);
    213         startCode = (startCode << 8) | readStream;
    214         len++;
    215         if (len > buffSize)
    216             goto EXIT;
    217     }
    218 
    219     *pbEndOfFrame = OMX_TRUE;
    220 
    221     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "1. Check_Mpeg4_Frame returned EOF = %d, len = %d, buffSize = %d", *pbEndOfFrame, len - 4, buffSize);
    222 
    223     return len - 4;
    224 
    225 EXIT :
    226     *pbEndOfFrame = OMX_FALSE;
    227 
    228     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "2. Check_Mpeg4_Frame returned EOF = %d, len = %d, buffSize = %d", *pbEndOfFrame, len - 1, buffSize);
    229 
    230     return --len;
    231 }
    232 
    233 static int Check_H263_Frame(
    234     OMX_U8   *pInputStream,
    235     OMX_U32   buffSize,
    236     OMX_U32   flag,
    237     OMX_BOOL  bPreviousFrameEOF,
    238     OMX_BOOL *pbEndOfFrame)
    239 {
    240     OMX_U32  len;
    241     int      readStream;
    242     unsigned startCode;
    243     OMX_BOOL bFrameStart = 0;
    244     unsigned pTypeMask   = 0x03;
    245     unsigned pType       = 0;
    246 
    247     len = 0;
    248     bFrameStart = OMX_FALSE;
    249 
    250     if (bPreviousFrameEOF == OMX_FALSE)
    251         bFrameStart = OMX_TRUE;
    252 
    253     startCode = 0xFFFFFFFF;
    254     if (bFrameStart == OMX_FALSE) {
    255         /* find PSC(Picture Start Code) : 0000 0000 0000 0000 1000 00 */
    256         while (((startCode << 8 >> 10) != 0x20) || (pType != 0x02)) {
    257             readStream = *(pInputStream + len);
    258             startCode = (startCode << 8) | readStream;
    259 
    260             readStream = *(pInputStream + len + 1);
    261             pType = readStream & pTypeMask;
    262 
    263             len++;
    264             if (len > buffSize)
    265                 goto EXIT;
    266         }
    267     }
    268 
    269     /* find next PSC */
    270     startCode = 0xFFFFFFFF;
    271     pType = 0;
    272     while (((startCode << 8 >> 10) != 0x20) || (pType != 0x02)) {
    273         readStream = *(pInputStream + len);
    274         startCode = (startCode << 8) | readStream;
    275 
    276         readStream = *(pInputStream + len + 1);
    277         pType = readStream & pTypeMask;
    278 
    279         len++;
    280         if (len > buffSize)
    281             goto EXIT;
    282     }
    283 
    284     *pbEndOfFrame = OMX_TRUE;
    285 
    286     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "1. Check_H263_Frame returned EOF = %d, len = %d, iBuffSize = %d", *pbEndOfFrame, len - 3, buffSize);
    287 
    288     return len - 3;
    289 
    290 EXIT :
    291 
    292     *pbEndOfFrame = OMX_FALSE;
    293 
    294     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "2. Check_H263_Frame returned EOF = %d, len = %d, iBuffSize = %d", *pbEndOfFrame, len - 1, buffSize);
    295 
    296     return --len;
    297 }
    298 
    299 static OMX_BOOL Check_Stream_StartCode(
    300     OMX_U8    *pInputStream,
    301     OMX_U32    streamSize,
    302     CODEC_TYPE codecType)
    303 {
    304     switch (codecType) {
    305     case CODEC_TYPE_MPEG4:
    306         if (gbFIMV1) {
    307             return OMX_TRUE;
    308         } else {
    309             if (streamSize < 3) {
    310                 return OMX_FALSE;
    311             } else if ((pInputStream[0] == 0x00) &&
    312                        (pInputStream[1] == 0x00) &&
    313                        (pInputStream[2] == 0x01)) {
    314                 return OMX_TRUE;
    315             } else {
    316                 return OMX_FALSE;
    317             }
    318         }
    319         break;
    320     case CODEC_TYPE_H263:
    321         if (streamSize > 0) {
    322             unsigned startCode = 0xFFFFFFFF;
    323             unsigned pTypeMask = 0x03;
    324             unsigned pType     = 0;
    325             OMX_U32  len       = 0;
    326             int      readStream;
    327             /* Check PSC(Picture Start Code) : 0000 0000 0000 0000 1000 00 */
    328             while (((startCode << 8 >> 10) != 0x20) || (pType != 0x02)) {
    329                 readStream = *(pInputStream + len);
    330                 startCode = (startCode << 8) | readStream;
    331 
    332                 readStream = *(pInputStream + len + 1);
    333                 pType = readStream & pTypeMask;
    334 
    335                 len++;
    336                 if (len > 0x3)
    337                     break;
    338             }
    339 
    340             if (len > 0x3) {
    341                 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "[%s] Picture Start Code Missing", __FUNCTION__);
    342                 return OMX_FALSE;
    343             } else {
    344                 return OMX_TRUE;
    345             }
    346         } else {
    347             return OMX_FALSE;
    348         }
    349     default:
    350         Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "%s: undefined codec type (%d)", __FUNCTION__, codecType);
    351         return OMX_FALSE;
    352     }
    353 }
    354 
    355 OMX_ERRORTYPE Mpeg4CodecOpen(EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec)
    356 {
    357     OMX_ERRORTYPE            ret        = OMX_ErrorNone;
    358     ExynosVideoDecOps       *pDecOps    = NULL;
    359     ExynosVideoDecBufferOps *pInbufOps  = NULL;
    360     ExynosVideoDecBufferOps *pOutbufOps = NULL;
    361 
    362     FunctionIn();
    363 
    364     if (pMpeg4Dec == NULL) {
    365         ret = OMX_ErrorBadParameter;
    366         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
    367         goto EXIT;
    368     }
    369 
    370     /* alloc ops structure */
    371     pDecOps    = (ExynosVideoDecOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps));
    372     pInbufOps  = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
    373     pOutbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
    374 
    375     if ((pDecOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
    376         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate decoder ops buffer");
    377         ret = OMX_ErrorInsufficientResources;
    378         goto EXIT;
    379     }
    380 
    381     pMpeg4Dec->hMFCMpeg4Handle.pDecOps    = pDecOps;
    382     pMpeg4Dec->hMFCMpeg4Handle.pInbufOps  = pInbufOps;
    383     pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = pOutbufOps;
    384 
    385     /* function pointer mapping */
    386     pDecOps->nSize    = sizeof(ExynosVideoDecOps);
    387     pInbufOps->nSize  = sizeof(ExynosVideoDecBufferOps);
    388     pOutbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
    389 
    390     Exynos_Video_Register_Decoder(pDecOps, pInbufOps, pOutbufOps);
    391 
    392     /* check mandatory functions for decoder ops */
    393     if ((pDecOps->Init == NULL) || (pDecOps->Finalize == NULL) ||
    394         (pDecOps->Get_ActualBufferCount == NULL) || (pDecOps->Set_FrameTag == NULL) ||
    395         (pDecOps->Get_FrameTag == NULL)) {
    396         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
    397         ret = OMX_ErrorInsufficientResources;
    398         goto EXIT;
    399     }
    400 
    401     /* check mandatory functions for buffer ops */
    402     if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
    403         (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
    404         (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
    405         (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
    406         (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
    407         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
    408         ret = OMX_ErrorInsufficientResources;
    409         goto EXIT;
    410     }
    411 
    412     /* alloc context, open, querycap */
    413     pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.pDecOps->Init(V4L2_MEMORY_DMABUF);
    414     if (pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle == NULL) {
    415         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
    416         ret = OMX_ErrorInsufficientResources;
    417         goto EXIT;
    418     }
    419 
    420     ret = OMX_ErrorNone;
    421 
    422 EXIT:
    423     if (ret != OMX_ErrorNone) {
    424         if (pDecOps != NULL) {
    425             Exynos_OSAL_Free(pDecOps);
    426             pMpeg4Dec->hMFCMpeg4Handle.pDecOps = NULL;
    427         }
    428         if (pInbufOps != NULL) {
    429             Exynos_OSAL_Free(pInbufOps);
    430             pMpeg4Dec->hMFCMpeg4Handle.pInbufOps = NULL;
    431         }
    432         if (pOutbufOps != NULL) {
    433             Exynos_OSAL_Free(pOutbufOps);
    434             pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = NULL;
    435         }
    436     }
    437 
    438     FunctionOut();
    439 
    440     return ret;
    441 }
    442 
    443 OMX_ERRORTYPE Mpeg4CodecClose(EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec)
    444 {
    445     OMX_ERRORTYPE            ret        = OMX_ErrorNone;
    446     void                    *hMFCHandle = NULL;
    447     ExynosVideoDecOps       *pDecOps    = NULL;
    448     ExynosVideoDecBufferOps *pInbufOps  = NULL;
    449     ExynosVideoDecBufferOps *pOutbufOps = NULL;
    450 
    451     FunctionIn();
    452 
    453     if (pMpeg4Dec == NULL) {
    454         ret = OMX_ErrorBadParameter;
    455         goto EXIT;
    456     }
    457 
    458     hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
    459     pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
    460     pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
    461     pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
    462 
    463     if (hMFCHandle != NULL) {
    464         pDecOps->Finalize(hMFCHandle);
    465         pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle = NULL;
    466     }
    467     if (pOutbufOps != NULL) {
    468         Exynos_OSAL_Free(pOutbufOps);
    469         pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = NULL;
    470     }
    471     if (pInbufOps != NULL) {
    472         Exynos_OSAL_Free(pInbufOps);
    473         pMpeg4Dec->hMFCMpeg4Handle.pInbufOps = NULL;
    474     }
    475     if (pDecOps != NULL) {
    476         Exynos_OSAL_Free(pDecOps);
    477         pMpeg4Dec->hMFCMpeg4Handle.pDecOps = NULL;
    478     }
    479 
    480     ret = OMX_ErrorNone;
    481 
    482 EXIT:
    483     FunctionOut();
    484 
    485     return ret;
    486 }
    487 
    488 OMX_ERRORTYPE Mpeg4CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
    489 {
    490     OMX_ERRORTYPE            ret = OMX_ErrorNone;
    491     void                    *hMFCHandle = NULL;
    492     ExynosVideoDecOps       *pDecOps    = NULL;
    493     ExynosVideoDecBufferOps *pInbufOps  = NULL;
    494     ExynosVideoDecBufferOps *pOutbufOps = NULL;
    495     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
    496     EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = NULL;
    497 
    498     FunctionIn();
    499 
    500     if (pOMXComponent == NULL) {
    501         ret = OMX_ErrorBadParameter;
    502         goto EXIT;
    503     }
    504 
    505     pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
    506     if (pVideoDec == NULL) {
    507         ret = OMX_ErrorBadParameter;
    508         goto EXIT;
    509     }
    510 
    511     pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
    512     if (pMpeg4Dec == NULL) {
    513         ret = OMX_ErrorBadParameter;
    514         goto EXIT;
    515     }
    516 
    517     hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
    518     pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
    519     pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
    520     pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
    521 
    522     if (nPortIndex == INPUT_PORT_INDEX)
    523         pInbufOps->Run(hMFCHandle);
    524     else if (nPortIndex == OUTPUT_PORT_INDEX)
    525         pOutbufOps->Run(hMFCHandle);
    526 
    527     ret = OMX_ErrorNone;
    528 
    529 EXIT:
    530     FunctionOut();
    531 
    532     return ret;
    533 }
    534 
    535 OMX_ERRORTYPE Mpeg4CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
    536 {
    537     OMX_ERRORTYPE            ret = OMX_ErrorNone;
    538     void                    *hMFCHandle = NULL;
    539     ExynosVideoDecOps       *pDecOps    = NULL;
    540     ExynosVideoDecBufferOps *pInbufOps  = NULL;
    541     ExynosVideoDecBufferOps *pOutbufOps = NULL;
    542     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
    543     EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = NULL;
    544 
    545     FunctionIn();
    546 
    547     if (pOMXComponent == NULL) {
    548         ret = OMX_ErrorBadParameter;
    549         goto EXIT;
    550     }
    551 
    552     pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
    553     if (pVideoDec == NULL) {
    554         ret = OMX_ErrorBadParameter;
    555         goto EXIT;
    556     }
    557     pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
    558     if (pMpeg4Dec == NULL) {
    559         ret = OMX_ErrorBadParameter;
    560         goto EXIT;
    561     }
    562 
    563     hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
    564     pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
    565     pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
    566     pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
    567 
    568     if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL)) {
    569         pInbufOps->Stop(hMFCHandle);
    570     } else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL)) {
    571         EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    572         EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
    573         pOutbufOps->Stop(hMFCHandle);
    574         if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE)
    575             pOutbufOps->Clear_RegisteredBuffer(hMFCHandle);
    576     }
    577     ret = OMX_ErrorNone;
    578 
    579 EXIT:
    580     FunctionOut();
    581 
    582     return ret;
    583 }
    584 
    585 OMX_ERRORTYPE Mpeg4CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
    586 {
    587     OMX_ERRORTYPE            ret = OMX_ErrorNone;
    588     void                    *hMFCHandle = NULL;
    589     ExynosVideoDecOps       *pDecOps    = NULL;
    590     ExynosVideoDecBufferOps *pInbufOps  = NULL;
    591     ExynosVideoDecBufferOps *pOutbufOps = NULL;
    592     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
    593     EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = NULL;
    594 
    595     FunctionIn();
    596 
    597     if (pOMXComponent == NULL) {
    598         ret = OMX_ErrorBadParameter;
    599         goto EXIT;
    600     }
    601 
    602     pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
    603     if (pVideoDec == NULL) {
    604         ret = OMX_ErrorBadParameter;
    605         goto EXIT;
    606     }
    607     pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
    608     if (pMpeg4Dec == NULL) {
    609         ret = OMX_ErrorBadParameter;
    610         goto EXIT;
    611     }
    612 
    613     hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
    614     pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
    615     pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
    616     pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
    617 
    618     if (nPortIndex == INPUT_PORT_INDEX) {
    619         if (pMpeg4Dec->bSourceStart == OMX_FALSE) {
    620             Exynos_OSAL_SignalSet(pMpeg4Dec->hSourceStartEvent);
    621             Exynos_OSAL_SleepMillisec(0);
    622         }
    623     }
    624 
    625     if (nPortIndex == OUTPUT_PORT_INDEX) {
    626         if (pMpeg4Dec->bDestinationStart == OMX_FALSE) {
    627             Exynos_OSAL_SignalSet(pMpeg4Dec->hDestinationStartEvent);
    628             Exynos_OSAL_SleepMillisec(0);
    629         }
    630     }
    631 
    632     ret = OMX_ErrorNone;
    633 
    634 EXIT:
    635     FunctionOut();
    636 
    637     return ret;
    638 }
    639 
    640 OMX_ERRORTYPE Mpeg4CodecRegistCodecBuffers(
    641     OMX_COMPONENTTYPE   *pOMXComponent,
    642     OMX_U32              nPortIndex,
    643     OMX_U32              nBufferCnt)
    644 {
    645     OMX_ERRORTYPE                    ret                = OMX_ErrorNone;
    646     EXYNOS_OMX_BASECOMPONENT        *pExynosComponent   = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    647     EXYNOS_OMX_VIDEODEC_COMPONENT   *pVideoDec          = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
    648     EXYNOS_MPEG4DEC_HANDLE          *pMpeg4Dec          = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
    649     void                            *hMFCHandle         = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
    650     CODEC_DEC_BUFFER               **ppCodecBuffer      = NULL;
    651     ExynosVideoDecBufferOps         *pBufOps            = NULL;
    652     ExynosVideoPlane                *pPlanes            = NULL;
    653 
    654     OMX_U32 nPlaneCnt = 0;
    655     int i, j;
    656 
    657     FunctionIn();
    658 
    659     if (nPortIndex == INPUT_PORT_INDEX) {
    660         ppCodecBuffer   = &(pVideoDec->pMFCDecInputBuffer[0]);
    661         nPlaneCnt       = MFC_INPUT_BUFFER_PLANE;
    662         pBufOps         = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
    663     } else {
    664         ppCodecBuffer   = &(pVideoDec->pMFCDecOutputBuffer[0]);
    665         nPlaneCnt       = MFC_OUTPUT_BUFFER_PLANE;
    666         pBufOps         = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
    667     }
    668 
    669     pPlanes = (ExynosVideoPlane *)Exynos_OSAL_Malloc(sizeof(ExynosVideoPlane) * nPlaneCnt);
    670     if (pPlanes == NULL) {
    671         ret = OMX_ErrorInsufficientResources;
    672         goto EXIT;
    673     }
    674 
    675     /* Register buffer */
    676     for (i = 0; i < nBufferCnt; i++) {
    677         for (j = 0; j < nPlaneCnt; j++) {
    678             pPlanes[j].addr         = ppCodecBuffer[i]->pVirAddr[j];
    679             pPlanes[j].fd           = ppCodecBuffer[i]->fd[j];
    680             pPlanes[j].allocSize    = ppCodecBuffer[i]->bufferSize[j];
    681         }
    682 
    683         if (pBufOps->Register(hMFCHandle, pPlanes, nPlaneCnt) != VIDEO_ERROR_NONE) {
    684             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "PORT[%d]: Failed to Register buffer", nPortIndex);
    685             ret = OMX_ErrorInsufficientResources;
    686             Exynos_OSAL_Free(pPlanes);
    687             goto EXIT;
    688         }
    689     }
    690 
    691     Exynos_OSAL_Free(pPlanes);
    692 
    693     ret = OMX_ErrorNone;
    694 
    695 EXIT:
    696     FunctionOut();
    697 
    698     return ret;
    699 }
    700 
    701 OMX_ERRORTYPE Mpeg4CodecReconfigAllBuffers(
    702     OMX_COMPONENTTYPE   *pOMXComponent,
    703     OMX_U32              nPortIndex)
    704 {
    705     OMX_ERRORTYPE                    ret                = OMX_ErrorNone;
    706     EXYNOS_OMX_BASECOMPONENT        *pExynosComponent   = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    707     EXYNOS_OMX_VIDEODEC_COMPONENT   *pVideoDec          = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
    708     EXYNOS_OMX_BASEPORT             *pExynosPort        = &pExynosComponent->pExynosPort[nPortIndex];
    709     EXYNOS_MPEG4DEC_HANDLE          *pMpeg4Dec          = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
    710     void                            *hMFCHandle         = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
    711     ExynosVideoDecBufferOps         *pBufferOps         = NULL;
    712 
    713     FunctionIn();
    714 
    715     if ((nPortIndex == INPUT_PORT_INDEX) &&
    716         (pMpeg4Dec->bSourceStart == OMX_TRUE)) {
    717         ret = OMX_ErrorNotImplemented;
    718         goto EXIT;
    719     } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
    720                (pMpeg4Dec->bDestinationStart == OMX_TRUE)) {
    721         pBufferOps  = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
    722 
    723         if (pExynosPort->bufferProcessType & BUFFER_COPY) {
    724             /**********************************/
    725             /* Codec Buffer Free & Unregister */
    726             /**********************************/
    727             Exynos_Free_CodecBuffers(pOMXComponent, OUTPUT_PORT_INDEX);
    728             Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
    729             pBufferOps->Clear_RegisteredBuffer(hMFCHandle);
    730             pBufferOps->Cleanup_Buffer(hMFCHandle);
    731         } else if (pExynosPort->bufferProcessType & BUFFER_SHARE) {
    732             /**********************************/
    733             /* Codec Buffer Unregister */
    734             /**********************************/
    735             pBufferOps->Clear_RegisteredBuffer(hMFCHandle);
    736             pBufferOps->Cleanup_Buffer(hMFCHandle);
    737         }
    738         /******************************************************/
    739         /* V4L2 Destnation Setup for DPB Buffer Number Change */
    740         /******************************************************/
    741         Mpeg4CodecDstSetup(pOMXComponent);
    742         pVideoDec->bReconfigDPB = OMX_FALSE;
    743 
    744         Exynos_ResolutionUpdate(pOMXComponent);
    745     } else {
    746         ret = OMX_ErrorBadParameter;
    747         goto EXIT;
    748     }
    749 
    750 EXIT:
    751     FunctionOut();
    752 
    753     return ret;
    754 }
    755 
    756 OMX_ERRORTYPE Mpeg4CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
    757 {
    758     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
    759     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    760     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
    761     EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
    762     void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
    763     EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
    764     EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
    765     int i, nOutbufs;
    766 
    767     ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
    768     ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
    769     ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
    770 
    771     FunctionIn();
    772 
    773     if ((nPortIndex != INPUT_PORT_INDEX) && (nPortIndex != OUTPUT_PORT_INDEX)) {
    774         ret = OMX_ErrorBadPortIndex;
    775         goto EXIT;
    776     }
    777 
    778     if ((nPortIndex == INPUT_PORT_INDEX) &&
    779         (pMpeg4Dec->bSourceStart == OMX_TRUE)) {
    780         Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
    781 
    782         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
    783             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
    784             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
    785 
    786             Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
    787         }
    788 
    789         pInbufOps->Clear_Queue(hMFCHandle);
    790     } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
    791                (pMpeg4Dec->bDestinationStart == OMX_TRUE)) {
    792         OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
    793         ExynosVideoBuffer *pBuffer = NULL;
    794 
    795         Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
    796 
    797         nOutbufs = pDecOps->Get_ActualBufferCount(hMFCHandle);
    798         nOutbufs += EXTRA_DPB_NUM;
    799         for (i = 0; i < nOutbufs; i++) {
    800             Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, pVideoDec->pMFCDecOutputBuffer[i]);
    801         }
    802         pOutbufOps->Clear_Queue(hMFCHandle);
    803     } else {
    804         ret = OMX_ErrorBadParameter;
    805         goto EXIT;
    806     }
    807 
    808 EXIT:
    809     FunctionOut();
    810 
    811     return ret;
    812 }
    813 
    814 OMX_ERRORTYPE Mpeg4CodecCheckResolutionChange(OMX_COMPONENTTYPE *pOMXComponent)
    815 {
    816     OMX_ERRORTYPE                  ret                = OMX_ErrorNone;
    817     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent   = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    818     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec          = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
    819     EXYNOS_MPEG4DEC_HANDLE        *pMpeg4Dec         = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
    820     void                          *hMFCHandle         = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
    821     EXYNOS_OMX_BASEPORT           *pInputPort         = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
    822     EXYNOS_OMX_BASEPORT           *pOutputPort        = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
    823     ExynosVideoDecOps             *pDecOps            = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
    824     ExynosVideoDecBufferOps       *pOutbufOps         = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
    825 
    826     OMX_CONFIG_RECTTYPE *pCropRectangle = NULL;
    827     OMX_PARAM_PORTDEFINITIONTYPE *pInputPortDefinition = NULL;
    828     OMX_PARAM_PORTDEFINITIONTYPE *pOutputPortDefinition = NULL;
    829 
    830     FunctionIn();
    831     /* get geometry for output */
    832     Exynos_OSAL_Memset(&pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry));
    833     if (pOutbufOps->Get_Geometry(hMFCHandle, &pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf) != VIDEO_ERROR_NONE) {
    834         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info");
    835         ret = OMX_ErrorInsufficientResources;
    836         goto EXIT;
    837     }
    838 
    839     /* get dpb count */
    840     pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle);
    841     if (pVideoDec->bThumbnailMode == OMX_FALSE)
    842         pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum += EXTRA_DPB_NUM;
    843     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "H264CodecSetup nOutbufs: %d", pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum);
    844 
    845     pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_TRUE;
    846 
    847     if (pVideoDec->bReconfigDPB != OMX_TRUE) {
    848         pCropRectangle = &(pOutputPort->cropRectangle);
    849         pInputPortDefinition = &(pInputPort->portDefinition);
    850         pOutputPortDefinition = &(pOutputPort->portDefinition);
    851     } else {
    852         pCropRectangle = &(pOutputPort->newCropRectangle);
    853         pInputPortDefinition = &(pInputPort->newPortDefinition);
    854         pOutputPortDefinition = &(pOutputPort->newPortDefinition);
    855     }
    856 
    857     pCropRectangle->nTop     = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.cropRect.nTop;
    858     pCropRectangle->nLeft    = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.cropRect.nLeft;
    859     pCropRectangle->nWidth   = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.cropRect.nWidth;
    860     pCropRectangle->nHeight  = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.cropRect.nHeight;
    861 
    862     if (pOutputPort->bufferProcessType & BUFFER_COPY) {
    863         if ((pVideoDec->bReconfigDPB) ||
    864             (pInputPort->portDefinition.format.video.nFrameWidth != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth) ||
    865             (pInputPort->portDefinition.format.video.nFrameHeight != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight)) {
    866             pInputPortDefinition->format.video.nFrameWidth  = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth;
    867             pInputPortDefinition->format.video.nFrameHeight = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight;
    868             pInputPortDefinition->format.video.nStride      = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
    869             pInputPortDefinition->format.video.nSliceHeight = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
    870             pOutputPortDefinition->nBufferCountActual       = pOutputPort->portDefinition.nBufferCountActual;
    871             pOutputPortDefinition->nBufferCountMin          = pOutputPort->portDefinition.nBufferCountMin;
    872             if (pVideoDec->bReconfigDPB != OMX_TRUE)
    873                 Exynos_UpdateFrameSize(pOMXComponent);
    874             pOutputPort->exceptionFlag = NEED_PORT_DISABLE;
    875 
    876             /** Send Port Settings changed call back **/
    877             (*(pExynosComponent->pCallbacks->EventHandler))
    878                 (pOMXComponent,
    879                  pExynosComponent->callbackData,
    880                  OMX_EventPortSettingsChanged, /* The command was completed */
    881                  OMX_DirOutput, /* This is the port index */
    882                  0,
    883                  NULL);
    884         }
    885     } else if (pOutputPort->bufferProcessType & BUFFER_SHARE) {
    886         if ((pVideoDec->bReconfigDPB) ||
    887             (pInputPort->portDefinition.format.video.nFrameWidth != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth) ||
    888             (pInputPort->portDefinition.format.video.nFrameHeight != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight) ||
    889             (pOutputPort->portDefinition.nBufferCountActual != pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum)) {
    890             pInputPortDefinition->format.video.nFrameWidth  = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth;
    891             pInputPortDefinition->format.video.nFrameHeight = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight;
    892             pInputPortDefinition->format.video.nStride      = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
    893             pInputPortDefinition->format.video.nSliceHeight = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
    894             pOutputPortDefinition->nBufferCountActual       = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum;
    895             pOutputPortDefinition->nBufferCountMin          = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum;
    896             if (pVideoDec->bReconfigDPB != OMX_TRUE)
    897                 Exynos_UpdateFrameSize(pOMXComponent);
    898             pOutputPort->exceptionFlag = NEED_PORT_DISABLE;
    899 
    900             /** Send Port Settings changed call back **/
    901             (*(pExynosComponent->pCallbacks->EventHandler))
    902                 (pOMXComponent,
    903                  pExynosComponent->callbackData,
    904                  OMX_EventPortSettingsChanged, /* The command was completed */
    905                  OMX_DirOutput, /* This is the port index */
    906                  0,
    907                  NULL);
    908         }
    909     }
    910     if ((pVideoDec->bReconfigDPB == OMX_TRUE) ||
    911         (pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.cropRect.nWidth) ||
    912         (pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.cropRect.nHeight)) {
    913         /* Check Crop */
    914         pInputPortDefinition->format.video.nFrameWidth  = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth;
    915         pInputPortDefinition->format.video.nFrameHeight = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight;
    916         pInputPortDefinition->format.video.nStride      = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
    917         pInputPortDefinition->format.video.nSliceHeight = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
    918         if (pVideoDec->bReconfigDPB != OMX_TRUE)
    919             Exynos_UpdateFrameSize(pOMXComponent);
    920 
    921         /** Send crop info call back **/
    922         (*(pExynosComponent->pCallbacks->EventHandler))
    923             (pOMXComponent,
    924              pExynosComponent->callbackData,
    925              OMX_EventPortSettingsChanged, /* The command was completed */
    926              OMX_DirOutput, /* This is the port index */
    927              OMX_IndexConfigCommonOutputCrop,
    928              NULL);
    929     }
    930 
    931     ret = OMX_ErrorNone;
    932 
    933 EXIT:
    934     FunctionOut();
    935 
    936     return ret;
    937 }
    938 
    939 OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
    940 {
    941     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
    942     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    943     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
    944     EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
    945     void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
    946     EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
    947     EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
    948     OMX_U32                     oneFrameSize = pSrcInputData->dataLen;
    949 
    950     ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
    951     ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
    952     ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
    953     ExynosVideoGeometry      bufferConf;
    954     OMX_U32                  inputBufferNumber = 0;
    955     int i;
    956 
    957     FunctionIn();
    958 
    959     if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
    960         OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
    961         OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
    962         if (OMXBuffer == NULL) {
    963             ret = OMX_ErrorUndefined;
    964             goto EXIT;
    965         }
    966 
    967         OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
    968         OMXBuffer->nFlags = pSrcInputData->nFlags;
    969         Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
    970 
    971         ret = OMX_ErrorNone;
    972         goto EXIT;
    973     }
    974 
    975     if (pVideoDec->bThumbnailMode == OMX_TRUE)
    976         pDecOps->Set_IFrameDecoding(hMFCHandle);
    977 
    978     /* input buffer info */
    979     Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
    980     if (pMpeg4Dec->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
    981         bufferConf.eCompressionFormat = VIDEO_CODING_MPEG4;
    982     else
    983         bufferConf.eCompressionFormat = VIDEO_CODING_H263;
    984 
    985     pInbufOps->Set_Shareable(hMFCHandle);
    986     if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
    987         bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth
    988                                 * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
    989         inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM;
    990     } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
    991         bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE;
    992         inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
    993     }
    994 
    995     /* should be done before prepare input buffer */
    996     if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
    997         ret = OMX_ErrorInsufficientResources;
    998         goto EXIT;
    999     }
   1000 
   1001     /* set input buffer geometry */
   1002     if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
   1003         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
   1004         ret = OMX_ErrorInsufficientResources;
   1005         goto EXIT;
   1006     }
   1007 
   1008     /* setup input buffer */
   1009     if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
   1010         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
   1011         ret = OMX_ErrorInsufficientResources;
   1012         goto EXIT;
   1013     }
   1014 
   1015     if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
   1016         ret = Mpeg4CodecRegistCodecBuffers(pOMXComponent, INPUT_PORT_INDEX, MFC_INPUT_BUFFER_NUM_MAX);
   1017         if (ret != OMX_ErrorNone)
   1018             goto EXIT;
   1019     } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
   1020         /* Register input buffer */
   1021         for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
   1022             ExynosVideoPlane plane;
   1023             plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
   1024             plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
   1025             plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0];
   1026             if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
   1027                 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
   1028                 ret = OMX_ErrorInsufficientResources;
   1029                 goto EXIT;
   1030             }
   1031         }
   1032     }
   1033 
   1034     /* set output geometry */
   1035     Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
   1036     pMpeg4Dec->hMFCMpeg4Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
   1037     if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
   1038         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
   1039         ret = OMX_ErrorInsufficientResources;
   1040         goto EXIT;
   1041     }
   1042 
   1043     /* input buffer enqueue for header parsing */
   1044     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
   1045     if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
   1046                         (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
   1047         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing");
   1048 //        ret = OMX_ErrorInsufficientResources;
   1049         ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit;
   1050         goto EXIT;
   1051     }
   1052 
   1053     /* start header parsing */
   1054     if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
   1055         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing");
   1056         ret = OMX_ErrorCodecInit;
   1057         goto EXIT;
   1058     }
   1059 
   1060     Mpeg4CodecCheckResolutionChange(pOMXComponent);
   1061 
   1062     Exynos_OSAL_SleepMillisec(0);
   1063     ret = OMX_ErrorInputDataDecodeYet;
   1064     Mpeg4CodecStop(pOMXComponent, INPUT_PORT_INDEX);
   1065 
   1066 EXIT:
   1067     FunctionOut();
   1068 
   1069     return ret;
   1070 }
   1071 
   1072 OMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
   1073 {
   1074     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
   1075     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1076     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
   1077     EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1078     void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
   1079     EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
   1080     EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
   1081 
   1082     ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
   1083     ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
   1084     ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
   1085 
   1086     int i, nOutbufs;
   1087 
   1088     FunctionIn();
   1089 
   1090     if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
   1091         /* BUFFER_COPY case, get dpb count */
   1092         nOutbufs = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum;
   1093 
   1094         /* should be done before prepare output buffer */
   1095         if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
   1096             ret = OMX_ErrorInsufficientResources;
   1097             goto EXIT;
   1098         }
   1099     } else {
   1100         /*BUFFER_SHERE case, get dpb count */
   1101         nOutbufs = pExynosOutputPort->portDefinition.nBufferCountActual;
   1102     }
   1103 
   1104     if (pOutbufOps->Enable_DynamicDPB(hMFCHandle) != VIDEO_ERROR_NONE) {
   1105         ret = OMX_ErrorUndefined;
   1106         goto EXIT;
   1107     }
   1108 
   1109     pOutbufOps->Set_Shareable(hMFCHandle);
   1110     if (pOutbufOps->Setup(hMFCHandle, MAX_OUTPUTBUFFER_NUM_DYNAMIC) != VIDEO_ERROR_NONE) {
   1111         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
   1112         ret = OMX_ErrorInsufficientResources;
   1113         goto EXIT;
   1114     }
   1115 
   1116     ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
   1117     OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
   1118     OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
   1119     int plane;
   1120 
   1121     nAllocLen[0] = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth,
   1122                         pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight);
   1123     nAllocLen[1] = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth,
   1124                         pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight >> 1);
   1125 
   1126     if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
   1127         ret = Exynos_Allocate_CodecBuffers(pOMXComponent, OUTPUT_PORT_INDEX, nOutbufs, nAllocLen);
   1128         if (ret != OMX_ErrorNone)
   1129             goto EXIT;
   1130 
   1131         for (i = 0; i < nOutbufs; i++) {
   1132             /* Enqueue output buffer */
   1133             pOutbufOps->ExtensionEnqueue(hMFCHandle,
   1134                             (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
   1135                             (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->fd,
   1136                             (unsigned int *)pVideoDec->pMFCDecOutputBuffer[i]->bufferSize,
   1137                             (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
   1138         }
   1139 
   1140         if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
   1141             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
   1142             ret = OMX_ErrorInsufficientResources;
   1143             goto EXIT;
   1144         }
   1145     } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
   1146         /*************/
   1147         /*    TBD    */
   1148         /*************/
   1149 #ifdef USE_ANB
   1150         if ((pExynosOutputPort->bIsANBEnabled == OMX_FALSE) &&
   1151             (pExynosOutputPort->bStoreMetaData == OMX_FALSE)) {
   1152             ret = OMX_ErrorNotImplemented;
   1153             goto EXIT;
   1154         }
   1155 #else
   1156         ret = OMX_ErrorNotImplemented;
   1157         goto EXIT;
   1158 #endif
   1159     }
   1160 
   1161     pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_TRUE;
   1162 
   1163     ret = OMX_ErrorNone;
   1164 
   1165 EXIT:
   1166     FunctionOut();
   1167 
   1168     return ret;
   1169 }
   1170 
   1171 OMX_ERRORTYPE Exynos_Mpeg4Dec_GetParameter(
   1172     OMX_IN OMX_HANDLETYPE hComponent,
   1173     OMX_IN OMX_INDEXTYPE  nParamIndex,
   1174     OMX_INOUT OMX_PTR     pComponentParameterStructure)
   1175 {
   1176     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
   1177     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
   1178     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
   1179 
   1180     FunctionIn();
   1181 
   1182     if (hComponent == NULL || pComponentParameterStructure == NULL) {
   1183         ret = OMX_ErrorBadParameter;
   1184         goto EXIT;
   1185     }
   1186     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
   1187     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
   1188     if (ret != OMX_ErrorNone) {
   1189         goto EXIT;
   1190     }
   1191     if (pOMXComponent->pComponentPrivate == NULL) {
   1192         ret = OMX_ErrorBadParameter;
   1193         goto EXIT;
   1194     }
   1195 
   1196     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1197     if (pExynosComponent->currentState == OMX_StateInvalid ) {
   1198         ret = OMX_ErrorInvalidState;
   1199         goto EXIT;
   1200     }
   1201 
   1202     switch (nParamIndex) {
   1203     case OMX_IndexParamVideoMpeg4:
   1204     {
   1205         OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Param = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
   1206         OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Param = NULL;
   1207         EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec      = NULL;
   1208 
   1209         ret = Exynos_OMX_Check_SizeVersion(pDstMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
   1210         if (ret != OMX_ErrorNone) {
   1211             goto EXIT;
   1212         }
   1213 
   1214         if (pDstMpeg4Param->nPortIndex >= ALL_PORT_NUM) {
   1215             ret = OMX_ErrorBadPortIndex;
   1216             goto EXIT;
   1217         }
   1218 
   1219         pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1220         pSrcMpeg4Param = &pMpeg4Dec->mpeg4Component[pDstMpeg4Param->nPortIndex];
   1221 
   1222         Exynos_OSAL_Memcpy(pDstMpeg4Param, pSrcMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
   1223     }
   1224         break;
   1225     case OMX_IndexParamVideoH263:
   1226     {
   1227         OMX_VIDEO_PARAM_H263TYPE *pDstH263Param = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
   1228         OMX_VIDEO_PARAM_H263TYPE *pSrcH263Param = NULL;
   1229         EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec     = NULL;
   1230 
   1231         ret = Exynos_OMX_Check_SizeVersion(pDstH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
   1232         if (ret != OMX_ErrorNone) {
   1233             goto EXIT;
   1234         }
   1235 
   1236         if (pDstH263Param->nPortIndex >= ALL_PORT_NUM) {
   1237             ret = OMX_ErrorBadPortIndex;
   1238             goto EXIT;
   1239         }
   1240 
   1241         pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1242         pSrcH263Param = &pMpeg4Dec->h263Component[pDstH263Param->nPortIndex];
   1243 
   1244         Exynos_OSAL_Memcpy(pDstH263Param, pSrcH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
   1245     }
   1246         break;
   1247     case OMX_IndexParamStandardComponentRole:
   1248     {
   1249         OMX_S32                      codecType;
   1250         OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
   1251 
   1252         ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
   1253         if (ret != OMX_ErrorNone) {
   1254             goto EXIT;
   1255         }
   1256 
   1257         codecType = ((EXYNOS_MPEG4DEC_HANDLE *)(((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
   1258         if (codecType == CODEC_TYPE_MPEG4)
   1259             Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE);
   1260         else
   1261             Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_DEC_ROLE);
   1262     }
   1263         break;
   1264     case OMX_IndexParamVideoProfileLevelQuerySupported:
   1265     {
   1266         OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel   = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
   1267         EXYNOS_OMX_VIDEO_PROFILELEVEL    *pProfileLevel      = NULL;
   1268         OMX_U32                           maxProfileLevelNum = 0;
   1269         OMX_S32                           codecType;
   1270 
   1271         ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
   1272         if (ret != OMX_ErrorNone) {
   1273             goto EXIT;
   1274         }
   1275 
   1276         if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
   1277             ret = OMX_ErrorBadPortIndex;
   1278             goto EXIT;
   1279         }
   1280 
   1281         codecType = ((EXYNOS_MPEG4DEC_HANDLE *)(((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
   1282         if (codecType == CODEC_TYPE_MPEG4) {
   1283             pProfileLevel = supportedMPEG4ProfileLevels;
   1284             maxProfileLevelNum = sizeof(supportedMPEG4ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
   1285         } else {
   1286             pProfileLevel = supportedH263ProfileLevels;
   1287             maxProfileLevelNum = sizeof(supportedH263ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
   1288         }
   1289 
   1290         if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) {
   1291             ret = OMX_ErrorNoMore;
   1292             goto EXIT;
   1293         }
   1294 
   1295         pProfileLevel += pDstProfileLevel->nProfileIndex;
   1296         pDstProfileLevel->eProfile = pProfileLevel->profile;
   1297         pDstProfileLevel->eLevel = pProfileLevel->level;
   1298     }
   1299         break;
   1300     case OMX_IndexParamVideoProfileLevelCurrent:
   1301     {
   1302         OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
   1303         OMX_VIDEO_PARAM_MPEG4TYPE        *pSrcMpeg4Param   = NULL;
   1304         OMX_VIDEO_PARAM_H263TYPE         *pSrcH263Param    = NULL;
   1305         EXYNOS_MPEG4DEC_HANDLE           *pMpeg4Dec        = NULL;
   1306         OMX_S32                           codecType;
   1307 
   1308         ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
   1309         if (ret != OMX_ErrorNone) {
   1310             goto EXIT;
   1311         }
   1312 
   1313         if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
   1314             ret = OMX_ErrorBadPortIndex;
   1315             goto EXIT;
   1316         }
   1317 
   1318         pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1319         codecType = pMpeg4Dec->hMFCMpeg4Handle.codecType;
   1320         if (codecType == CODEC_TYPE_MPEG4) {
   1321             pSrcMpeg4Param = &pMpeg4Dec->mpeg4Component[pDstProfileLevel->nPortIndex];
   1322             pDstProfileLevel->eProfile = pSrcMpeg4Param->eProfile;
   1323             pDstProfileLevel->eLevel = pSrcMpeg4Param->eLevel;
   1324         } else {
   1325             pSrcH263Param = &pMpeg4Dec->h263Component[pDstProfileLevel->nPortIndex];
   1326             pDstProfileLevel->eProfile = pSrcH263Param->eProfile;
   1327             pDstProfileLevel->eLevel = pSrcH263Param->eLevel;
   1328         }
   1329     }
   1330         break;
   1331     case OMX_IndexParamVideoErrorCorrection:
   1332     {
   1333         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
   1334         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
   1335         EXYNOS_MPEG4DEC_HANDLE              *pMpeg4Dec               = NULL;
   1336 
   1337         ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
   1338         if (ret != OMX_ErrorNone) {
   1339             goto EXIT;
   1340         }
   1341 
   1342         if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
   1343             ret = OMX_ErrorBadPortIndex;
   1344             goto EXIT;
   1345         }
   1346 
   1347         pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1348         pSrcErrorCorrectionType = &pMpeg4Dec->errorCorrectionType[INPUT_PORT_INDEX];
   1349 
   1350         pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
   1351         pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
   1352         pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
   1353         pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
   1354         pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
   1355     }
   1356         break;
   1357     default:
   1358         ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
   1359         break;
   1360     }
   1361 EXIT:
   1362     FunctionOut();
   1363 
   1364     return ret;
   1365 }
   1366 
   1367 OMX_ERRORTYPE Exynos_Mpeg4Dec_SetParameter(
   1368     OMX_IN OMX_HANDLETYPE hComponent,
   1369     OMX_IN OMX_INDEXTYPE  nIndex,
   1370     OMX_IN OMX_PTR        pComponentParameterStructure)
   1371 {
   1372     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
   1373     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
   1374     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
   1375 
   1376     FunctionIn();
   1377 
   1378     if (hComponent == NULL || pComponentParameterStructure == NULL) {
   1379         ret = OMX_ErrorBadParameter;
   1380         goto EXIT;
   1381     }
   1382     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
   1383     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
   1384     if (ret != OMX_ErrorNone) {
   1385         goto EXIT;
   1386     }
   1387     if (pOMXComponent->pComponentPrivate == NULL) {
   1388         ret = OMX_ErrorBadParameter;
   1389         goto EXIT;
   1390     }
   1391 
   1392     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1393     if (pExynosComponent->currentState == OMX_StateInvalid ) {
   1394         ret = OMX_ErrorInvalidState;
   1395         goto EXIT;
   1396     }
   1397 
   1398     switch (nIndex) {
   1399     case OMX_IndexParamVideoMpeg4:
   1400     {
   1401         OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Param = NULL;
   1402         OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Param = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
   1403         EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec      = NULL;
   1404 
   1405         ret = Exynos_OMX_Check_SizeVersion(pSrcMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
   1406         if (ret != OMX_ErrorNone) {
   1407             goto EXIT;
   1408         }
   1409 
   1410         if (pSrcMpeg4Param->nPortIndex >= ALL_PORT_NUM) {
   1411             ret = OMX_ErrorBadPortIndex;
   1412             goto EXIT;
   1413         }
   1414 
   1415         pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1416         pDstMpeg4Param = &pMpeg4Dec->mpeg4Component[pSrcMpeg4Param->nPortIndex];
   1417 
   1418         Exynos_OSAL_Memcpy(pDstMpeg4Param, pSrcMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
   1419     }
   1420         break;
   1421     case OMX_IndexParamVideoH263:
   1422     {
   1423         OMX_VIDEO_PARAM_H263TYPE *pDstH263Param = NULL;
   1424         OMX_VIDEO_PARAM_H263TYPE *pSrcH263Param = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
   1425         EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec     = NULL;
   1426 
   1427         ret = Exynos_OMX_Check_SizeVersion(pSrcH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
   1428         if (ret != OMX_ErrorNone) {
   1429             goto EXIT;
   1430         }
   1431 
   1432         if (pSrcH263Param->nPortIndex >= ALL_PORT_NUM) {
   1433             ret = OMX_ErrorBadPortIndex;
   1434             goto EXIT;
   1435         }
   1436 
   1437         pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1438         pDstH263Param = &pMpeg4Dec->h263Component[pSrcH263Param->nPortIndex];
   1439 
   1440         Exynos_OSAL_Memcpy(pDstH263Param, pSrcH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
   1441     }
   1442         break;
   1443     case OMX_IndexParamStandardComponentRole:
   1444     {
   1445         OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
   1446 
   1447         ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
   1448         if (ret != OMX_ErrorNone) {
   1449             goto EXIT;
   1450         }
   1451 
   1452         if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
   1453             ret = OMX_ErrorIncorrectStateOperation;
   1454             goto EXIT;
   1455         }
   1456 
   1457         if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE)) {
   1458             pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
   1459         } else if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_DEC_ROLE)) {
   1460             pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
   1461         } else {
   1462             ret = OMX_ErrorBadParameter;
   1463             goto EXIT;
   1464         }
   1465     }
   1466         break;
   1467     case OMX_IndexParamVideoProfileLevelCurrent:
   1468     {
   1469         OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
   1470         OMX_VIDEO_PARAM_MPEG4TYPE        *pDstMpeg4Param   = NULL;
   1471         OMX_VIDEO_PARAM_H263TYPE         *pDstH263Param    = NULL;
   1472         EXYNOS_MPEG4DEC_HANDLE           *pMpeg4Dec        = NULL;
   1473         OMX_S32                           codecType;
   1474 
   1475         ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
   1476         if (ret != OMX_ErrorNone)
   1477             goto EXIT;
   1478 
   1479         if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
   1480             ret = OMX_ErrorBadPortIndex;
   1481             goto EXIT;
   1482         }
   1483 
   1484         pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1485         codecType = pMpeg4Dec->hMFCMpeg4Handle.codecType;
   1486         if (codecType == CODEC_TYPE_MPEG4) {
   1487             /*
   1488              * To do: Check validity of profile & level parameters
   1489              */
   1490 
   1491             pDstMpeg4Param = &pMpeg4Dec->mpeg4Component[pSrcProfileLevel->nPortIndex];
   1492             pDstMpeg4Param->eProfile = pSrcProfileLevel->eProfile;
   1493             pDstMpeg4Param->eLevel = pSrcProfileLevel->eLevel;
   1494         } else {
   1495             /*
   1496              * To do: Check validity of profile & level parameters
   1497              */
   1498 
   1499             pDstH263Param = &pMpeg4Dec->h263Component[pSrcProfileLevel->nPortIndex];
   1500             pDstH263Param->eProfile = pSrcProfileLevel->eProfile;
   1501             pDstH263Param->eLevel = pSrcProfileLevel->eLevel;
   1502         }
   1503     }
   1504         break;
   1505     case OMX_IndexParamVideoErrorCorrection:
   1506     {
   1507         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
   1508         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
   1509         EXYNOS_MPEG4DEC_HANDLE              *pMpeg4Dec               = NULL;
   1510 
   1511         ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
   1512         if (ret != OMX_ErrorNone) {
   1513             goto EXIT;
   1514         }
   1515 
   1516         if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
   1517             ret = OMX_ErrorBadPortIndex;
   1518             goto EXIT;
   1519         }
   1520 
   1521         pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1522         pDstErrorCorrectionType = &pMpeg4Dec->errorCorrectionType[INPUT_PORT_INDEX];
   1523 
   1524         pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
   1525         pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
   1526         pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
   1527         pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
   1528         pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
   1529     }
   1530         break;
   1531     default:
   1532         ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
   1533         break;
   1534     }
   1535 EXIT:
   1536     FunctionOut();
   1537 
   1538     return ret;
   1539 }
   1540 
   1541 OMX_ERRORTYPE Exynos_Mpeg4Dec_GetConfig(
   1542     OMX_IN OMX_HANDLETYPE hComponent,
   1543     OMX_IN OMX_INDEXTYPE  nIndex,
   1544     OMX_IN OMX_PTR        pComponentConfigStructure)
   1545 {
   1546     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
   1547     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
   1548     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
   1549 
   1550     FunctionIn();
   1551 
   1552     if (hComponent == NULL || pComponentConfigStructure == NULL) {
   1553         ret = OMX_ErrorBadParameter;
   1554         goto EXIT;
   1555     }
   1556     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
   1557     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
   1558     if (ret != OMX_ErrorNone) {
   1559         goto EXIT;
   1560     }
   1561     if (pOMXComponent->pComponentPrivate == NULL) {
   1562         ret = OMX_ErrorBadParameter;
   1563         goto EXIT;
   1564     }
   1565     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1566     if (pExynosComponent->currentState == OMX_StateInvalid) {
   1567         ret = OMX_ErrorInvalidState;
   1568         goto EXIT;
   1569     }
   1570 
   1571     switch (nIndex) {
   1572     default:
   1573         ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
   1574         break;
   1575     }
   1576 
   1577 EXIT:
   1578     FunctionOut();
   1579 
   1580     return ret;
   1581 }
   1582 
   1583 OMX_ERRORTYPE Exynos_Mpeg4Dec_SetConfig(
   1584     OMX_IN OMX_HANDLETYPE hComponent,
   1585     OMX_IN OMX_INDEXTYPE  nIndex,
   1586     OMX_IN OMX_PTR        pComponentConfigStructure)
   1587 {
   1588     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
   1589     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
   1590     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
   1591 
   1592     FunctionIn();
   1593 
   1594     if (hComponent == NULL || pComponentConfigStructure == NULL) {
   1595         ret = OMX_ErrorBadParameter;
   1596         goto EXIT;
   1597     }
   1598     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
   1599     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
   1600     if (ret != OMX_ErrorNone) {
   1601         goto EXIT;
   1602     }
   1603     if (pOMXComponent->pComponentPrivate == NULL) {
   1604         ret = OMX_ErrorBadParameter;
   1605         goto EXIT;
   1606     }
   1607     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1608     if (pExynosComponent->currentState == OMX_StateInvalid) {
   1609         ret = OMX_ErrorInvalidState;
   1610         goto EXIT;
   1611     }
   1612 
   1613     switch (nIndex) {
   1614     default:
   1615         ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
   1616         break;
   1617     }
   1618 
   1619 EXIT:
   1620     FunctionOut();
   1621 
   1622     return ret;
   1623 }
   1624 
   1625 OMX_ERRORTYPE Exynos_Mpeg4Dec_GetExtensionIndex(
   1626     OMX_IN  OMX_HANDLETYPE  hComponent,
   1627     OMX_IN  OMX_STRING      cParameterName,
   1628     OMX_OUT OMX_INDEXTYPE  *pIndexType)
   1629 {
   1630     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
   1631     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
   1632     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
   1633 
   1634     FunctionIn();
   1635 
   1636     if (hComponent == NULL) {
   1637         ret = OMX_ErrorBadParameter;
   1638         goto EXIT;
   1639     }
   1640     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
   1641     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
   1642     if (ret != OMX_ErrorNone) {
   1643         goto EXIT;
   1644     }
   1645     if (pOMXComponent->pComponentPrivate == NULL) {
   1646         ret = OMX_ErrorBadParameter;
   1647         goto EXIT;
   1648     }
   1649     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1650     if ((cParameterName == NULL) || (pIndexType == NULL)) {
   1651         ret = OMX_ErrorBadParameter;
   1652         goto EXIT;
   1653     }
   1654     if (pExynosComponent->currentState == OMX_StateInvalid) {
   1655         ret = OMX_ErrorInvalidState;
   1656         goto EXIT;
   1657     }
   1658 
   1659     ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
   1660 
   1661 EXIT:
   1662     FunctionOut();
   1663 
   1664     return ret;
   1665 }
   1666 
   1667 OMX_ERRORTYPE Exynos_Mpeg4Dec_ComponentRoleEnum(
   1668     OMX_IN  OMX_HANDLETYPE hComponent,
   1669     OMX_OUT OMX_U8        *cRole,
   1670     OMX_IN  OMX_U32        nIndex)
   1671 {
   1672     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
   1673     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
   1674     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
   1675     OMX_S32                   codecType;
   1676 
   1677     FunctionIn();
   1678 
   1679     if ((hComponent == NULL) || (cRole == NULL)) {
   1680         ret = OMX_ErrorBadParameter;
   1681         goto EXIT;
   1682     }
   1683     if (nIndex != (MAX_COMPONENT_ROLE_NUM - 1)) {
   1684         ret = OMX_ErrorNoMore;
   1685         goto EXIT;
   1686     }
   1687     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
   1688     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
   1689     if (ret != OMX_ErrorNone) {
   1690         goto EXIT;
   1691     }
   1692     if (pOMXComponent->pComponentPrivate == NULL) {
   1693         ret = OMX_ErrorBadParameter;
   1694         goto EXIT;
   1695     }
   1696     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1697     if (pExynosComponent->currentState == OMX_StateInvalid ) {
   1698         ret = OMX_ErrorInvalidState;
   1699         goto EXIT;
   1700     }
   1701 
   1702     codecType = ((EXYNOS_MPEG4DEC_HANDLE *)(((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
   1703     if (codecType == CODEC_TYPE_MPEG4)
   1704         Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE);
   1705     else
   1706         Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_H263_DEC_ROLE);
   1707 
   1708 EXIT:
   1709     FunctionOut();
   1710 
   1711     return ret;
   1712 }
   1713 
   1714 /* MFC Init */
   1715 OMX_ERRORTYPE Exynos_Mpeg4Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
   1716 {
   1717     OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
   1718     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1719     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec         = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
   1720     EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
   1721     EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
   1722     EXYNOS_MPEG4DEC_HANDLE        *pMpeg4Dec         = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
   1723     OMX_PTR                        hMFCHandle        = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
   1724 
   1725     ExynosVideoDecOps       *pDecOps    = NULL;
   1726     ExynosVideoDecBufferOps *pInbufOps  = NULL;
   1727     ExynosVideoDecBufferOps *pOutbufOps = NULL;
   1728 
   1729     CSC_METHOD csc_method = CSC_METHOD_SW;
   1730     int i, plane;
   1731 
   1732     FunctionIn();
   1733 
   1734     pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_FALSE;
   1735     pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_FALSE;
   1736     pExynosComponent->bUseFlagEOF = OMX_TRUE;
   1737     pExynosComponent->bSaveFlagEOS = OMX_FALSE;
   1738     pExynosComponent->bBehaviorEOS = OMX_FALSE;
   1739 
   1740     /* H.264 Codec Open */
   1741     ret = Mpeg4CodecOpen(pMpeg4Dec);
   1742     if (ret != OMX_ErrorNone) {
   1743         goto EXIT;
   1744     }
   1745 
   1746     pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
   1747     pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
   1748     pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
   1749 
   1750     if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
   1751         OMX_U32 nPlaneSize[MFC_INPUT_BUFFER_PLANE] = {DEFAULT_MFC_INPUT_BUFFER_SIZE};
   1752         Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
   1753         Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
   1754         ret = Exynos_Allocate_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX, MFC_INPUT_BUFFER_NUM_MAX, nPlaneSize);
   1755         if (ret != OMX_ErrorNone)
   1756             goto EXIT;
   1757 
   1758         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++)
   1759             Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
   1760     } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
   1761         /*************/
   1762         /*    TBD    */
   1763         /*************/
   1764         /* Does not require any actions. */
   1765     }
   1766 
   1767     if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
   1768         Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
   1769         Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
   1770     } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
   1771         /*************/
   1772         /*    TBD    */
   1773         /*************/
   1774         /* Does not require any actions. */
   1775     }
   1776 
   1777     pMpeg4Dec->bSourceStart = OMX_FALSE;
   1778     Exynos_OSAL_SignalCreate(&pMpeg4Dec->hSourceStartEvent);
   1779     pMpeg4Dec->bDestinationStart = OMX_FALSE;
   1780     Exynos_OSAL_SignalCreate(&pMpeg4Dec->hDestinationStartEvent);
   1781 
   1782     Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
   1783     Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
   1784     pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp = 0;
   1785     pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp = 0;
   1786 
   1787     pExynosComponent->getAllDelayBuffer = OMX_FALSE;
   1788 
   1789 #if 0//defined(USE_CSC_GSCALER)
   1790     csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
   1791 #endif
   1792     pVideoDec->csc_handle = csc_init(csc_method);
   1793     if (pVideoDec->csc_handle == NULL) {
   1794         ret = OMX_ErrorInsufficientResources;
   1795         goto EXIT;
   1796     }
   1797     pVideoDec->csc_set_format = OMX_FALSE;
   1798 
   1799 EXIT:
   1800     FunctionOut();
   1801 
   1802     return ret;
   1803 }
   1804 
   1805 /* MFC Terminate */
   1806 OMX_ERRORTYPE Exynos_Mpeg4Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
   1807 {
   1808     OMX_ERRORTYPE          ret = OMX_ErrorNone;
   1809     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1810     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
   1811     EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
   1812     EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
   1813     EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1814     OMX_PTR                hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
   1815 
   1816     ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
   1817     ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
   1818     ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
   1819 
   1820     int i, plane;
   1821 
   1822     FunctionIn();
   1823 
   1824     if (pVideoDec->csc_handle != NULL) {
   1825         csc_deinit(pVideoDec->csc_handle);
   1826         pVideoDec->csc_handle = NULL;
   1827     }
   1828 
   1829     Exynos_OSAL_SignalTerminate(pMpeg4Dec->hDestinationStartEvent);
   1830     pMpeg4Dec->hDestinationStartEvent = NULL;
   1831     pMpeg4Dec->bDestinationStart = OMX_FALSE;
   1832     Exynos_OSAL_SignalTerminate(pMpeg4Dec->hSourceStartEvent);
   1833     pMpeg4Dec->hSourceStartEvent = NULL;
   1834     pMpeg4Dec->bSourceStart = OMX_FALSE;
   1835 
   1836     if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
   1837         Exynos_Free_CodecBuffers(pOMXComponent, OUTPUT_PORT_INDEX);
   1838         Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
   1839         Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
   1840     } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
   1841         /*************/
   1842         /*    TBD    */
   1843         /*************/
   1844         /* Does not require any actions. */
   1845     }
   1846 
   1847     if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
   1848         Exynos_Free_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX);
   1849         Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
   1850         Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
   1851     } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
   1852         /*************/
   1853         /*    TBD    */
   1854         /*************/
   1855         /* Does not require any actions. */
   1856     }
   1857     Mpeg4CodecClose(pMpeg4Dec);
   1858 
   1859     Exynos_ResetAllPortConfig(pOMXComponent);
   1860 
   1861 EXIT:
   1862     FunctionOut();
   1863 
   1864     return ret;
   1865 }
   1866 
   1867 OMX_ERRORTYPE Exynos_Mpeg4Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
   1868 {
   1869     OMX_ERRORTYPE               ret = OMX_ErrorNone;
   1870     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1871     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
   1872     EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1873     void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
   1874     EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
   1875     EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
   1876     OMX_U32  oneFrameSize = pSrcInputData->dataLen;
   1877     ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
   1878     ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
   1879     ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
   1880     ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
   1881     int i;
   1882 
   1883     FunctionIn();
   1884 
   1885     if (pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc == OMX_FALSE) {
   1886         ret = Mpeg4CodecSrcSetup(pOMXComponent, pSrcInputData);
   1887         goto EXIT;
   1888     }
   1889     if (pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_FALSE) {
   1890         ret = Mpeg4CodecDstSetup(pOMXComponent);
   1891     }
   1892 
   1893     if ((Check_Stream_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize, pMpeg4Dec->hMFCMpeg4Handle.codecType) == OMX_TRUE) ||
   1894         ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
   1895         pExynosComponent->timeStamp[pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->timeStamp;
   1896         pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->nFlags;
   1897         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp, pSrcInputData->nFlags);
   1898         pDecOps->Set_FrameTag(hMFCHandle, pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp);
   1899         pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp++;
   1900         pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp %= MAX_TIMESTAMP;
   1901 
   1902         /* queue work for input buffer */
   1903         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
   1904         codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
   1905                                     (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
   1906         if (codecReturn != VIDEO_ERROR_NONE) {
   1907             ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
   1908             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
   1909             goto EXIT;
   1910         }
   1911         Mpeg4CodecStart(pOMXComponent, INPUT_PORT_INDEX);
   1912         if (pMpeg4Dec->bSourceStart == OMX_FALSE) {
   1913             pMpeg4Dec->bSourceStart = OMX_TRUE;
   1914             Exynos_OSAL_SignalSet(pMpeg4Dec->hSourceStartEvent);
   1915             Exynos_OSAL_SleepMillisec(0);
   1916         }
   1917         if (pMpeg4Dec->bDestinationStart == OMX_FALSE) {
   1918             pMpeg4Dec->bDestinationStart = OMX_TRUE;
   1919             Exynos_OSAL_SignalSet(pMpeg4Dec->hDestinationStartEvent);
   1920             Exynos_OSAL_SleepMillisec(0);
   1921         }
   1922     }
   1923 
   1924     ret = OMX_ErrorNone;
   1925 
   1926 EXIT:
   1927     FunctionOut();
   1928 
   1929     return ret;
   1930 }
   1931 
   1932 OMX_ERRORTYPE Exynos_Mpeg4Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
   1933 {
   1934     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
   1935     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1936     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
   1937     EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1938     void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
   1939     EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
   1940     ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
   1941     ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
   1942     ExynosVideoBuffer       *pVideoBuffer;
   1943 
   1944     FunctionIn();
   1945 
   1946     pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
   1947 
   1948     pSrcOutputData->dataLen       = 0;
   1949     pSrcOutputData->usedDataLen   = 0;
   1950     pSrcOutputData->remainDataLen = 0;
   1951     pSrcOutputData->nFlags    = 0;
   1952     pSrcOutputData->timeStamp = 0;
   1953 
   1954     if (pVideoBuffer == NULL) {
   1955         pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
   1956         pSrcOutputData->allocSize  = 0;
   1957         pSrcOutputData->pPrivate = NULL;
   1958         pSrcOutputData->bufferHeader = NULL;
   1959     } else {
   1960         pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
   1961         pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
   1962         pSrcOutputData->allocSize  = pVideoBuffer->planes[0].allocSize;
   1963 
   1964         if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
   1965             int i = 0;
   1966             while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
   1967                 if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
   1968                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
   1969                     ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
   1970                     goto EXIT;
   1971                 }
   1972                 i++;
   1973             }
   1974             pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
   1975             pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
   1976         }
   1977 
   1978         /* For Share Buffer */
   1979         pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
   1980     }
   1981 
   1982     ret = OMX_ErrorNone;
   1983 
   1984 EXIT:
   1985     FunctionOut();
   1986 
   1987     return ret;
   1988 }
   1989 
   1990 OMX_ERRORTYPE Exynos_Mpeg4Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
   1991 {
   1992     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
   1993     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1994     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
   1995     EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   1996     void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
   1997     EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
   1998     ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
   1999     ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
   2000     OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
   2001     ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
   2002 
   2003     FunctionIn();
   2004 
   2005     if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
   2006         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
   2007         ret = OMX_ErrorBadParameter;
   2008         goto EXIT;
   2009     }
   2010 
   2011     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x, FD[0]:%d, FD[1]:%d", __FUNCTION__, __LINE__,
   2012                                         pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
   2013                                         pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1],
   2014                                         pDstInputData->buffer.multiPlaneBuffer.fd[0],
   2015                                         pDstInputData->buffer.multiPlaneBuffer.fd[1]);
   2016 
   2017     OMX_U32 nAllocLen[VIDEO_BUFFER_MAX_PLANES] = {0, 0, 0};
   2018     nAllocLen[0] = pExynosOutputPort->portDefinition.format.video.nFrameWidth * pExynosOutputPort->portDefinition.format.video.nFrameHeight;
   2019     nAllocLen[1] = pExynosOutputPort->portDefinition.format.video.nFrameWidth * pExynosOutputPort->portDefinition.format.video.nFrameHeight / 2;
   2020 
   2021     codecReturn = pOutbufOps->ExtensionEnqueue(hMFCHandle,
   2022                                 (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
   2023                                 (unsigned int **)pDstInputData->buffer.multiPlaneBuffer.fd,
   2024                                 (unsigned int *)nAllocLen, (unsigned int *)dataLen,
   2025                                 MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
   2026     if (codecReturn != VIDEO_ERROR_NONE) {
   2027         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
   2028         if (codecReturn != VIDEO_ERROR_WRONGBUFFERSIZE) {
   2029             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
   2030             ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
   2031         }
   2032         goto EXIT;
   2033     }
   2034     Mpeg4CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
   2035 
   2036     ret = OMX_ErrorNone;
   2037 
   2038 EXIT:
   2039     FunctionOut();
   2040 
   2041     return ret;
   2042 }
   2043 
   2044 OMX_ERRORTYPE Exynos_Mpeg4Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
   2045 {
   2046     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
   2047     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   2048     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
   2049     EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   2050     void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
   2051     EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
   2052     EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
   2053     ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
   2054     ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
   2055     ExynosVideoBuffer       *pVideoBuffer;
   2056     ExynosVideoBuffer        videoBuffer;
   2057     ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
   2058     ExynosVideoGeometry *bufferGeometry;
   2059     DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
   2060     OMX_S32 indexTimestamp = 0;
   2061     int plane;
   2062 
   2063     FunctionIn();
   2064 
   2065     if (pMpeg4Dec->bDestinationStart == OMX_FALSE) {
   2066         ret = OMX_ErrorNone;
   2067         goto EXIT;
   2068     }
   2069 
   2070     while (1) {
   2071         Exynos_OSAL_Memset(&videoBuffer, 0, sizeof(ExynosVideoBuffer));
   2072         if (pOutbufOps->ExtensionDequeue(hMFCHandle, &videoBuffer) == VIDEO_ERROR_NONE) {
   2073             pVideoBuffer = &videoBuffer;
   2074         } else {
   2075             pVideoBuffer = NULL;
   2076             ret = OMX_ErrorNone;
   2077             goto EXIT;
   2078         }
   2079         displayStatus = pVideoBuffer->displayStatus;
   2080         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
   2081 
   2082         if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
   2083             (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
   2084             (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
   2085             (displayStatus == VIDEO_FRAME_STATUS_DECODING_FINISHED) ||
   2086             (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
   2087             if (pVideoBuffer != NULL) {
   2088                 ret = OMX_ErrorNone;
   2089                 break;
   2090             } else {
   2091                 ret = OMX_ErrorUndefined;
   2092                 break;
   2093             }
   2094         }
   2095     }
   2096 
   2097     if ((pVideoDec->bThumbnailMode == OMX_FALSE) &&
   2098         (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL)) {
   2099         if (pVideoDec->bReconfigDPB != OMX_TRUE) {
   2100             pExynosOutputPort->exceptionFlag = NEED_PORT_FLUSH;
   2101             pVideoDec->bReconfigDPB = OMX_TRUE;
   2102             Mpeg4CodecCheckResolutionChange(pOMXComponent);
   2103             pVideoDec->csc_set_format = OMX_FALSE;
   2104         }
   2105         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "VIDEO_FRAME_STATUS_CHANGE_RESOL");
   2106         ret = OMX_ErrorNone;
   2107         goto EXIT;
   2108     }
   2109 
   2110     if (ret != OMX_ErrorNone)
   2111         goto EXIT;
   2112 
   2113     pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp++;
   2114     pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
   2115 
   2116     pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
   2117     for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
   2118         pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
   2119         pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
   2120         pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
   2121         pDstOutputData->dataLen +=  pVideoBuffer->planes[plane].dataSize;
   2122     }
   2123     pDstOutputData->usedDataLen = 0;
   2124     pDstOutputData->pPrivate = pVideoBuffer;
   2125     if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
   2126         int i = 0;
   2127         pDstOutputData->pPrivate = NULL;
   2128         for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
   2129             if (pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[0] ==
   2130                 pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[0]) {
   2131                 pDstOutputData->pPrivate = pVideoDec->pMFCDecOutputBuffer[i];
   2132                 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x, FD[0]:%d, FD[1]:%d", __FUNCTION__, __LINE__,
   2133                                     pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[0],
   2134                                     pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[1],
   2135                                     pVideoDec->pMFCDecOutputBuffer[i]->fd[0],
   2136                                     pVideoDec->pMFCDecOutputBuffer[i]->fd[1]);
   2137                 break;
   2138             }
   2139         }
   2140 
   2141         if (pDstOutputData->pPrivate == NULL) {
   2142             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
   2143             ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
   2144             goto EXIT;
   2145         }
   2146     }
   2147     /* For Share Buffer */
   2148     pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
   2149 
   2150     pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
   2151     bufferGeometry = &pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf;
   2152     pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
   2153     pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
   2154     Exynos_OSAL_Memcpy(&pBufferInfo->PDSB, &pVideoBuffer->PDSB, sizeof(PrivateDataShareBuffer));
   2155     switch (bufferGeometry->eColorFormat) {
   2156     case VIDEO_COLORFORMAT_NV12:
   2157         pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
   2158         break;
   2159     case VIDEO_COLORFORMAT_NV12_TILED:
   2160     default:
   2161         pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
   2162         break;
   2163     }
   2164 
   2165     indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
   2166     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
   2167     if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
   2168         if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
   2169             (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
   2170             pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
   2171             pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
   2172             pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp] = 0x00;
   2173             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
   2174         } else {
   2175             pDstOutputData->timeStamp = 0x00;
   2176             pDstOutputData->nFlags = 0x00;
   2177         }
   2178     } else {
   2179         /* For timestamp correction. if mfc support frametype detect */
   2180         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
   2181 #ifdef NEED_TIMESTAMP_REORDER
   2182         if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
   2183             pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
   2184             pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
   2185             pExynosComponent->nFlags[indexTimestamp] = 0x00;
   2186             pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp = indexTimestamp;
   2187         } else {
   2188             pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
   2189             pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
   2190             pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp] = 0x00;
   2191         }
   2192 #else
   2193         pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
   2194         pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
   2195         pExynosComponent->nFlags[indexTimestamp] = 0x00;
   2196 #endif
   2197         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData->timeStamp, pDstOutputData->timeStamp / 1E6, indexTimestamp, pDstOutputData->nFlags);
   2198     }
   2199 
   2200     if ((displayStatus == VIDEO_FRAME_STATUS_DECODING_FINISHED) ||
   2201         ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
   2202         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
   2203         pDstOutputData->remainDataLen = 0;
   2204         if (((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) &&
   2205             (pExynosComponent->bBehaviorEOS == OMX_TRUE)) {
   2206             pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
   2207             pExynosComponent->bBehaviorEOS = OMX_FALSE;
   2208         }
   2209     } else {
   2210         pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
   2211     }
   2212 
   2213     ret = OMX_ErrorNone;
   2214 
   2215 EXIT:
   2216     FunctionOut();
   2217 
   2218     return ret;
   2219 }
   2220 
   2221 OMX_ERRORTYPE Exynos_Mpeg4Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
   2222 {
   2223     OMX_ERRORTYPE             ret = OMX_ErrorNone;
   2224     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   2225     EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   2226     EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
   2227 
   2228     FunctionIn();
   2229 
   2230     if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
   2231         ret = OMX_ErrorNone;
   2232         goto EXIT;
   2233     }
   2234     if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
   2235         ret = OMX_ErrorNone;
   2236         goto EXIT;
   2237     }
   2238 
   2239     ret = Exynos_Mpeg4Dec_SrcIn(pOMXComponent, pSrcInputData);
   2240     if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
   2241         pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
   2242                                                 pExynosComponent->callbackData,
   2243                                                 OMX_EventError, ret, 0, NULL);
   2244     }
   2245 
   2246 EXIT:
   2247     FunctionOut();
   2248 
   2249     return ret;
   2250 }
   2251 
   2252 OMX_ERRORTYPE Exynos_Mpeg4Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
   2253 {
   2254     OMX_ERRORTYPE             ret = OMX_ErrorNone;
   2255     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   2256     EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   2257     EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
   2258 
   2259     FunctionIn();
   2260 
   2261     if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
   2262         ret = OMX_ErrorNone;
   2263         goto EXIT;
   2264     }
   2265 
   2266     if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
   2267         if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
   2268             ret = OMX_ErrorNone;
   2269             goto EXIT;
   2270         }
   2271     }
   2272     if ((pMpeg4Dec->bSourceStart == OMX_FALSE) &&
   2273        (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
   2274         Exynos_OSAL_SignalWait(pMpeg4Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
   2275         Exynos_OSAL_SignalReset(pMpeg4Dec->hSourceStartEvent);
   2276     }
   2277 
   2278     ret = Exynos_Mpeg4Dec_SrcOut(pOMXComponent, pSrcOutputData);
   2279     if ((ret != OMX_ErrorNone) &&
   2280         (pExynosComponent->currentState == OMX_StateExecuting)) {
   2281         pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
   2282                                                 pExynosComponent->callbackData,
   2283                                                 OMX_EventError, ret, 0, NULL);
   2284     }
   2285 
   2286 EXIT:
   2287     FunctionOut();
   2288 
   2289     return ret;
   2290 }
   2291 
   2292 OMX_ERRORTYPE Exynos_Mpeg4Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
   2293 {
   2294     OMX_ERRORTYPE             ret = OMX_ErrorNone;
   2295     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   2296     EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   2297     EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
   2298 
   2299     FunctionIn();
   2300 
   2301     if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
   2302         ret = OMX_ErrorNone;
   2303         goto EXIT;
   2304     }
   2305     if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
   2306         ret = OMX_ErrorNone;
   2307         goto EXIT;
   2308     }
   2309     if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
   2310         if ((pMpeg4Dec->bDestinationStart == OMX_FALSE) &&
   2311            (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
   2312             Exynos_OSAL_SignalWait(pMpeg4Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
   2313             Exynos_OSAL_SignalReset(pMpeg4Dec->hDestinationStartEvent);
   2314         }
   2315     }
   2316     if (pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_TRUE) {
   2317         ret = Exynos_Mpeg4Dec_DstIn(pOMXComponent, pDstInputData);
   2318         if (ret != OMX_ErrorNone) {
   2319             pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
   2320                                                 pExynosComponent->callbackData,
   2321                                                 OMX_EventError, ret, 0, NULL);
   2322         }
   2323     }
   2324 
   2325 EXIT:
   2326     FunctionOut();
   2327 
   2328     return ret;
   2329 }
   2330 
   2331 OMX_ERRORTYPE Exynos_Mpeg4Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
   2332 {
   2333     OMX_ERRORTYPE             ret = OMX_ErrorNone;
   2334     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   2335     EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
   2336     EXYNOS_OMX_BASEPORT     *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
   2337 
   2338     FunctionIn();
   2339 
   2340     if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
   2341         ret = OMX_ErrorNone;
   2342         goto EXIT;
   2343     }
   2344     if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
   2345         ret = OMX_ErrorNone;
   2346         goto EXIT;
   2347     }
   2348 
   2349     if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
   2350         if ((pMpeg4Dec->bDestinationStart == OMX_FALSE) &&
   2351             (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
   2352             Exynos_OSAL_SignalWait(pMpeg4Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
   2353             Exynos_OSAL_SignalReset(pMpeg4Dec->hDestinationStartEvent);
   2354         }
   2355     }
   2356     ret = Exynos_Mpeg4Dec_DstOut(pOMXComponent, pDstOutputData);
   2357     if ((ret != OMX_ErrorNone) &&
   2358         (pExynosComponent->currentState == OMX_StateExecuting)) {
   2359         pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
   2360                                                 pExynosComponent->callbackData,
   2361                                                 OMX_EventError, ret, 0, NULL);
   2362     }
   2363 
   2364 EXIT:
   2365     FunctionOut();
   2366 
   2367     return ret;
   2368 }
   2369 
   2370 OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName)
   2371 {
   2372     OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
   2373     OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
   2374     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
   2375     EXYNOS_OMX_BASEPORT           *pExynosPort      = NULL;
   2376     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec        = NULL;
   2377     EXYNOS_MPEG4DEC_HANDLE        *pMpeg4Dec        = NULL;
   2378     int i = 0;
   2379     OMX_S32 codecType = -1;
   2380 
   2381     FunctionIn();
   2382 
   2383     if ((hComponent == NULL) || (componentName == NULL)) {
   2384         ret = OMX_ErrorBadParameter;
   2385         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
   2386         goto EXIT;
   2387     }
   2388     if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG4_DEC, componentName) == 0) {
   2389         codecType = CODEC_TYPE_MPEG4;
   2390     } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H263_DEC, componentName) == 0) {
   2391         codecType = CODEC_TYPE_H263;
   2392     } else {
   2393         ret = OMX_ErrorBadParameter;
   2394         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
   2395         goto EXIT;
   2396     }
   2397 
   2398     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
   2399     ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
   2400     if (ret != OMX_ErrorNone) {
   2401         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
   2402         goto EXIT;
   2403     }
   2404     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   2405     pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
   2406 
   2407     pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
   2408     if (pExynosComponent->componentName == NULL) {
   2409         Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
   2410         ret = OMX_ErrorInsufficientResources;
   2411         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
   2412         goto EXIT;
   2413     }
   2414     Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
   2415 
   2416     pMpeg4Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG4DEC_HANDLE));
   2417     if (pMpeg4Dec == NULL) {
   2418         Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
   2419         ret = OMX_ErrorInsufficientResources;
   2420         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
   2421         goto EXIT;
   2422     }
   2423     Exynos_OSAL_Memset(pMpeg4Dec, 0, sizeof(EXYNOS_MPEG4DEC_HANDLE));
   2424     pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
   2425     pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pMpeg4Dec;
   2426     pMpeg4Dec->hMFCMpeg4Handle.codecType = codecType;
   2427 
   2428     if (codecType == CODEC_TYPE_MPEG4)
   2429         Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MPEG4_DEC);
   2430     else
   2431         Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H263_DEC);
   2432 
   2433     /* Set componentVersion */
   2434     pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
   2435     pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
   2436     pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
   2437     pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
   2438     /* Set specVersion */
   2439     pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
   2440     pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
   2441     pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
   2442     pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
   2443 
   2444     /* Input port */
   2445     pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
   2446     pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
   2447     pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
   2448     pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
   2449     pExynosPort->portDefinition.format.video.nSliceHeight = 0;
   2450     pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
   2451     if (codecType == CODEC_TYPE_MPEG4) {
   2452         pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
   2453         Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
   2454         Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/mpeg4");
   2455     } else {
   2456         pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
   2457         Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
   2458         Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/h263");
   2459     }
   2460     pExynosPort->portDefinition.format.video.pNativeRender = 0;
   2461     pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
   2462     pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
   2463     pExynosPort->portDefinition.bEnabled = OMX_TRUE;
   2464     pExynosPort->bufferProcessType = BUFFER_SHARE;
   2465     pExynosPort->portWayType = WAY2_PORT;
   2466 
   2467     /* Output port */
   2468     pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
   2469     pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
   2470     pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
   2471     pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
   2472     pExynosPort->portDefinition.format.video.nSliceHeight = 0;
   2473     pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
   2474     pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
   2475     Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
   2476     Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
   2477     pExynosPort->portDefinition.format.video.pNativeRender = 0;
   2478     pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
   2479     pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
   2480     pExynosPort->portDefinition.bEnabled = OMX_TRUE;
   2481     pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE;
   2482     pExynosPort->portWayType = WAY2_PORT;
   2483 
   2484     if (codecType == CODEC_TYPE_MPEG4) {
   2485         for(i = 0; i < ALL_PORT_NUM; i++) {
   2486             INIT_SET_SIZE_VERSION(&pMpeg4Dec->mpeg4Component[i], OMX_VIDEO_PARAM_MPEG4TYPE);
   2487             pMpeg4Dec->mpeg4Component[i].nPortIndex = i;
   2488             pMpeg4Dec->mpeg4Component[i].eProfile   = OMX_VIDEO_MPEG4ProfileSimple;
   2489             pMpeg4Dec->mpeg4Component[i].eLevel     = OMX_VIDEO_MPEG4Level3;
   2490         }
   2491     } else {
   2492         for(i = 0; i < ALL_PORT_NUM; i++) {
   2493             INIT_SET_SIZE_VERSION(&pMpeg4Dec->h263Component[i], OMX_VIDEO_PARAM_H263TYPE);
   2494             pMpeg4Dec->h263Component[i].nPortIndex = i;
   2495             pMpeg4Dec->h263Component[i].eProfile   = OMX_VIDEO_H263ProfileBaseline | OMX_VIDEO_H263ProfileISWV2;
   2496             pMpeg4Dec->h263Component[i].eLevel     = OMX_VIDEO_H263Level45;
   2497         }
   2498     }
   2499 
   2500     pOMXComponent->GetParameter      = &Exynos_Mpeg4Dec_GetParameter;
   2501     pOMXComponent->SetParameter      = &Exynos_Mpeg4Dec_SetParameter;
   2502     pOMXComponent->GetConfig         = &Exynos_Mpeg4Dec_GetConfig;
   2503     pOMXComponent->SetConfig         = &Exynos_Mpeg4Dec_SetConfig;
   2504     pOMXComponent->GetExtensionIndex = &Exynos_Mpeg4Dec_GetExtensionIndex;
   2505     pOMXComponent->ComponentRoleEnum = &Exynos_Mpeg4Dec_ComponentRoleEnum;
   2506     pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
   2507 
   2508     pExynosComponent->exynos_codec_componentInit      = &Exynos_Mpeg4Dec_Init;
   2509     pExynosComponent->exynos_codec_componentTerminate = &Exynos_Mpeg4Dec_Terminate;
   2510 
   2511     pVideoDec->exynos_codec_srcInputProcess  = &Exynos_Mpeg4Dec_srcInputBufferProcess;
   2512     pVideoDec->exynos_codec_srcOutputProcess = &Exynos_Mpeg4Dec_srcOutputBufferProcess;
   2513     pVideoDec->exynos_codec_dstInputProcess  = &Exynos_Mpeg4Dec_dstInputBufferProcess;
   2514     pVideoDec->exynos_codec_dstOutputProcess = &Exynos_Mpeg4Dec_dstOutputBufferProcess;
   2515 
   2516     pVideoDec->exynos_codec_start            = &Mpeg4CodecStart;
   2517     pVideoDec->exynos_codec_stop             = &Mpeg4CodecStop;
   2518     pVideoDec->exynos_codec_bufferProcessRun = &Mpeg4CodecOutputBufferProcessRun;
   2519     pVideoDec->exynos_codec_enqueueAllBuffer = &Mpeg4CodecEnQueueAllBuffer;
   2520 
   2521     if (codecType == CODEC_TYPE_MPEG4)
   2522         pVideoDec->exynos_checkInputFrame = &Check_Mpeg4_Frame;
   2523     else
   2524         pVideoDec->exynos_checkInputFrame = &Check_H263_Frame;
   2525 
   2526     pVideoDec->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
   2527     pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
   2528     pVideoDec->exynos_codec_reconfigAllBuffers        = &Mpeg4CodecReconfigAllBuffers;
   2529 
   2530     pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
   2531     if (pVideoDec->hSharedMemory == NULL) {
   2532         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
   2533         Exynos_OSAL_Free(pMpeg4Dec);
   2534         pMpeg4Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
   2535         Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
   2536         ret = OMX_ErrorInsufficientResources;
   2537         goto EXIT;
   2538     }
   2539 
   2540     pExynosComponent->currentState = OMX_StateLoaded;
   2541 
   2542     ret = OMX_ErrorNone;
   2543 
   2544 EXIT:
   2545     FunctionOut();
   2546 
   2547     return ret;
   2548 }
   2549 
   2550 OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
   2551 {
   2552     OMX_ERRORTYPE            ret = OMX_ErrorNone;
   2553     OMX_COMPONENTTYPE       *pOMXComponent = NULL;
   2554     EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
   2555     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
   2556     EXYNOS_MPEG4DEC_HANDLE      *pMpeg4Dec = NULL;
   2557 
   2558     FunctionIn();
   2559 
   2560     if (hComponent == NULL) {
   2561         ret = OMX_ErrorBadParameter;
   2562         goto EXIT;
   2563     }
   2564     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
   2565     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   2566     pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
   2567 
   2568     Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
   2569 
   2570     Exynos_OSAL_Free(pExynosComponent->componentName);
   2571     pExynosComponent->componentName = NULL;
   2572 
   2573     pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
   2574     if (pMpeg4Dec != NULL) {
   2575         Exynos_OSAL_Free(pMpeg4Dec);
   2576         pMpeg4Dec = pVideoDec->hCodecHandle = NULL;
   2577     }
   2578 
   2579     ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
   2580     if (ret != OMX_ErrorNone) {
   2581         goto EXIT;
   2582     }
   2583 
   2584     ret = OMX_ErrorNone;
   2585 
   2586 EXIT:
   2587     FunctionOut();
   2588 
   2589     return ret;
   2590 }
   2591