Home | History | Annotate | Download | only in dec
      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_VdecControl.c
     20  * @brief
     21  * @author      SeungBeom Kim (sbcrux.kim (at) samsung.com)
     22  * @version     2.0.0
     23  * @history
     24  *   2012.02.20 : Create
     25  */
     26 
     27 #include <stdio.h>
     28 #include <stdlib.h>
     29 #include <string.h>
     30 #include "Exynos_OMX_Macros.h"
     31 #include "Exynos_OSAL_Event.h"
     32 #include "Exynos_OMX_Vdec.h"
     33 #include "Exynos_OMX_VdecControl.h"
     34 #include "Exynos_OMX_Basecomponent.h"
     35 #include "Exynos_OSAL_Thread.h"
     36 #include "Exynos_OSAL_Semaphore.h"
     37 #include "Exynos_OSAL_Mutex.h"
     38 #include "Exynos_OSAL_ETC.h"
     39 #include "Exynos_OSAL_SharedMemory.h"
     40 #include "Exynos_OSAL_Queue.h"
     41 #include "csc.h"
     42 
     43 #ifdef USE_ANB
     44 #include "Exynos_OSAL_Android.h"
     45 #endif
     46 
     47 #undef  EXYNOS_LOG_TAG
     48 #define EXYNOS_LOG_TAG    "EXYNOS_VIDEO_DECCONTROL"
     49 #define EXYNOS_LOG_OFF
     50 //#define EXYNOS_TRACE_ON
     51 #include "Exynos_OSAL_Log.h"
     52 
     53 
     54 OMX_ERRORTYPE Exynos_OMX_UseBuffer(
     55     OMX_IN OMX_HANDLETYPE            hComponent,
     56     OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,
     57     OMX_IN OMX_U32                   nPortIndex,
     58     OMX_IN OMX_PTR                   pAppPrivate,
     59     OMX_IN OMX_U32                   nSizeBytes,
     60     OMX_IN OMX_U8                   *pBuffer)
     61 {
     62     OMX_ERRORTYPE          ret = OMX_ErrorNone;
     63     OMX_COMPONENTTYPE     *pOMXComponent = NULL;
     64     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
     65     EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
     66     OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
     67     OMX_U32                i = 0;
     68 
     69     FunctionIn();
     70 
     71     if (hComponent == NULL) {
     72         ret = OMX_ErrorBadParameter;
     73         goto EXIT;
     74     }
     75     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
     76     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
     77     if (ret != OMX_ErrorNone) {
     78         goto EXIT;
     79     }
     80 
     81     if (pOMXComponent->pComponentPrivate == NULL) {
     82         ret = OMX_ErrorBadParameter;
     83         goto EXIT;
     84     }
     85     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
     86 
     87     pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
     88     if (nPortIndex >= pExynosComponent->portParam.nPorts) {
     89         ret = OMX_ErrorBadPortIndex;
     90         goto EXIT;
     91     }
     92     if (pExynosPort->portState != OMX_StateIdle) {
     93         ret = OMX_ErrorIncorrectStateOperation;
     94         goto EXIT;
     95     }
     96 
     97     if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
     98         ret = OMX_ErrorBadPortIndex;
     99         goto EXIT;
    100     }
    101 
    102     temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
    103     if (temp_bufferHeader == NULL) {
    104         ret = OMX_ErrorInsufficientResources;
    105         goto EXIT;
    106     }
    107     Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
    108 
    109     for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
    110         if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
    111             pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
    112             pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ASSIGNED | HEADER_STATE_ALLOCATED);
    113             INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
    114             temp_bufferHeader->pBuffer        = pBuffer;
    115             temp_bufferHeader->nAllocLen      = nSizeBytes;
    116             temp_bufferHeader->pAppPrivate    = pAppPrivate;
    117             if (nPortIndex == INPUT_PORT_INDEX)
    118                 temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
    119             else
    120                 temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
    121 
    122             pExynosPort->assignedBufferNum++;
    123             if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
    124                 pExynosPort->portDefinition.bPopulated = OMX_TRUE;
    125                 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
    126                 Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
    127                 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
    128             }
    129             *ppBufferHdr = temp_bufferHeader;
    130             ret = OMX_ErrorNone;
    131             goto EXIT;
    132         }
    133     }
    134 
    135     Exynos_OSAL_Free(temp_bufferHeader);
    136     ret = OMX_ErrorInsufficientResources;
    137 
    138 EXIT:
    139     FunctionOut();
    140 
    141     return ret;
    142 }
    143 
    144 OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
    145     OMX_IN OMX_HANDLETYPE            hComponent,
    146     OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer,
    147     OMX_IN OMX_U32                   nPortIndex,
    148     OMX_IN OMX_PTR                   pAppPrivate,
    149     OMX_IN OMX_U32                   nSizeBytes)
    150 {
    151     OMX_ERRORTYPE          ret = OMX_ErrorNone;
    152     OMX_COMPONENTTYPE     *pOMXComponent = NULL;
    153     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
    154     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
    155     EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
    156     OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
    157     OMX_U8                *temp_buffer = NULL;
    158     int                    temp_buffer_fd = -1;
    159     OMX_U32                i = 0;
    160     MEMORY_TYPE            mem_type;
    161 
    162     FunctionIn();
    163 
    164     if (hComponent == NULL) {
    165         ret = OMX_ErrorBadParameter;
    166         goto EXIT;
    167     }
    168     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
    169     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
    170     if (ret != OMX_ErrorNone) {
    171         goto EXIT;
    172     }
    173 
    174     if (pOMXComponent->pComponentPrivate == NULL) {
    175         ret = OMX_ErrorBadParameter;
    176         goto EXIT;
    177     }
    178     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    179     pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
    180 
    181     pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
    182     if (nPortIndex >= pExynosComponent->portParam.nPorts) {
    183         ret = OMX_ErrorBadPortIndex;
    184         goto EXIT;
    185     }
    186 /*
    187     if (pExynosPort->portState != OMX_StateIdle ) {
    188         ret = OMX_ErrorIncorrectStateOperation;
    189         goto EXIT;
    190     }
    191 */
    192     if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
    193         ret = OMX_ErrorBadPortIndex;
    194         goto EXIT;
    195     }
    196 
    197     if ((pVideoDec->bDRMPlayerMode == OMX_TRUE) && (nPortIndex == INPUT_PORT_INDEX)) {
    198         mem_type = SECURE_MEMORY;
    199     } else if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
    200         mem_type = NORMAL_MEMORY;
    201     } else {
    202         mem_type = SYSTEM_MEMORY;
    203     }
    204     temp_buffer = Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nSizeBytes, mem_type);
    205     if (temp_buffer == NULL) {
    206         ret = OMX_ErrorInsufficientResources;
    207         goto EXIT;
    208     }
    209     temp_buffer_fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, temp_buffer);
    210 
    211     temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
    212     if (temp_bufferHeader == NULL) {
    213         Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);
    214         ret = OMX_ErrorInsufficientResources;
    215         goto EXIT;
    216     }
    217     Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
    218 
    219     for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
    220         if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
    221             pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
    222             pExynosPort->extendBufferHeader[i].buf_fd[0] = temp_buffer_fd;
    223             pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);
    224             INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
    225             if (mem_type == SECURE_MEMORY)
    226                 temp_bufferHeader->pBuffer = temp_buffer_fd;
    227             else
    228                 temp_bufferHeader->pBuffer = temp_buffer;
    229             temp_bufferHeader->nAllocLen      = nSizeBytes;
    230             temp_bufferHeader->pAppPrivate    = pAppPrivate;
    231             if (nPortIndex == INPUT_PORT_INDEX)
    232                 temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
    233             else
    234                 temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
    235             pExynosPort->assignedBufferNum++;
    236             if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
    237                 pExynosPort->portDefinition.bPopulated = OMX_TRUE;
    238                 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
    239                 Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
    240                 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
    241             }
    242             *ppBuffer = temp_bufferHeader;
    243             ret = OMX_ErrorNone;
    244             goto EXIT;
    245         }
    246     }
    247 
    248     Exynos_OSAL_Free(temp_bufferHeader);
    249     Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);
    250 
    251     ret = OMX_ErrorInsufficientResources;
    252 
    253 EXIT:
    254     FunctionOut();
    255 
    256     return ret;
    257 }
    258 
    259 OMX_ERRORTYPE Exynos_OMX_FreeBuffer(
    260     OMX_IN OMX_HANDLETYPE hComponent,
    261     OMX_IN OMX_U32        nPortIndex,
    262     OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr)
    263 {
    264     OMX_ERRORTYPE          ret = OMX_ErrorNone;
    265     OMX_COMPONENTTYPE     *pOMXComponent = NULL;
    266     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
    267     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
    268     EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
    269     OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
    270     OMX_U8                *temp_buffer = NULL;
    271     OMX_U32                i = 0;
    272 
    273     FunctionIn();
    274 
    275     if (hComponent == NULL) {
    276         ret = OMX_ErrorBadParameter;
    277         goto EXIT;
    278     }
    279     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
    280     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
    281     if (ret != OMX_ErrorNone) {
    282         goto EXIT;
    283     }
    284 
    285     if (pOMXComponent->pComponentPrivate == NULL) {
    286         ret = OMX_ErrorBadParameter;
    287         goto EXIT;
    288     }
    289     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    290     pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
    291     pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
    292 
    293     if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
    294         ret = OMX_ErrorBadPortIndex;
    295         goto EXIT;
    296     }
    297 
    298     if ((pExynosPort->portState != OMX_StateLoaded) && (pExynosPort->portState != OMX_StateInvalid)) {
    299         (*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent,
    300                         pExynosComponent->callbackData,
    301                         (OMX_U32)OMX_EventError,
    302                         (OMX_U32)OMX_ErrorPortUnpopulated,
    303                         nPortIndex, NULL);
    304     }
    305 
    306     for (i = 0; i < /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM; i++) {
    307         if (((pExynosPort->bufferStateAllocate[i] | BUFFER_STATE_FREE) != 0) && (pExynosPort->extendBufferHeader[i].OMXBufferHeader != NULL)) {
    308             if (pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer == pBufferHdr->pBuffer) {
    309                 if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) {
    310                     if ((pVideoDec->bDRMPlayerMode == OMX_TRUE) && (nPortIndex == INPUT_PORT_INDEX)) {
    311                         OMX_PTR mapBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec->hSharedMemory, (int)pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
    312                         Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, mapBuffer);
    313                     } else {
    314                         Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
    315                     }
    316                     pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer = NULL;
    317                     pBufferHdr->pBuffer = NULL;
    318                 } else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) {
    319                     ; /* None*/
    320                 }
    321                 pExynosPort->assignedBufferNum--;
    322                 if (pExynosPort->bufferStateAllocate[i] & HEADER_STATE_ALLOCATED) {
    323                     Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader);
    324                     pExynosPort->extendBufferHeader[i].OMXBufferHeader = NULL;
    325                     pBufferHdr = NULL;
    326                 }
    327                 pExynosPort->bufferStateAllocate[i] = BUFFER_STATE_FREE;
    328                 ret = OMX_ErrorNone;
    329                 goto EXIT;
    330             }
    331         }
    332     }
    333 
    334 EXIT:
    335     if (ret == OMX_ErrorNone) {
    336         if (pExynosPort->assignedBufferNum == 0) {
    337             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosPort->unloadedResource signal set");
    338             /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
    339             Exynos_OSAL_SemaphorePost(pExynosPort->unloadedResource);
    340             /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
    341             pExynosPort->portDefinition.bPopulated = OMX_FALSE;
    342         }
    343     }
    344 
    345     FunctionOut();
    346 
    347     return ret;
    348 }
    349 
    350 OMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
    351 {
    352     OMX_ERRORTYPE                 ret = OMX_ErrorNone;
    353     EXYNOS_OMX_BASEPORT             *pExynosPort = NULL;
    354     OMX_BUFFERHEADERTYPE         *temp_bufferHeader = NULL;
    355     OMX_U8                       *temp_buffer = NULL;
    356     OMX_U32                       bufferSize = 0;
    357     OMX_PARAM_PORTDEFINITIONTYPE  portDefinition;
    358 
    359     ret = OMX_ErrorTunnelingUnsupported;
    360 EXIT:
    361     return ret;
    362 }
    363 
    364 OMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
    365 {
    366     OMX_ERRORTYPE ret = OMX_ErrorNone;
    367     EXYNOS_OMX_BASEPORT* pExynosPort = NULL;
    368     OMX_BUFFERHEADERTYPE* temp_bufferHeader = NULL;
    369     OMX_U8 *temp_buffer = NULL;
    370     OMX_U32 bufferSize = 0;
    371 
    372     ret = OMX_ErrorTunnelingUnsupported;
    373 EXIT:
    374     return ret;
    375 }
    376 
    377 OMX_ERRORTYPE Exynos_OMX_ComponentTunnelRequest(
    378     OMX_IN OMX_HANDLETYPE hComp,
    379     OMX_IN OMX_U32        nPort,
    380     OMX_IN OMX_HANDLETYPE hTunneledComp,
    381     OMX_IN OMX_U32        nTunneledPort,
    382     OMX_INOUT OMX_TUNNELSETUPTYPE *pTunnelSetup)
    383 {
    384     OMX_ERRORTYPE ret = OMX_ErrorNone;
    385 
    386     ret = OMX_ErrorTunnelingUnsupported;
    387 EXIT:
    388     return ret;
    389 }
    390 
    391 OMX_ERRORTYPE Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_DATABUFFER *pDataBuffer[])
    392 {
    393     OMX_ERRORTYPE ret = OMX_ErrorNone;
    394 
    395     FunctionIn();
    396 
    397     *pDataBuffer = NULL;
    398 
    399     if (pExynosPort->portWayType == WAY1_PORT) {
    400         *pDataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
    401     } else if (pExynosPort->portWayType == WAY2_PORT) {
    402             pDataBuffer[0] = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
    403             pDataBuffer[1] = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
    404     }
    405 
    406 EXIT:
    407     FunctionOut();
    408 
    409     return ret;
    410 }
    411 
    412 OMX_ERRORTYPE Exynos_OMX_FlushPort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
    413 {
    414     OMX_ERRORTYPE          ret = OMX_ErrorNone;
    415     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    416     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
    417     EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
    418     OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;
    419     EXYNOS_OMX_DATABUFFER    *pDataPortBuffer[2] = {NULL, NULL};
    420     EXYNOS_OMX_MESSAGE       *message = NULL;
    421     OMX_U32                flushNum = 0;
    422     OMX_S32                semValue = 0;
    423     int i = 0, maxBufferNum = 0;
    424     FunctionIn();
    425 
    426     pExynosPort = &pExynosComponent->pExynosPort[portIndex];
    427 
    428     while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
    429         Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &semValue);
    430         if (semValue == 0)
    431             Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[portIndex].bufferSemID);
    432 
    433         Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
    434         message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
    435         if ((message != NULL) && (message->messageType != EXYNOS_OMX_CommandFakeBuffer)) {
    436             bufferHeader = (OMX_BUFFERHEADERTYPE *)message->pCmdData;
    437             bufferHeader->nFilledLen = 0;
    438 
    439             if (portIndex == OUTPUT_PORT_INDEX) {
    440                 Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);
    441             } else if (portIndex == INPUT_PORT_INDEX) {
    442                 Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);
    443             }
    444         }
    445         Exynos_OSAL_Free(message);
    446         message = NULL;
    447     }
    448 
    449     Exynos_OMX_GetFlushBuffer(pExynosPort, pDataPortBuffer);
    450     if (portIndex == INPUT_PORT_INDEX) {
    451         if (pDataPortBuffer[0]->dataValid == OMX_TRUE)
    452             Exynos_InputBufferReturn(pOMXComponent, pDataPortBuffer[0]);
    453         if (pDataPortBuffer[1]->dataValid == OMX_TRUE)
    454             Exynos_InputBufferReturn(pOMXComponent, pDataPortBuffer[1]);
    455     } else if (portIndex == OUTPUT_PORT_INDEX) {
    456         if (pDataPortBuffer[0]->dataValid == OMX_TRUE)
    457             Exynos_OutputBufferReturn(pOMXComponent, pDataPortBuffer[0]);
    458         if (pDataPortBuffer[1]->dataValid == OMX_TRUE)
    459             Exynos_OutputBufferReturn(pOMXComponent, pDataPortBuffer[1]);
    460     }
    461 
    462     if (pExynosComponent->bMultiThreadProcess == OMX_TRUE) {
    463         if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
    464             if (pExynosPort->processData.bufferHeader != NULL) {
    465                 if (portIndex == INPUT_PORT_INDEX) {
    466                     Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);
    467                 } else if (portIndex == OUTPUT_PORT_INDEX) {
    468                     Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);
    469                 }
    470             }
    471             Exynos_ResetCodecData(&pExynosPort->processData);
    472 
    473             maxBufferNum = pExynosPort->portDefinition.nBufferCountActual;
    474             for (i = 0; i < maxBufferNum; i++) {
    475                 if (pExynosPort->extendBufferHeader[i].bBufferInOMX == OMX_TRUE) {
    476                     if (portIndex == OUTPUT_PORT_INDEX) {
    477                         Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);
    478                     } else if (portIndex == INPUT_PORT_INDEX) {
    479                         Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);
    480                     }
    481                 }
    482             }
    483         }
    484     } else {
    485         Exynos_ResetCodecData(&pExynosPort->processData);
    486     }
    487 
    488     if ((pExynosPort->bufferProcessType == BUFFER_SHARE) &&
    489         (portIndex == OUTPUT_PORT_INDEX)){
    490         EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
    491 
    492         if (pOMXComponent->pComponentPrivate == NULL) {
    493             ret = OMX_ErrorBadParameter;
    494             goto EXIT;
    495         }
    496         pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    497         pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
    498 
    499         Exynos_OSAL_RefANB_Reset(pVideoDec->hRefHandle);
    500     }
    501 
    502     while(1) {
    503         OMX_S32 cnt = 0;
    504         Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &cnt);
    505         if (cnt <= 0)
    506             break;
    507         Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
    508     }
    509     Exynos_OSAL_ResetQueue(&pExynosPort->bufferQ);
    510 
    511 EXIT:
    512     FunctionOut();
    513 
    514     return ret;
    515 }
    516 
    517 OMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)
    518 {
    519     OMX_ERRORTYPE             ret = OMX_ErrorNone;
    520     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
    521     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
    522     EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
    523     EXYNOS_OMX_DATABUFFER    *flushPortBuffer[2] = {NULL, NULL};
    524     OMX_U32                   i = 0, cnt = 0;
    525 
    526     FunctionIn();
    527 
    528     if (pOMXComponent == NULL) {
    529         ret = OMX_ErrorBadParameter;
    530         goto EXIT;
    531     }
    532     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
    533     if (ret != OMX_ErrorNone) {
    534         goto EXIT;
    535     }
    536 
    537     if (pOMXComponent->pComponentPrivate == NULL) {
    538         ret = OMX_ErrorBadParameter;
    539         goto EXIT;
    540     }
    541     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    542     pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
    543 
    544     Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush start, port:%d", nPortIndex);
    545 
    546     pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_TRUE;
    547 
    548     if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
    549         Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
    550     } else {
    551         Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[nPortIndex].pauseEvent);
    552     }
    553 
    554     pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
    555     Exynos_OMX_GetFlushBuffer(pExynosPort, flushPortBuffer);
    556 
    557     if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)
    558         Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
    559     Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
    560 
    561     pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, nPortIndex);
    562     Exynos_OSAL_MutexLock(flushPortBuffer[0]->bufferMutex);
    563     pVideoDec->exynos_codec_stop(pOMXComponent, nPortIndex);
    564     Exynos_OSAL_MutexLock(flushPortBuffer[1]->bufferMutex);
    565     ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex);
    566     if (pVideoDec->bReconfigDPB == OMX_TRUE)
    567         pVideoDec->exynos_codec_reconfigAllBuffers(pOMXComponent, nPortIndex);
    568     else if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)
    569         pVideoDec->exynos_codec_enqueueAllBuffer(pOMXComponent, nPortIndex);
    570     Exynos_ResetCodecData(&pExynosPort->processData);
    571 
    572     if (ret == OMX_ErrorNone) {
    573         if (nPortIndex == INPUT_PORT_INDEX) {
    574             pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_TRUE;
    575             pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
    576             Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
    577             Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
    578             pExynosComponent->getAllDelayBuffer = OMX_FALSE;
    579             pExynosComponent->bSaveFlagEOS = OMX_FALSE;
    580             pExynosComponent->bBehaviorEOS = OMX_FALSE;
    581             pExynosComponent->reInputData = OMX_FALSE;
    582         }
    583 
    584         pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_FALSE;
    585         Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush EventCmdComplete, port:%d", nPortIndex);
    586         if (bEvent == OMX_TRUE)
    587             pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
    588                             pExynosComponent->callbackData,
    589                             OMX_EventCmdComplete,
    590                             OMX_CommandFlush, nPortIndex, NULL);
    591     }
    592     Exynos_OSAL_MutexUnlock(flushPortBuffer[1]->bufferMutex);
    593     Exynos_OSAL_MutexUnlock(flushPortBuffer[0]->bufferMutex);
    594 
    595 EXIT:
    596     if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
    597         Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);
    598         pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
    599                         pExynosComponent->callbackData,
    600                         OMX_EventError,
    601                         ret, 0, NULL);
    602     }
    603 
    604     FunctionOut();
    605 
    606     return ret;
    607 }
    608 
    609 OMX_ERRORTYPE Exynos_ResolutionUpdate(OMX_COMPONENTTYPE *pOMXComponent)
    610 {
    611     OMX_ERRORTYPE                  ret                = OMX_ErrorNone;
    612     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent   = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    613     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec          = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
    614     EXYNOS_OMX_BASEPORT           *pInputPort         = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
    615     EXYNOS_OMX_BASEPORT           *pOutputPort        = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
    616 
    617     pOutputPort->cropRectangle.nTop     = pOutputPort->newCropRectangle.nTop;
    618     pOutputPort->cropRectangle.nLeft    = pOutputPort->newCropRectangle.nLeft;
    619     pOutputPort->cropRectangle.nWidth   = pOutputPort->newCropRectangle.nWidth;
    620     pOutputPort->cropRectangle.nHeight  = pOutputPort->newCropRectangle.nHeight;
    621 
    622     pInputPort->portDefinition.format.video.nFrameWidth     = pInputPort->newPortDefinition.format.video.nFrameWidth;
    623     pInputPort->portDefinition.format.video.nFrameHeight    = pInputPort->newPortDefinition.format.video.nFrameHeight;
    624     pInputPort->portDefinition.format.video.nStride         = pInputPort->newPortDefinition.format.video.nStride;
    625     pInputPort->portDefinition.format.video.nSliceHeight    = pInputPort->newPortDefinition.format.video.nSliceHeight;
    626 
    627     pOutputPort->portDefinition.nBufferCountActual  = pOutputPort->newPortDefinition.nBufferCountActual;
    628     pOutputPort->portDefinition.nBufferCountMin     = pOutputPort->newPortDefinition.nBufferCountMin;
    629 
    630     Exynos_UpdateFrameSize(pOMXComponent);
    631 
    632     return ret;
    633 }
    634 
    635 OMX_ERRORTYPE Exynos_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)
    636 {
    637     OMX_ERRORTYPE          ret = OMX_ErrorNone;
    638     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    639     EXYNOS_OMX_BASEPORT      *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
    640     OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;
    641 
    642     FunctionIn();
    643 
    644     bufferHeader = dataBuffer->bufferHeader;
    645 
    646     if (bufferHeader != NULL) {
    647         if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {
    648             bufferHeader->hMarkTargetComponent      = exynosOMXInputPort->markType.hMarkTargetComponent;
    649             bufferHeader->pMarkData                 = exynosOMXInputPort->markType.pMarkData;
    650             exynosOMXInputPort->markType.hMarkTargetComponent = NULL;
    651             exynosOMXInputPort->markType.pMarkData = NULL;
    652         }
    653 
    654         if (bufferHeader->hMarkTargetComponent != NULL) {
    655             if (bufferHeader->hMarkTargetComponent == pOMXComponent) {
    656                 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
    657                                 pExynosComponent->callbackData,
    658                                 OMX_EventMark,
    659                                 0, 0, bufferHeader->pMarkData);
    660             } else {
    661                 pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;
    662                 pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;
    663             }
    664         }
    665 
    666         bufferHeader->nFilledLen = 0;
    667         bufferHeader->nOffset = 0;
    668         Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);
    669     }
    670 
    671     /* reset dataBuffer */
    672     Exynos_ResetDataBuffer(dataBuffer);
    673 
    674 EXIT:
    675     FunctionOut();
    676 
    677     return ret;
    678 }
    679 
    680 OMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
    681 {
    682     OMX_ERRORTYPE          ret = OMX_ErrorUndefined;
    683     EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
    684     EXYNOS_OMX_MESSAGE    *message = NULL;
    685     EXYNOS_OMX_DATABUFFER *inputUseBuffer = NULL;
    686 
    687     FunctionIn();
    688 
    689     inputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
    690 
    691     if (pExynosComponent->currentState != OMX_StateExecuting) {
    692         ret = OMX_ErrorUndefined;
    693         goto EXIT;
    694     } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
    695                (!CHECK_PORT_BEING_FLUSHED(pExynosPort))) {
    696         Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
    697         if (inputUseBuffer->dataValid != OMX_TRUE) {
    698             message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
    699             if (message == NULL) {
    700                 ret = OMX_ErrorUndefined;
    701                 goto EXIT;
    702             }
    703             if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
    704                 Exynos_OSAL_Free(message);
    705                 ret = OMX_ErrorCodecFlush;
    706                 goto EXIT;
    707             }
    708 
    709             inputUseBuffer->bufferHeader  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
    710             inputUseBuffer->allocSize     = inputUseBuffer->bufferHeader->nAllocLen;
    711             inputUseBuffer->dataLen       = inputUseBuffer->bufferHeader->nFilledLen;
    712             inputUseBuffer->remainDataLen = inputUseBuffer->dataLen;
    713             inputUseBuffer->usedDataLen   = 0;
    714             inputUseBuffer->dataValid     = OMX_TRUE;
    715             inputUseBuffer->nFlags        = inputUseBuffer->bufferHeader->nFlags;
    716             inputUseBuffer->timeStamp     = inputUseBuffer->bufferHeader->nTimeStamp;
    717 
    718             Exynos_OSAL_Free(message);
    719 
    720             if (inputUseBuffer->allocSize <= inputUseBuffer->dataLen)
    721                 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", inputUseBuffer->allocSize, inputUseBuffer->dataLen);
    722         }
    723         ret = OMX_ErrorNone;
    724     }
    725 EXIT:
    726     FunctionOut();
    727 
    728     return ret;
    729 }
    730 
    731 OMX_ERRORTYPE Exynos_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)
    732 {
    733     OMX_ERRORTYPE          ret = OMX_ErrorNone;
    734     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    735     EXYNOS_OMX_BASEPORT      *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
    736     OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;
    737 
    738     FunctionIn();
    739 
    740     bufferHeader = dataBuffer->bufferHeader;
    741 
    742     if (bufferHeader != NULL) {
    743         bufferHeader->nFilledLen = dataBuffer->remainDataLen;
    744         bufferHeader->nOffset    = 0;
    745         bufferHeader->nFlags     = dataBuffer->nFlags;
    746         bufferHeader->nTimeStamp = dataBuffer->timeStamp;
    747 
    748         if ((exynosOMXOutputPort->bStoreMetaData == OMX_TRUE) && (bufferHeader->nFilledLen > 0))
    749             bufferHeader->nFilledLen = bufferHeader->nAllocLen;
    750 
    751         if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
    752             bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
    753             bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
    754             pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
    755             pExynosComponent->propagateMarkType.pMarkData = NULL;
    756         }
    757 
    758         if ((bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
    759             Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"event OMX_BUFFERFLAG_EOS!!!");
    760             pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
    761                             pExynosComponent->callbackData,
    762                             OMX_EventBufferFlag,
    763                             OUTPUT_PORT_INDEX,
    764                             bufferHeader->nFlags, NULL);
    765         }
    766 
    767         Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);
    768     }
    769 
    770     /* reset dataBuffer */
    771     Exynos_ResetDataBuffer(dataBuffer);
    772 
    773 EXIT:
    774     FunctionOut();
    775 
    776     return ret;
    777 }
    778 
    779 OMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
    780 {
    781     OMX_ERRORTYPE       ret = OMX_ErrorUndefined;
    782     EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
    783     EXYNOS_OMX_MESSAGE    *message = NULL;
    784     EXYNOS_OMX_DATABUFFER *outputUseBuffer = NULL;
    785 
    786     FunctionIn();
    787 
    788     if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
    789         outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
    790     } else if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
    791         outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
    792     }
    793 
    794     if (pExynosComponent->currentState != OMX_StateExecuting) {
    795         ret = OMX_ErrorUndefined;
    796         goto EXIT;
    797     } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
    798                (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){
    799         Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
    800         if (outputUseBuffer->dataValid != OMX_TRUE) {
    801             message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
    802             if (message == NULL) {
    803                 ret = OMX_ErrorUndefined;
    804                 goto EXIT;
    805             }
    806             if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
    807                 Exynos_OSAL_Free(message);
    808                 ret = OMX_ErrorCodecFlush;
    809                 goto EXIT;
    810             }
    811 
    812             outputUseBuffer->bufferHeader  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
    813             outputUseBuffer->allocSize     = outputUseBuffer->bufferHeader->nAllocLen;
    814             outputUseBuffer->dataLen       = 0; //dataBuffer->bufferHeader->nFilledLen;
    815             outputUseBuffer->remainDataLen = outputUseBuffer->dataLen;
    816             outputUseBuffer->usedDataLen   = 0; //dataBuffer->bufferHeader->nOffset;
    817             outputUseBuffer->dataValid     = OMX_TRUE;
    818             /* dataBuffer->nFlags             = dataBuffer->bufferHeader->nFlags; */
    819             /* dataBuffer->nTimeStamp         = dataBuffer->bufferHeader->nTimeStamp; */
    820 /*
    821             if (pExynosPort->bufferProcessType == BUFFER_SHARE)
    822                 outputUseBuffer->pPrivate      = outputUseBuffer->bufferHeader->pOutputPortPrivate;
    823             else if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
    824                 pExynosPort->processData.dataBuffer = outputUseBuffer->bufferHeader->pBuffer;
    825                 pExynosPort->processData.allocSize  = outputUseBuffer->bufferHeader->nAllocLen;
    826             }
    827 */
    828 
    829             Exynos_OSAL_Free(message);
    830         }
    831         ret = OMX_ErrorNone;
    832     }
    833 EXIT:
    834     FunctionOut();
    835 
    836     return ret;
    837 
    838 }
    839 
    840 OMX_BUFFERHEADERTYPE *Exynos_OutputBufferGetQueue_Direct(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
    841 {
    842     OMX_BUFFERHEADERTYPE  *retBuffer = NULL;
    843     EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
    844     EXYNOS_OMX_MESSAGE    *message = NULL;
    845 
    846     FunctionIn();
    847 
    848     if (pExynosComponent->currentState != OMX_StateExecuting) {
    849         retBuffer = NULL;
    850         goto EXIT;
    851     } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
    852                (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){
    853         Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
    854 
    855         message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
    856         if (message == NULL) {
    857             retBuffer = NULL;
    858             goto EXIT;
    859         }
    860         if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
    861             Exynos_OSAL_Free(message);
    862             retBuffer = NULL;
    863             goto EXIT;
    864         }
    865 
    866         retBuffer  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
    867         Exynos_OSAL_Free(message);
    868     }
    869 
    870 EXIT:
    871     FunctionOut();
    872 
    873     return retBuffer;
    874 }
    875 
    876 OMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR data)
    877 {
    878     OMX_ERRORTYPE       ret = OMX_ErrorNone;
    879     EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
    880 
    881     FunctionIn();
    882 
    883     pExynosPort= &pExynosComponent->pExynosPort[PortIndex];
    884 
    885     if (data == NULL) {
    886         ret = OMX_ErrorInsufficientResources;
    887         goto EXIT;
    888     }
    889 
    890     ret = Exynos_OSAL_Queue(&pExynosPort->codecBufferQ, (void *)data);
    891     if (ret != 0) {
    892         ret = OMX_ErrorUndefined;
    893         goto EXIT;
    894     }
    895     Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
    896 
    897     ret = OMX_ErrorNone;
    898 
    899 EXIT:
    900     FunctionOut();
    901 
    902     return ret;
    903 }
    904 
    905 OMX_ERRORTYPE Exynos_CodecBufferDeQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR *data)
    906 {
    907     OMX_ERRORTYPE       ret = OMX_ErrorNone;
    908     EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
    909     OMX_U32 tempData;
    910 
    911     FunctionIn();
    912 
    913     pExynosPort = &pExynosComponent->pExynosPort[PortIndex];
    914     Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);
    915     tempData = (OMX_U32)Exynos_OSAL_Dequeue(&pExynosPort->codecBufferQ);
    916     if (tempData == NULL) {
    917         *data = NULL;
    918         ret = OMX_ErrorUndefined;
    919         goto EXIT;
    920     }
    921     *data = (OMX_PTR)tempData;
    922 
    923     ret = OMX_ErrorNone;
    924 
    925 EXIT:
    926     FunctionOut();
    927 
    928     return ret;
    929 }
    930 
    931 OMX_ERRORTYPE Exynos_CodecBufferReset(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex)
    932 {
    933     OMX_ERRORTYPE       ret = OMX_ErrorNone;
    934     EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
    935 
    936     FunctionIn();
    937 
    938     pExynosPort= &pExynosComponent->pExynosPort[PortIndex];
    939 
    940     ret = Exynos_OSAL_ResetQueue(&pExynosPort->codecBufferQ);
    941     if (ret != 0) {
    942         ret = OMX_ErrorUndefined;
    943         goto EXIT;
    944     }
    945     while (1) {
    946         int cnt = 0;
    947         Exynos_OSAL_Get_SemaphoreCount(pExynosPort->codecSemID, &cnt);
    948         if (cnt > 0)
    949             Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);
    950         else
    951             break;
    952     }
    953     ret = OMX_ErrorNone;
    954 
    955 EXIT:
    956     FunctionOut();
    957 
    958     return ret;
    959 }
    960 
    961 OMX_ERRORTYPE Exynos_OMX_VideoDecodeGetParameter(
    962     OMX_IN OMX_HANDLETYPE hComponent,
    963     OMX_IN OMX_INDEXTYPE  nParamIndex,
    964     OMX_INOUT OMX_PTR     ComponentParameterStructure)
    965 {
    966     OMX_ERRORTYPE          ret = OMX_ErrorNone;
    967     OMX_COMPONENTTYPE     *pOMXComponent = NULL;
    968     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
    969     EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
    970 
    971     FunctionIn();
    972 
    973     if (hComponent == NULL) {
    974         ret = OMX_ErrorBadParameter;
    975         goto EXIT;
    976     }
    977     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
    978     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
    979     if (ret != OMX_ErrorNone) {
    980         goto EXIT;
    981     }
    982 
    983     if (pOMXComponent->pComponentPrivate == NULL) {
    984         ret = OMX_ErrorBadParameter;
    985         goto EXIT;
    986     }
    987     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
    988 
    989     if (pExynosComponent->currentState == OMX_StateInvalid ) {
    990         ret = OMX_ErrorInvalidState;
    991         goto EXIT;
    992     }
    993 
    994     if (ComponentParameterStructure == NULL) {
    995         ret = OMX_ErrorBadParameter;
    996         goto EXIT;
    997     }
    998 
    999     switch (nParamIndex) {
   1000     case OMX_IndexParamVideoInit:
   1001     {
   1002         OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
   1003         ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));
   1004         if (ret != OMX_ErrorNone) {
   1005             goto EXIT;
   1006         }
   1007 
   1008         portParam->nPorts           = pExynosComponent->portParam.nPorts;
   1009         portParam->nStartPortNumber = pExynosComponent->portParam.nStartPortNumber;
   1010         ret = OMX_ErrorNone;
   1011     }
   1012         break;
   1013     case OMX_IndexParamVideoPortFormat:
   1014     {
   1015         OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
   1016         OMX_U32                         portIndex = portFormat->nPortIndex;
   1017         OMX_U32                         index    = portFormat->nIndex;
   1018         EXYNOS_OMX_BASEPORT               *pExynosPort = NULL;
   1019         OMX_PARAM_PORTDEFINITIONTYPE   *portDefinition = NULL;
   1020         OMX_U32                         supportFormatNum = 0; /* supportFormatNum = N-1 */
   1021 
   1022         ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
   1023         if (ret != OMX_ErrorNone) {
   1024             goto EXIT;
   1025         }
   1026 
   1027         if ((portIndex >= pExynosComponent->portParam.nPorts)) {
   1028             ret = OMX_ErrorBadPortIndex;
   1029             goto EXIT;
   1030         }
   1031 
   1032 
   1033         if (portIndex == INPUT_PORT_INDEX) {
   1034             supportFormatNum = INPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;
   1035             if (index > supportFormatNum) {
   1036                 ret = OMX_ErrorNoMore;
   1037                 goto EXIT;
   1038             }
   1039 
   1040             pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
   1041             portDefinition = &pExynosPort->portDefinition;
   1042 
   1043             portFormat->eCompressionFormat = portDefinition->format.video.eCompressionFormat;
   1044             portFormat->eColorFormat       = portDefinition->format.video.eColorFormat;
   1045             portFormat->xFramerate           = portDefinition->format.video.xFramerate;
   1046         } else if (portIndex == OUTPUT_PORT_INDEX) {
   1047             pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
   1048             portDefinition = &pExynosPort->portDefinition;
   1049 
   1050             if ((pExynosPort->bIsANBEnabled == OMX_FALSE) &&
   1051                 (pExynosPort->bStoreMetaData == OMX_FALSE)) {
   1052                 switch (index) {
   1053                 case supportFormat_0:
   1054                     portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
   1055                     portFormat->eColorFormat       = OMX_COLOR_FormatYUV420Planar;
   1056                     portFormat->xFramerate         = portDefinition->format.video.xFramerate;
   1057                     break;
   1058                 case supportFormat_1:
   1059                     portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
   1060                     portFormat->eColorFormat       = OMX_COLOR_FormatYUV420SemiPlanar;
   1061                     portFormat->xFramerate         = portDefinition->format.video.xFramerate;
   1062                     break;
   1063                 case supportFormat_2:
   1064                     portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
   1065                     portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV12TPhysicalAddress;
   1066                     portFormat->xFramerate         = portDefinition->format.video.xFramerate;
   1067                     break;
   1068                 case supportFormat_3:
   1069                     portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
   1070                     portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV12Tiled;
   1071                     portFormat->xFramerate         = portDefinition->format.video.xFramerate;
   1072                     break;
   1073                 default:
   1074                     if (index > supportFormat_0) {
   1075                         ret = OMX_ErrorNoMore;
   1076                         goto EXIT;
   1077                     }
   1078                     break;
   1079                 }
   1080             } else {
   1081                 switch (index) {
   1082                 case supportFormat_0:
   1083                     portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
   1084                     portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV12Tiled;
   1085                     portFormat->xFramerate         = portDefinition->format.video.xFramerate;
   1086                     break;
   1087                 default:
   1088                     if (index > supportFormat_0) {
   1089                         ret = OMX_ErrorNoMore;
   1090                         goto EXIT;
   1091                     }
   1092                     break;
   1093                 }
   1094             }
   1095         }
   1096         ret = OMX_ErrorNone;
   1097     }
   1098         break;
   1099 #ifdef USE_ANB
   1100     case OMX_IndexParamGetAndroidNativeBuffer:
   1101     {
   1102         ret = Exynos_OSAL_GetANBParameter(hComponent, nParamIndex, ComponentParameterStructure);
   1103     }
   1104         break;
   1105     case OMX_IndexParamPortDefinition:
   1106     {
   1107         OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
   1108         OMX_U32                       portIndex = portDefinition->nPortIndex;
   1109         EXYNOS_OMX_BASEPORT             *pExynosPort;
   1110 
   1111         ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
   1112         if (ret != OMX_ErrorNone) {
   1113             goto EXIT;
   1114         }
   1115 
   1116         /* at this point, GetParameter has done all the verification, we
   1117          * just dereference things directly here
   1118          */
   1119         pExynosPort = &pExynosComponent->pExynosPort[portIndex];
   1120         if ((pExynosPort->bIsANBEnabled == OMX_TRUE) ||
   1121             (pExynosPort->bStoreMetaData == OMX_TRUE)){
   1122             portDefinition->format.video.eColorFormat =
   1123                 (OMX_COLOR_FORMATTYPE)Exynos_OSAL_OMX2HalPixelFormat(portDefinition->format.video.eColorFormat);
   1124             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "portDefinition->format.video.eColorFormat:0x%x", portDefinition->format.video.eColorFormat);
   1125         }
   1126     }
   1127         break;
   1128 #endif
   1129     default:
   1130     {
   1131         ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
   1132     }
   1133         break;
   1134     }
   1135 
   1136 EXIT:
   1137     FunctionOut();
   1138 
   1139     return ret;
   1140 }
   1141 OMX_ERRORTYPE Exynos_OMX_VideoDecodeSetParameter(
   1142     OMX_IN OMX_HANDLETYPE hComponent,
   1143     OMX_IN OMX_INDEXTYPE  nIndex,
   1144     OMX_IN OMX_PTR        ComponentParameterStructure)
   1145 {
   1146     OMX_ERRORTYPE          ret = OMX_ErrorNone;
   1147     OMX_COMPONENTTYPE     *pOMXComponent = NULL;
   1148     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
   1149     EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
   1150 
   1151     FunctionIn();
   1152 
   1153     if (hComponent == NULL) {
   1154         ret = OMX_ErrorBadParameter;
   1155         goto EXIT;
   1156     }
   1157     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
   1158     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
   1159     if (ret != OMX_ErrorNone) {
   1160         goto EXIT;
   1161     }
   1162 
   1163     if (pOMXComponent->pComponentPrivate == NULL) {
   1164         ret = OMX_ErrorBadParameter;
   1165         goto EXIT;
   1166     }
   1167     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1168 
   1169     if (pExynosComponent->currentState == OMX_StateInvalid ) {
   1170         ret = OMX_ErrorInvalidState;
   1171         goto EXIT;
   1172     }
   1173 
   1174     if (ComponentParameterStructure == NULL) {
   1175         ret = OMX_ErrorBadParameter;
   1176         goto EXIT;
   1177     }
   1178 
   1179     switch (nIndex) {
   1180     case OMX_IndexParamVideoPortFormat:
   1181     {
   1182         OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
   1183         OMX_U32                         portIndex = portFormat->nPortIndex;
   1184         OMX_U32                         index    = portFormat->nIndex;
   1185         EXYNOS_OMX_BASEPORT               *pExynosPort = NULL;
   1186         OMX_PARAM_PORTDEFINITIONTYPE   *portDefinition = NULL;
   1187         OMX_U32                         supportFormatNum = 0;
   1188 
   1189         ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
   1190         if (ret != OMX_ErrorNone) {
   1191             goto EXIT;
   1192         }
   1193 
   1194         if ((portIndex >= pExynosComponent->portParam.nPorts)) {
   1195             ret = OMX_ErrorBadPortIndex;
   1196             goto EXIT;
   1197         } else {
   1198             pExynosPort = &pExynosComponent->pExynosPort[portIndex];
   1199             portDefinition = &pExynosPort->portDefinition;
   1200 
   1201             portDefinition->format.video.eColorFormat       = portFormat->eColorFormat;
   1202             portDefinition->format.video.eCompressionFormat = portFormat->eCompressionFormat;
   1203             portDefinition->format.video.xFramerate         = portFormat->xFramerate;
   1204 
   1205             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "portIndex:%d, portFormat->eColorFormat:0x%x", portIndex, portFormat->eColorFormat);
   1206         }
   1207     }
   1208         break;
   1209     case OMX_IndexParamPortDefinition:
   1210     {
   1211         OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
   1212         OMX_U32                       portIndex = pPortDefinition->nPortIndex;
   1213         EXYNOS_OMX_BASEPORT             *pExynosPort;
   1214         OMX_U32 width, height, size;
   1215         OMX_U32 realWidth, realHeight;
   1216 
   1217         if (portIndex >= pExynosComponent->portParam.nPorts) {
   1218             ret = OMX_ErrorBadPortIndex;
   1219             goto EXIT;
   1220         }
   1221         ret = Exynos_OMX_Check_SizeVersion(pPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
   1222         if (ret != OMX_ErrorNone) {
   1223             goto EXIT;
   1224         }
   1225 
   1226         pExynosPort = &pExynosComponent->pExynosPort[portIndex];
   1227 
   1228         if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
   1229             if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
   1230                 ret = OMX_ErrorIncorrectStateOperation;
   1231                 goto EXIT;
   1232             }
   1233         }
   1234         if (pPortDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {
   1235             ret = OMX_ErrorBadParameter;
   1236             goto EXIT;
   1237         }
   1238 
   1239         Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, pPortDefinition, pPortDefinition->nSize);
   1240 
   1241 #ifdef USE_ANB // Modified by Google engineer
   1242         /* should not affect the format since in ANB case, the caller
   1243                 * is providing us a HAL format */
   1244         if ((pExynosPort->bIsANBEnabled == OMX_TRUE) ||
   1245             (pExynosPort->bStoreMetaData == OMX_TRUE)) {
   1246             pExynosPort->portDefinition.format.video.eColorFormat =
   1247                 Exynos_OSAL_Hal2OMXPixelFormat(pExynosPort->portDefinition.format.video.eColorFormat);
   1248         }
   1249 #endif
   1250 
   1251         realWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
   1252         realHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
   1253         width = ((realWidth + 15) & (~15));
   1254         height = ((realHeight + 15) & (~15));
   1255         size = (width * height * 3) / 2;
   1256         pExynosPort->portDefinition.format.video.nStride = width;
   1257         pExynosPort->portDefinition.format.video.nSliceHeight = height;
   1258         pExynosPort->portDefinition.nBufferSize = (size > pExynosPort->portDefinition.nBufferSize) ? size : pExynosPort->portDefinition.nBufferSize;
   1259 
   1260         if (portIndex == INPUT_PORT_INDEX) {
   1261             EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
   1262             pExynosOutputPort->portDefinition.format.video.nFrameWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
   1263             pExynosOutputPort->portDefinition.format.video.nFrameHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
   1264             pExynosOutputPort->portDefinition.format.video.nStride = width;
   1265             pExynosOutputPort->portDefinition.format.video.nSliceHeight = height;
   1266 
   1267             switch (pExynosOutputPort->portDefinition.format.video.eColorFormat) {
   1268             case OMX_COLOR_FormatYUV420Planar:
   1269             case OMX_COLOR_FormatYUV420SemiPlanar:
   1270             case OMX_SEC_COLOR_FormatNV12TPhysicalAddress:
   1271                 pExynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2;
   1272                 break;
   1273             case OMX_SEC_COLOR_FormatNV12Tiled:
   1274                 pExynosOutputPort->portDefinition.nBufferSize =
   1275                     calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) +
   1276                     calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1);
   1277                 break;
   1278             default:
   1279                 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Color format is not support!! use default YUV size!!");
   1280                 ret = OMX_ErrorUnsupportedSetting;
   1281                 break;
   1282             }
   1283 
   1284             if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
   1285                 pExynosOutputPort->portDefinition.nBufferSize =
   1286                     calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) +
   1287                     calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1);
   1288             }
   1289         }
   1290     }
   1291         break;
   1292 #ifdef USE_ANB
   1293     case OMX_IndexParamEnableAndroidBuffers:
   1294     case OMX_IndexParamUseAndroidNativeBuffer:
   1295     case OMX_IndexParamStoreMetaDataBuffer:
   1296     {
   1297         ret = Exynos_OSAL_SetANBParameter(hComponent, nIndex, ComponentParameterStructure);
   1298     }
   1299         break;
   1300 #endif
   1301     case OMX_IndexParamEnableThumbnailMode:
   1302     {
   1303         EXYNOS_OMX_VIDEO_THUMBNAILMODE *pThumbnailMode = (EXYNOS_OMX_VIDEO_THUMBNAILMODE *)ComponentParameterStructure;
   1304         EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
   1305 
   1306         ret = Exynos_OMX_Check_SizeVersion(pThumbnailMode, sizeof(EXYNOS_OMX_VIDEO_THUMBNAILMODE));
   1307         if (ret != OMX_ErrorNone) {
   1308             goto EXIT;
   1309         }
   1310 
   1311         pVideoDec->bThumbnailMode = pThumbnailMode->bEnable;
   1312         if (pVideoDec->bThumbnailMode == OMX_TRUE) {
   1313             EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
   1314             pExynosOutputPort->portDefinition.nBufferCountMin = 1;
   1315             pExynosOutputPort->portDefinition.nBufferCountActual = 1;
   1316         }
   1317 
   1318         ret = OMX_ErrorNone;
   1319     }
   1320         break;
   1321     default:
   1322     {
   1323         ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure);
   1324     }
   1325         break;
   1326     }
   1327 
   1328 EXIT:
   1329     FunctionOut();
   1330 
   1331     return ret;
   1332 }
   1333 
   1334 OMX_ERRORTYPE Exynos_OMX_VideoDecodeGetConfig(
   1335     OMX_HANDLETYPE hComponent,
   1336     OMX_INDEXTYPE nIndex,
   1337     OMX_PTR pComponentConfigStructure)
   1338 {
   1339     OMX_ERRORTYPE          ret = OMX_ErrorNone;
   1340     OMX_COMPONENTTYPE     *pOMXComponent = NULL;
   1341     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
   1342 
   1343     FunctionIn();
   1344 
   1345     if (hComponent == NULL) {
   1346         ret = OMX_ErrorBadParameter;
   1347         goto EXIT;
   1348     }
   1349     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
   1350     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
   1351     if (ret != OMX_ErrorNone) {
   1352         goto EXIT;
   1353     }
   1354     if (pOMXComponent->pComponentPrivate == NULL) {
   1355         ret = OMX_ErrorBadParameter;
   1356         goto EXIT;
   1357     }
   1358     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1359     if (pComponentConfigStructure == NULL) {
   1360         ret = OMX_ErrorBadParameter;
   1361         goto EXIT;
   1362     }
   1363     if (pExynosComponent->currentState == OMX_StateInvalid) {
   1364         ret = OMX_ErrorInvalidState;
   1365         goto EXIT;
   1366     }
   1367 
   1368     switch (nIndex) {
   1369     default:
   1370         ret = Exynos_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure);
   1371         break;
   1372     }
   1373 
   1374 EXIT:
   1375     FunctionOut();
   1376 
   1377     return ret;
   1378 }
   1379 
   1380 OMX_ERRORTYPE Exynos_OMX_VideoDecodeSetConfig(
   1381     OMX_HANDLETYPE hComponent,
   1382     OMX_INDEXTYPE nIndex,
   1383     OMX_PTR pComponentConfigStructure)
   1384 {
   1385     OMX_ERRORTYPE           ret = OMX_ErrorNone;
   1386     OMX_COMPONENTTYPE     *pOMXComponent = NULL;
   1387     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
   1388 
   1389     FunctionIn();
   1390 
   1391     if (hComponent == NULL) {
   1392         ret = OMX_ErrorBadParameter;
   1393         goto EXIT;
   1394     }
   1395     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
   1396     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
   1397     if (ret != OMX_ErrorNone) {
   1398         goto EXIT;
   1399     }
   1400     if (pOMXComponent->pComponentPrivate == NULL) {
   1401         ret = OMX_ErrorBadParameter;
   1402         goto EXIT;
   1403     }
   1404     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1405     if (pComponentConfigStructure == NULL) {
   1406         ret = OMX_ErrorBadParameter;
   1407         goto EXIT;
   1408     }
   1409     if (pExynosComponent->currentState == OMX_StateInvalid) {
   1410         ret = OMX_ErrorInvalidState;
   1411         goto EXIT;
   1412     }
   1413 
   1414     switch (nIndex) {
   1415     default:
   1416         ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure);
   1417         break;
   1418     }
   1419 
   1420 EXIT:
   1421     FunctionOut();
   1422 
   1423     return ret;
   1424 }
   1425 
   1426 OMX_ERRORTYPE Exynos_OMX_VideoDecodeGetExtensionIndex(
   1427     OMX_IN OMX_HANDLETYPE  hComponent,
   1428     OMX_IN OMX_STRING      cParameterName,
   1429     OMX_OUT OMX_INDEXTYPE *pIndexType)
   1430 {
   1431     OMX_ERRORTYPE           ret = OMX_ErrorNone;
   1432     OMX_COMPONENTTYPE     *pOMXComponent = NULL;
   1433     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
   1434 
   1435     FunctionIn();
   1436 
   1437     if (hComponent == NULL) {
   1438         ret = OMX_ErrorBadParameter;
   1439         goto EXIT;
   1440     }
   1441     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
   1442     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
   1443     if (ret != OMX_ErrorNone) {
   1444         goto EXIT;
   1445     }
   1446 
   1447     if (pOMXComponent->pComponentPrivate == NULL) {
   1448         ret = OMX_ErrorBadParameter;
   1449         goto EXIT;
   1450     }
   1451     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
   1452 
   1453     if ((cParameterName == NULL) || (pIndexType == NULL)) {
   1454         ret = OMX_ErrorBadParameter;
   1455         goto EXIT;
   1456     }
   1457     if (pExynosComponent->currentState == OMX_StateInvalid) {
   1458         ret = OMX_ErrorInvalidState;
   1459         goto EXIT;
   1460     }
   1461 
   1462 #ifdef USE_ANB
   1463     if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_ANB) == 0) {
   1464         *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamEnableAndroidBuffers;
   1465         goto EXIT;
   1466     }
   1467     if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_GET_ANB) == 0) {
   1468         *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamGetAndroidNativeBuffer;
   1469         goto EXIT;
   1470     }
   1471     if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_USE_ANB) == 0) {
   1472         *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamUseAndroidNativeBuffer;
   1473         goto EXIT;
   1474     }
   1475 #endif
   1476     if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
   1477         *pIndexType = OMX_IndexParamEnableThumbnailMode;
   1478         goto EXIT;
   1479     }
   1480 #ifdef USE_STOREMETADATA
   1481     if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER) == 0) {
   1482         *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamStoreMetaDataBuffer;
   1483         goto EXIT;
   1484     }
   1485 #endif
   1486 
   1487     ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
   1488 
   1489 EXIT:
   1490     FunctionOut();
   1491 
   1492     return ret;
   1493 }
   1494 
   1495 #ifdef USE_ANB
   1496 OMX_ERRORTYPE Exynos_Shared_ANBBufferToData(EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_DATA *pData, EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_PLANE nPlane)
   1497 {
   1498     OMX_ERRORTYPE ret = OMX_ErrorNone;
   1499     OMX_U32 width, height;
   1500     ExynosVideoPlane planes[MAX_BUFFER_PLANE];
   1501 
   1502     memset(planes, 0, sizeof(planes));
   1503 
   1504     width = pExynosPort->portDefinition.format.video.nFrameWidth;
   1505     height = pExynosPort->portDefinition.format.video.nFrameHeight;
   1506 
   1507     if ((pExynosPort->bIsANBEnabled == OMX_TRUE) ||
   1508         (pExynosPort->bStoreMetaData == OMX_TRUE)) {
   1509         OMX_U32 stride;
   1510         if ((pUseBuffer->bufferHeader != NULL) && (pUseBuffer->bufferHeader->pBuffer != NULL)) {
   1511             if (pExynosPort->bIsANBEnabled == OMX_TRUE) {
   1512                 Exynos_OSAL_LockANB(pUseBuffer->bufferHeader->pBuffer, width, height, pExynosPort->portDefinition.format.video.eColorFormat, &stride, planes);
   1513             } else if (pExynosPort->bStoreMetaData == OMX_TRUE) {
   1514                 Exynos_OSAL_LockMetaData(pUseBuffer->bufferHeader->pBuffer, width, height, pExynosPort->portDefinition.format.video.eColorFormat, &stride, planes);
   1515             }
   1516             pUseBuffer->dataLen = sizeof(void *);
   1517         } else {
   1518             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
   1519             ret = OMX_ErrorBadParameter;
   1520             goto EXIT;
   1521         }
   1522     } else {
   1523         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
   1524         ret = OMX_ErrorBadParameter;
   1525         goto EXIT;
   1526     }
   1527 
   1528     if (nPlane == TWO_PLANE) {
   1529         /* Case of Shared Buffer, Only support two PlaneBuffer */
   1530         pData->buffer.multiPlaneBuffer.dataBuffer[0] = planes[0].addr;
   1531         pData->buffer.multiPlaneBuffer.fd[0] = planes[0].fd;
   1532         pData->buffer.multiPlaneBuffer.dataBuffer[1] = planes[1].addr;
   1533         pData->buffer.multiPlaneBuffer.fd[1] = planes[1].fd;
   1534     } else {
   1535         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not support plane");
   1536         ret = OMX_ErrorNotImplemented;
   1537         goto EXIT;
   1538     }
   1539 
   1540     pData->allocSize     = pUseBuffer->allocSize;
   1541     pData->dataLen       = pUseBuffer->dataLen;
   1542     pData->usedDataLen   = pUseBuffer->usedDataLen;
   1543     pData->remainDataLen = pUseBuffer->remainDataLen;
   1544     pData->timeStamp     = pUseBuffer->timeStamp;
   1545     pData->nFlags        = pUseBuffer->nFlags;
   1546     pData->pPrivate      = pUseBuffer->pPrivate;
   1547     pData->bufferHeader  = pUseBuffer->bufferHeader;
   1548 
   1549 EXIT:
   1550     return ret;
   1551 }
   1552 
   1553 OMX_ERRORTYPE Exynos_Shared_DataToANBBuffer(EXYNOS_OMX_DATA *pData, EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_BASEPORT *pExynosPort)
   1554 {
   1555     OMX_ERRORTYPE ret = OMX_ErrorNone;
   1556 
   1557     pUseBuffer->bufferHeader          = pData->bufferHeader;
   1558     pUseBuffer->allocSize             = pData->allocSize;
   1559     pUseBuffer->dataLen               = pData->dataLen;
   1560     pUseBuffer->usedDataLen           = pData->usedDataLen;
   1561     pUseBuffer->remainDataLen         = pData->remainDataLen;
   1562     pUseBuffer->timeStamp             = pData->timeStamp;
   1563     pUseBuffer->nFlags                = pData->nFlags;
   1564     pUseBuffer->pPrivate              = pData->pPrivate;
   1565 
   1566     if ((pUseBuffer->bufferHeader == NULL) ||
   1567         (pUseBuffer->bufferHeader->pBuffer == NULL)) {
   1568         ret = OMX_ErrorUndefined;
   1569         goto EXIT;
   1570     }
   1571 
   1572     if (pExynosPort->bIsANBEnabled == OMX_TRUE) {
   1573         Exynos_OSAL_UnlockANB(pUseBuffer->bufferHeader->pBuffer);
   1574     } else if (pExynosPort->bStoreMetaData == OMX_TRUE) {
   1575         Exynos_OSAL_UnlockMetaData(pUseBuffer->bufferHeader->pBuffer);
   1576     } else {
   1577         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
   1578         ret = OMX_ErrorBadParameter;
   1579         goto EXIT;
   1580     }
   1581 
   1582 EXIT:
   1583     return ret;
   1584 }
   1585 #endif
   1586