Exynos_OMX_Vp8dec.c revision 440252358aa79ef5e411b8f57c3359376e650e51
120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/*
220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *
338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD
420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *
520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Licensed under the Apache License, Version 2.0 (the "License");
620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * you may not use this file except in compliance with the License.
720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * You may obtain a copy of the License at
820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *
920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *      http://www.apache.org/licenses/LICENSE-2.0
1020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *
1120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Unless required by applicable law or agreed to in writing, software
1220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * distributed under the License is distributed on an "AS IS" BASIS,
1320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * See the License for the specific language governing permissions and
1520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * limitations under the License.
1620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */
1720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/*
1920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @file        Exynos_OMX_Vp8dec.c
2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief
2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author      Satish Kumar Reddy (palli.satish@samsung.com)
2238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
2338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version     2.0.0
2420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history
2538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *   2012.02.20 : Create
2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */
2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h>
2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h>
3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h>
3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Macros.h"
3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Basecomponent.h"
3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Baseport.h"
3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Vdec.h"
3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_ETC.h"
3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Semaphore.h"
3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Thread.h"
3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "library_register.h"
4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Vp8dec.h"
4120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "ExynosVideoApi.h"
4238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_SharedMemory.h"
4338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Event.h"
4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#ifdef USE_ANB
4620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Android.h"
4720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
49800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang/* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
5120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "csc.h"
5220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef  EXYNOS_LOG_TAG
5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG    "EXYNOS_VP8_DEC"
5520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF
5638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//#define EXYNOS_TRACE_ON
5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h"
5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define VP8_DEC_NUM_OF_EXTRA_BUFFERS 7
6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang//#define FULL_FRAME_SEARCH /* Full frame search not support*/
6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, void *pVirtAddr, OMX_U32 *dataSize)
6438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
6538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE       ret = OMX_ErrorNone;
6638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
6738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
6838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
6938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
7038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
7138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, void *addr[], int size[])
7238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
7338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE       ret = OMX_ErrorNone;
7438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer  *pCodecBuffer;
7538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
7638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (codecBuffer == NULL) {
7738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
7838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
7938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
8038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
8138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
8238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
8338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (addr != NULL) {
8438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        addr[0] = pCodecBuffer->planes[0].addr;
8538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        addr[1] = pCodecBuffer->planes[1].addr;
8638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        addr[2] = pCodecBuffer->planes[2].addr;
8738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
8838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
8938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (size != NULL) {
9038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        size[0] = pCodecBuffer->planes[0].allocSize;
9138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        size[1] = pCodecBuffer->planes[1].allocSize;
9238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        size[2] = pCodecBuffer->planes[2].allocSize;
9338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
9438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
9538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
9638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
9738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
9838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
9938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic int Check_VP8_Frame(
10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8   *pInputStream,
10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int       buffSize,
10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32   flag,
10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL  bPreviousFrameEOF,
10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL *pbEndOfFrame)
10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Uncompressed data Chunk comprises a common
10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    (for key frames and interframes) 3-byte frame tag that
10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    contains four fields
10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    - 1-bit frame type (0 - key frame, 1 - inter frame)
11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    - 3-bit version number (0 - 3 are defined as four different
11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                                      profiles with different decoding complexity)
11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    - 1-bit show_frame flag ( 0 - current frame not for display,
11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                                          1 - current frame is for dispaly)
11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    - 19-bit field - size of the first data partition in bytes
11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Key Frames : frame tag followed by 7 bytes of uncompressed
11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    data
11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    3-bytes : Start code (byte 0: 0x9d,byte 1: 0x01,byte 2: 0x2a)
11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Next 4-bytes: Width & height, Horizontal and vertical scale information
12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    16 bits      :     (2 bits Horizontal Scale << 14) | Width (14 bits)
12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    16 bits      :     (2 bits Vertical Scale << 14) | Height (14 bits)
12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    */
12320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int width, height;
12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int horizSscale, vertScale;
12520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    *pbEndOfFrame = OMX_TRUE;
12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
13020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /*Check for Key frame*/
13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (!(pInputStream[0] & 0x01)){
13220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        /* Key Frame  Start code*/
13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pInputStream[3] != 0x9d || pInputStream[4] != 0x01 || pInputStream[5]!=0x2a) {
13420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, " VP8 Key Frame Start Code not Found");
13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            *pbEndOfFrame = OMX_FALSE;
13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, " VP8 Found Key Frame Start Code");
13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        width = (pInputStream[6] | (pInputStream[7] << 8)) & 0x3fff;
13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        horizSscale = pInputStream[7] >> 6;
14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        height = (pInputStream[8] | (pInputStream[9] << 8)) & 0x3fff;
14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        vertScale = pInputStream[9] >> 6;
14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "width = %d, height = %d, horizSscale = %d, vertScale = %d", width, height, horizSscale, vertScale);
14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return buffSize;
14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
14938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_BOOL Check_VP8_StartCode(
15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8     *pInputStream,
15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32     streamSize)
15220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
15320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "streamSize: %d",streamSize);
15420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (streamSize < 3) {
15520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        return OMX_FALSE;
15620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
15720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (!(pInputStream[0] & 0x01)){
15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        /* Key Frame  Start code*/
16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pInputStream[3] != 0x9d || pInputStream[4] != 0x01 || pInputStream[5]!=0x2a) {
16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, " VP8 Key Frame Start Code not Found");
16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            return OMX_FALSE;
16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, " VP8 Found Key Frame Start Code");
16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return OMX_TRUE;
16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecOpen(EXYNOS_VP8DEC_HANDLE *pVp8Dec)
17138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
1723e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_ERRORTYPE            ret        = OMX_ErrorNone;
17338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
17438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
17538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
17638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
17738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
17838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
17938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec == NULL) {
18038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
18138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
18238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
18338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
18438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
18538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* alloc ops structure */
18638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = (ExynosVideoDecOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps));
18738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
18838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
18938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
19038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pDecOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
19138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate decoder ops buffer");
19238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
19338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
19438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
19538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
19638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.pDecOps    = pDecOps;
19738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.pInbufOps  = pInbufOps;
19838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.pOutbufOps = pOutbufOps;
19938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
20038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* function pointer mapping */
20138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps->nSize    = sizeof(ExynosVideoDecOps);
20238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps->nSize  = sizeof(ExynosVideoDecBufferOps);
20338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
20438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
20538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_Video_Register_Decoder(pDecOps, pInbufOps, pOutbufOps);
2063e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
20738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* check mandatory functions for decoder ops */
20838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pDecOps->Init == NULL) || (pDecOps->Finalize == NULL) ||
20938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pDecOps->Get_ActualBufferCount == NULL) || (pDecOps->Set_FrameTag == NULL) ||
21038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pDecOps->Get_FrameTag == NULL)) {
21138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
21238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
21338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
21438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
21538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
21638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* check mandatory functions for buffer ops */
21738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
21838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
21938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
22038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
22138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
22238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
22338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
22438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
22538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
22638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
22738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* alloc context, open, querycap */
228c94beaeb6990ddf010f7934c201f68e2d66dff62SeungBeom Kim    pVp8Dec->hMFCVp8Handle.hMFCHandle = pVp8Dec->hMFCVp8Handle.pDecOps->Init(V4L2_MEMORY_DMABUF);
22938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->hMFCVp8Handle.hMFCHandle == NULL) {
23038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
23138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
23238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
23338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
23438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
23538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
23638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
23738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
238440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    if (ret != OMX_ErrorNone) {
239440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        if (pDecOps != NULL) {
240440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            Exynos_OSAL_Free(pDecOps);
241440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            pVp8Dec->hMFCVp8Handle.pDecOps = NULL;
242440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        }
243440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        if (pInbufOps != NULL) {
244440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            Exynos_OSAL_Free(pInbufOps);
245440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            pVp8Dec->hMFCVp8Handle.pInbufOps = NULL;
246440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        }
247440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        if (pOutbufOps != NULL) {
248440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            Exynos_OSAL_Free(pOutbufOps);
249440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            pVp8Dec->hMFCVp8Handle.pOutbufOps = NULL;
250440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        }
251440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    }
252440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim
25338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
25438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
25538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
25638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
25738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
25838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecClose(EXYNOS_VP8DEC_HANDLE *pVp8Dec)
25938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
2603e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_ERRORTYPE            ret        = OMX_ErrorNone;
26138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                    *hMFCHandle = NULL;
26238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
26338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
26438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
26538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
2663e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
2673e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
26838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec == NULL) {
26938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
27038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
27138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
27238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
27338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
27438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
27538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
27638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
27738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
27838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (hMFCHandle != NULL) {
27938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDecOps->Finalize(hMFCHandle);
2803e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        pVp8Dec->hMFCVp8Handle.hMFCHandle = NULL;
28138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
28238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps != NULL) {
28338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pOutbufOps);
2843e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        pVp8Dec->hMFCVp8Handle.pOutbufOps = NULL;
28538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
28638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps != NULL) {
28738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pInbufOps);
2883e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        pVp8Dec->hMFCVp8Handle.pInbufOps = NULL;
28938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
29038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pDecOps != NULL) {
29138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pDecOps);
2923e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        pVp8Dec->hMFCVp8Handle.pDecOps = NULL;
29338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
29438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
29538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
29638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
29738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
29838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
29938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
30038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
30138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
30238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
30338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
30438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
30538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE            ret = OMX_ErrorNone;
30638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                    *hMFCHandle = NULL;
30738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
30838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
30938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
31038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
31138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE   *pVp8Dec = NULL;
31238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
3133e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
3143e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
31538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent == NULL) {
31638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
31738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
31838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
31938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
32038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
32138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec == NULL) {
32238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
32338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
32438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
3253e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
32638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
32738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec == NULL) {
32838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
32938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
33038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
33138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
33238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
33338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
33438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
33538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
33638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
33738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPortIndex == INPUT_PORT_INDEX)
33838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pInbufOps->Run(hMFCHandle);
33938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    else if (nPortIndex == OUTPUT_PORT_INDEX)
34038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pOutbufOps->Run(hMFCHandle);
34138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
34238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
34338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
34438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
34538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
34638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
34738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
34838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
34938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
35038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
35138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
35238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE            ret = OMX_ErrorNone;
35338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                    *hMFCHandle = NULL;
35438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
35538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
35638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
35738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
35838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE   *pVp8Dec = NULL;
35938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
3603e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
3613e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
36238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent == NULL) {
36338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
36438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
36538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
36638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
36738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
36838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec == NULL) {
36938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
37038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
37138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
37238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
37338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec == NULL) {
37438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
37538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
37638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
37738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
37838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
37938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
38038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
38138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
38238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
383440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
38438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pInbufOps->Stop(hMFCHandle);
385440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
38638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pOutbufOps->Stop(hMFCHandle);
38738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
38838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
38938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
39038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
39138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
39238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
39338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
39438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
39538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
39638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
39738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
39838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE            ret = OMX_ErrorNone;
39938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                    *hMFCHandle = NULL;
40038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
40138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
40238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
40338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
40438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE   *pVp8Dec = NULL;
40538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
4063e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
4073e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
40838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent == NULL) {
40938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
41038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
41138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
41238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
41338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
41438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec == NULL) {
41538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
41638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
41738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
41838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
41938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec == NULL) {
42038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
42138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
42238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
42338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
42438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
42538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
42638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
42738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
42838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
42938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPortIndex == INPUT_PORT_INDEX) {
43038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pVp8Dec->bSourceStart == OMX_FALSE) {
43138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pVp8Dec->hSourceStartEvent);
43238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
43338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
43438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
43538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
43638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPortIndex == OUTPUT_PORT_INDEX) {
43738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pVp8Dec->bDestinationStart == OMX_FALSE) {
43838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pVp8Dec->hDestinationStartEvent);
43938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
44038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
44138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
44238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
44338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
44438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
44538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
44638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
44738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
44838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
44938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
45038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
45138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
45238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
45338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
45438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
45538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
45638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
45738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
45838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
45938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
46038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i, nOutbufs;
46138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
46238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
46338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
46438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
46538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
4663e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
46738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
46838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((nPortIndex == INPUT_PORT_INDEX) &&
46938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pVp8Dec->bSourceStart == OMX_TRUE)) {
47038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
47138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
4723e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
47338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
47438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
47538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
47638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
47738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
47838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
47938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pInbufOps->Clear_Queue(hMFCHandle);
48038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
48138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang               (pVp8Dec->bDestinationStart == OMX_TRUE)) {
48238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_U32 dataLen[2] = {0, 0};
48338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ExynosVideoBuffer *pBuffer = NULL;
48438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
48538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
48638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
48738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        nOutbufs = pDecOps->Get_ActualBufferCount(hMFCHandle);
48838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        nOutbufs += EXTRA_DPB_NUM;
48938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < nOutbufs; i++) {
49038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer);
49138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer);
49238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
49338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pOutbufOps->Clear_Queue(hMFCHandle);
49438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
49538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
49638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
49738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
49838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
49938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
50038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
50138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
50238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
50338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
50438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
50538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
50638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
50738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
50838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
50938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
51038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE          *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
51238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
51338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
51438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                     oneFrameSize = pSrcInputData->dataLen;
51538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
51638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
51738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
51838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
51938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoGeometry      bufferConf;
52038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                  inputBufferNumber = 0;
52138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i;
52238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
52338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
52438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
52538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
52638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        EXYNOS_OMX_DATA *pDstOutputData = &pExynosOutputPort->processData;
52738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_OutputBufferGetQueue(pExynosComponent);
52838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (ret != OMX_ErrorNone) {
52938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorUndefined;
53038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
53138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
53238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->timeStamp = pSrcInputData->timeStamp;
53338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->nFlags = pSrcInputData->nFlags;
53438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
53538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData);
53638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
53738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
53838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
53938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
54038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
54138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->bThumbnailMode == OMX_TRUE)
54238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDecOps->Set_DisplayDelay(hMFCHandle, 0);
54338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
54438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* input buffer info */
54538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
54638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    bufferConf.eCompressionFormat = VIDEO_CODING_VP8;
5471ed2fc89aa809989164905497b680fa10e74a134Dima Zavin    pInbufOps->Set_Shareable(hMFCHandle);
54838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
54938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
55038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM;
55138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
55238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE;
55338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
55438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
55538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
55638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* should be done before prepare input buffer */
55738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
55838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
55938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
56038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
56138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
56238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* set input buffer geometry */
56338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
56438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
56538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
56638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
56738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
56838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
56938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* setup input buffer */
57038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
57138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
57238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
57338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
57438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
57538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
57638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
57738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Register input buffer */
57838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
57901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            ExynosVideoPlane plane;
58001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.addr = pVideoDec->pMFCDecInputBuffer[i]->VirAddr;
58101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize;
58201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.fd = 0;
58301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            if (pInbufOps->Register(hMFCHandle, &plane, 1) != VIDEO_ERROR_NONE) {
58438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
58538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
58638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
58738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
58838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
58938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Register input buffer */
59138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
59201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            ExynosVideoPlane plane;
59301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
59401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
59501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0];
59601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
59701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            Exynos_OSAL_Log(EXYNOS_LOG_TRACE,
59801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                            "%s: registering buf %d (hdr=%p) (addr=%p alloc_sz=%ld fd=%d)\n", __func__,
59901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                            i, &pExynosInputPort->extendBufferHeader[i], plane.addr, plane.allocSize,
60001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                            plane.fd);
60101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            if (pInbufOps->Register(hMFCHandle, &plane, 1) != VIDEO_ERROR_NONE) {
60238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
60338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
60438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
60538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
60638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
60738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
60838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
60938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* set output geometry */
61038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
61138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#if 0
61238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
61338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#else /* This is temporal code to fix broken thumbnail until 3D ddk supports tiled mode */
61438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE)
61538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12;
61638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    else
61738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif
6193e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
62038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
62138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
62238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
62338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
62438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
62538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
62638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* input buffer enqueue for header parsing */
6273e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
62838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, (unsigned int *)&oneFrameSize, 1, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
62938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing");
63038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//        ret = OMX_ErrorInsufficientResources;
63138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit;
63238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
63338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
63438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
63538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* start header parsing */
63638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing");
63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorCodecInit;
63938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
64038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
64138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
64238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get geometry for output */
64338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(&pVp8Dec->hMFCVp8Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry));
64438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Get_Geometry(hMFCHandle, &pVp8Dec->hMFCVp8Handle.codecOutbufConf) != VIDEO_ERROR_NONE) {
64538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info");
64638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
64738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
64838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
64938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
65038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get dpb count */
651bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    pVp8Dec->hMFCVp8Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle);
65238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->bThumbnailMode == OMX_FALSE)
653bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim        pVp8Dec->hMFCVp8Handle.maxDPBNum += EXTRA_DPB_NUM;
654bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Vp8CodecSetup nOutbufs: %d", pVp8Dec->hMFCVp8Handle.maxDPBNum);
65538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
65638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_TRUE;
65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
65838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
65938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) ||
66038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight)) {
66138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth;
66238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight;
66338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
66438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_UpdateFrameSize(pOMXComponent);
66738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
66838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
66938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /** Send Port Settings changed call back **/
67038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (*(pExynosComponent->pCallbacks->EventHandler))
67138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (pOMXComponent,
67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 pExynosComponent->callbackData,
67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_EventPortSettingsChanged, /* The command was completed */
67438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_DirOutput, /* This is the port index */
67538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 0,
67638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 NULL);
67738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
67838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
67938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) ||
68038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight) ||
681bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            (pExynosOutputPort->portDefinition.nBufferCountActual != pVp8Dec->hMFCVp8Handle.maxDPBNum)) {
68238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth;
68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight;
68438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
68538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
687bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            pExynosOutputPort->portDefinition.nBufferCountActual = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2;
688bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            pExynosOutputPort->portDefinition.nBufferCountMin = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2;
68938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
69038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_UpdateFrameSize(pOMXComponent);
69138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /** Send Port Settings changed call back **/
69438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (*(pExynosComponent->pCallbacks->EventHandler))
69538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (pOMXComponent,
69638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 pExynosComponent->callbackData,
69738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_EventPortSettingsChanged, /* The command was completed */
69838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_DirOutput, /* This is the port index */
69938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 0,
70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 NULL);
70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
70238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
70338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SleepMillisec(0);
70438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorInputDataDecodeYet;
70538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    VP8CodecStop(pOMXComponent, INPUT_PORT_INDEX);
70638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
70738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
71038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
71138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
71238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
71338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
71438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
71538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
71938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
72038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
72138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
72238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
72338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
72438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
72538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
72657fbf5bae538500a8332718cec7a7446e02d4da4SeungBeom Kim
72738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i, nOutbufs;
72838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
72938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
73138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get dpb count */
732bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    nOutbufs = pVp8Dec->hMFCVp8Handle.maxDPBNum;
73338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
73438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* should be done before prepare output buffer */
73538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
73638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
73838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
73938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
74038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps->Set_Shareable(hMFCHandle);
74138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
74238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
74338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
74438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
74538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
74638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
74738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int YBufferSize = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth, pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight);
74838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int CBufferSize = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth, pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight >> 1);
74938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32 dataLen[2] = {0, 0};
75038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
75101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        /* Register output buffer */
75238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < nOutbufs; i++) {
75301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            ExynosVideoPlane planes[2];
75401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            int plane;
75501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
75638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_OUTPUT_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_OUTPUT_BUFFER));
75738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] =
75838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, YBufferSize, NORMAL_MEMORY);
75938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] =
76038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, CBufferSize, NORMAL_MEMORY);
76138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[0] = YBufferSize;
76238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[1] = CBufferSize;
76338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
76401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            pVideoDec->pMFCDecOutputBuffer[i]->fd[0] =
76501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
76601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                                                   pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
76701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin             pVideoDec->pMFCDecOutputBuffer[i]->fd[1] =
76801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
76901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                                                   pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
77001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
77138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if ((pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] == NULL) ||
77238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] == NULL)) {
77338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
77438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
77538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
77638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
77701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
77801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            for (plane = 0; plane < 2; plane++) {
77901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[plane];
78001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
78101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane];
78201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            }
78301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
78401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            if (pOutbufOps->Register(hMFCHandle, planes, 2) != VIDEO_ERROR_NONE) {
78538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
78638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
78738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
78838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
78938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->VirAddr, (unsigned int *)dataLen, 2, NULL);
79038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
79138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
79201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        /* Register output buffer */
79338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
79438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
79538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
79638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//        OMX_U32 width = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
79738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//        OMX_U32 height = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
79838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//        OMX_U32 stride;
79938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
80001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            EXYNOS_OMX_BUFFERHEADERTYPE *buffer = &pExynosOutputPort->extendBufferHeader[i];
80101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            ExynosVideoPlane planes[2];
80201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
80301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            /* luma */
80401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            planes[0].addr = buffer->pYUVBuf[0];
80501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            planes[0].fd = buffer->buf_fd[0];
80601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            planes[0].allocSize = YBufferSize;
80701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            /* chroma */
80801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            planes[1].addr = buffer->pYUVBuf[1];
80901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            planes[1].fd = buffer->buf_fd[1];
81001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            planes[1].allocSize = CBufferSize;
81101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
81201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            Exynos_OSAL_Log(EXYNOS_LOG_TRACE,
81301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                            "%s: registering buf %d (hdr=%p) (l_addr=%p l_fd=%d c_addr=%p c_fd=%d)\n",
81401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                            __func__, i, buffer, planes[0].addr, planes[0].fd, planes[1].addr,
81501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                            planes[1].fd);
81601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
81738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//            Exynos_OSAL_LockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, width, height,
81838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//                                pExynosOutputPort->portDefinition.format.video.eColorFormat,
81938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//                                &stride, pExynosOutputPort->extendBufferHeader[i].pYUVBuf);
82001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            if (pOutbufOps->Register(hMFCHandle, planes, 2) != VIDEO_ERROR_NONE) {
82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
82438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
82538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf, (unsigned int *)dataLen, 2, NULL);
82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//            Exynos_OSAL_UnlockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
82738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
82938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
83138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
83238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
83338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
83438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
83538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
83638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        VP8CodecStop (pOMXComponent, OUTPUT_PORT_INDEX);
83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
83838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_TRUE;
83938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
84038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
84138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
84238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
84338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
84538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
84638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
84738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
84838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetParameter(
84920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
85020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nParamIndex,
85120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_PTR     pComponentParameterStructure)
85220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
85338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
85438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
85520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
85620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
85720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
85820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
85920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
86020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
86120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
86220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
86320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
86420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
86520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
86620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
86720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
86820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
86920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
87020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
87120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
87220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
87320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
87420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
87520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
87620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
87720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
87820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
87920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nParamIndex) {
88020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
88120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
88220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
88320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
88420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
88520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
88620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
88720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
88820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE);
88920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
89020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
89120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoErrorCorrection:
89220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
89320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
89420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
89520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_VP8DEC_HANDLE                *pVp8Dec                 = NULL;
89620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
89720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
89820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
89920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
90020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
90120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
90220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
90320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
90420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
90520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
90620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
90720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
90820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX];
90920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
91020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
91120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
91220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
91320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
91420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
91520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
91620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
91720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
91820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
91920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
92020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
92120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
92220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
92320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
92420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
92520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
92620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
92738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SetParameter(
92820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
92920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
93020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentParameterStructure)
93120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
93238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE           ret = OMX_ErrorNone;
93338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
93420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
93520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
93620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
93720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
93820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
93920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
94020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
94120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
94220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
94320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
94420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
94520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
94620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
94720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
94820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
94920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
95020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
95120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
95220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
95320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
95420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
95520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
95620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
95720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
95820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
95920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
96020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
96120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
96220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
96320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
96420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
96520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
96620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
96720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
96820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
96920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateOperation;
97020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
97120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
97220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
97320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE)) {
97420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX;
97520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
97620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadParameter;
97720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
97820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
97920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
98020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
98120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoErrorCorrection:
98220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
98320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
98420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
98520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_VP8DEC_HANDLE                *pVp8Dec                 = NULL;
98620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
98720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
98820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
98920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
99020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
99120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
99220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
99320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
99420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
99520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
99620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
99720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
99820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX];
99920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
100020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
100120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
100220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
100320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
100420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
100520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
100620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
100720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
100820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
100920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
101020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
101120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
101220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
101320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
101420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
101520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
101620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
101738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetConfig(
101820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
101920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INDEXTYPE  nIndex,
102020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR        pComponentConfigStructure)
102120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
102220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
102320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
102420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
102620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
102720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1028440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    if (hComponent == NULL || pComponentConfigStructure == NULL) {
102920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
103020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
103120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
103220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
103320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
103420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
103520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
103620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
103720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
103820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
103920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
104020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
104120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
104220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
104320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
104420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
104520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
104620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
104720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
104820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
104920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
105020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
105120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
105220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
105320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
105420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
105520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
105620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
105720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
105820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
105938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SetConfig(
106020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
106120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INDEXTYPE  nIndex,
106220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR        pComponentConfigStructure)
106320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
106420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
106520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
106620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
106720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
106820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
106920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1070440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    if (hComponent == NULL || pComponentConfigStructure == NULL) {
107120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
107220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
107520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
107620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
107720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
107820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
107920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
108020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
108120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
108220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
108320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
108420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
108520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
108620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
108720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
108820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
109020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
109120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
109220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
109520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
110020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
110138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetExtensionIndex(
110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_HANDLETYPE  hComponent,
110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_STRING      cParameterName,
11043e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_OUT OMX_INDEXTYPE  *pIndexType)
110520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
110720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
110920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
111020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
111220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
111320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
111420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
111520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
111620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
111720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
111820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
111920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
112020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
112120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
112220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
112320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
112420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((cParameterName == NULL) || (pIndexType == NULL)) {
112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
112920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
113020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
113220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
113320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
113420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
113520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
113620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
113720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        *pIndexType = OMX_IndexVendorThumbnailMode;
113820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
113920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
114020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
114120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
114220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
114420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
114520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
114720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
114820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_ComponentRoleEnum(
115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8        *cRole,
115220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32        nIndex)
115320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
115420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
115520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
115620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
115720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
115820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
115920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
116020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (cRole == NULL)) {
116120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
116220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
116320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
116420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) {
116520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE);
116620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
116720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
116820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNoMore;
116920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
117020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
117120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
117220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
117320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
117420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
117520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
117620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
117720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Init */
117838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
117920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
11803e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
11813e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
11823e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec         = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
11833e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
11843e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
11853e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_VP8DEC_HANDLE          *pVp8Dec           = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
11863e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_PTR                        hMFCHandle        = pVp8Dec->hMFCVp8Handle.hMFCHandle;
118738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
118838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
118938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
119038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
119120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
119220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    CSC_METHOD csc_method = CSC_METHOD_SW;
119338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i = 0;
1194800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
11953e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
11963e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
119738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_FALSE;
119838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_FALSE;
119938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->bUseFlagEOF = OMX_TRUE;
120038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
120138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
120238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* H.264 Codec Open */
120338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = VP8CodecOpen(pVp8Dec);
120438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
120520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
120620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
120720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
120838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
120938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
121038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
121138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
121238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
121338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
121438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
121538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
12163e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
121738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /*************/
121838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /*    TBD    */
121938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /*************/
122038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /* Use ION Allocator */
122138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_INPUT_BUFFER));
122238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecInputBuffer[i]->VirAddr = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
122338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr == NULL) {
122438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
122538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
122638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
122738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
122801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            pVideoDec->pMFCDecInputBuffer[i]->fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
122938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecInputBuffer[i]->bufferSize = DEFAULT_MFC_INPUT_BUFFER_SIZE;
123038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecInputBuffer[i]->dataSize   = 0;
123120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
123238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
123338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
123438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
123538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
123620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
123738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
123838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
123938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
124038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
124138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
124220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
124320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
124438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
124538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
124638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
124738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
124838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
124938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
125038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
125138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
125238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
125338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
125438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->bSourceStart = OMX_FALSE;
125538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalCreate(&pVp8Dec->hSourceStartEvent);
125638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->bDestinationStart = OMX_FALSE;
125738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalCreate(&pVp8Dec->hDestinationStartEvent);
125820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
125920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
126020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
126120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVp8Dec->hMFCVp8Handle.indexTimestamp = 0;
126220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = 0;
126320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->getAllDelayBuffer = OMX_FALSE;
126520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#if 0//defined(USE_CSC_GSCALER)
126738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
1268800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#endif
126938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->csc_handle = csc_init(csc_method);
127038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->csc_handle == NULL) {
127138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
127238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
1273800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
127438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->csc_set_format = OMX_FALSE;
127520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
127620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
127720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
127820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
127920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
128020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
128120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Terminate */
128338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
128420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
128538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
128638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
128738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
128838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
128938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
129038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
129138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_PTR                hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
129238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
129338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
129438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
129538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
129638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
129738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i = 0;
129820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
130020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
130138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->csc_handle != NULL) {
130238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        csc_deinit(pVideoDec->csc_handle);
130338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVideoDec->csc_handle = NULL;
130438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
130520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
130638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalTerminate(pVp8Dec->hDestinationStartEvent);
130738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hDestinationStartEvent = NULL;
130838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->bDestinationStart = OMX_FALSE;
130938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalTerminate(pVp8Dec->hSourceStartEvent);
131038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hSourceStartEvent = NULL;
131138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->bSourceStart = OMX_FALSE;
131238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
131338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
13143e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
131538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
131638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] != NULL)
131738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
131838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] != NULL)
131938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
132038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
132138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pVideoDec->pMFCDecOutputBuffer[i] = NULL;
132238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
132338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
132420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
132538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
132638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
132738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
132838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
132938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
133038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
133138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
133220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
133320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
133438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
13353e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
133638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
133738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr != NULL)
13383e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
13393e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
13403e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i] = NULL;
13413e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim            }
134238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
134320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
134438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
134538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
134638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
134738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
134838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
134938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
135038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
135120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
135238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    VP8CodecClose(pVp8Dec);
135320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
135420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
135520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
135620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
135720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
135820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
135920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
136038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
136120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
136238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE               ret = OMX_ErrorNone;
136338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
136438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
136538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
136638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
136738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
136838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
136938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32  oneFrameSize = pSrcInputData->dataLen;
137038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
137138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
137238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
137338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
137438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i;
137520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
137620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
137720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
137838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc == OMX_FALSE) {
137938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = VP8CodecSrcSetup(pOMXComponent, pSrcInputData);
138020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
138120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
138238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_FALSE) {
138338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = VP8CodecDstSetup(pOMXComponent);
138438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
138538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
138638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((Check_VP8_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize) == OMX_TRUE) ||
13873e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
138838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->timeStamp;
138938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->nFlags;
139038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pVp8Dec->hMFCVp8Handle.indexTimestamp, pSrcInputData->nFlags);
139138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDecOps->Set_FrameTag(hMFCHandle, pVp8Dec->hMFCVp8Handle.indexTimestamp);
139238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec->hMFCVp8Handle.indexTimestamp++;
139338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec->hMFCVp8Handle.indexTimestamp %= MAX_TIMESTAMP;
139438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
139538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* queue work for input buffer */
139638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
139738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, (unsigned int *)&oneFrameSize, 1, pSrcInputData->bufferHeader);
139838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (codecReturn != VIDEO_ERROR_NONE) {
139938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
140038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
140120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
140220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
140338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        VP8CodecStart(pOMXComponent, INPUT_PORT_INDEX);
140438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pVp8Dec->bSourceStart == OMX_FALSE) {
140538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVp8Dec->bSourceStart = OMX_TRUE;
140638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pVp8Dec->hSourceStartEvent);
140738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
140838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
140938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pVp8Dec->bDestinationStart == OMX_FALSE) {
141038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVp8Dec->bDestinationStart = OMX_TRUE;
141138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pVp8Dec->hDestinationStartEvent);
141238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
1413800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        }
1414800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1415800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
141638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
141720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
141838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
141938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
142020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
142238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
142320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
142538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
142638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
142738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
142838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
142938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
143038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
143138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
143238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
143338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
143438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer       *pVideoBuffer;
143520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
143638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
143720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
143838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
143920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
144038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->dataLen       = 0;
144138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->usedDataLen   = 0;
144238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->remainDataLen = 0;
144338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->nFlags    = 0;
144438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->timeStamp = 0;
144520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
144638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoBuffer == NULL) {
144738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
144801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        pSrcOutputData->buffer.singlePlaneBuffer.fd = 0;
144938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->allocSize  = 0;
145038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->pPrivate = NULL;
145138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->bufferHeader = NULL;
145238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
145338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
145401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
145538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->allocSize  = pVideoBuffer->planes[0].allocSize;
145638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
145738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
145838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            int i = 0;
145938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->VirAddr) {
146038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
146138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
14623e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                    ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
146338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    goto EXIT;
146438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
146538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                i++;
146638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
146738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
146838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
146920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "i: %d, out dataBuffer: 0x%x", i, pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer);
147120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
147220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* For Share Buffer */
147438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
147520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
147620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
147820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
148020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
148138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
148220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
148320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
1484800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
148538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
148620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
148738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
148838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
148938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
149038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
149138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
149238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
149338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
149438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32 dataLen = 0;
149538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
149620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
149720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
149820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
149938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
150038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
150138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
150220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
150320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
150420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
150538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer, (unsigned int *)&dataLen, 2, pDstInputData->bufferHeader);
150638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (codecReturn != VIDEO_ERROR_NONE) {
150738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
15083e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
150938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
151038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
151138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    VP8CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
151220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
151420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
151638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
151720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
151938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
152020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
152138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
152238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
152338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
152438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
152538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
152638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
152738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
152838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
152938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
153038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
153138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
153238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer       *pVideoBuffer;
153338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
153438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoGeometry *bufferGeometry;
153538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
153638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_S32 indexTimestamp = 0;
153720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
153920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
154038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->bDestinationStart == OMX_FALSE) {
154138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
154238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
154338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
154420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
154538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    while (1) {
154638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
154738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorNone;
154838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
154938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
155038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        displayStatus = pVideoBuffer->displayStatus;
155138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
155238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
155338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
155438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
155538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
155638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
155738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoBuffer != NULL) {
155838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorNone;
155938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                break;
156020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
156138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorUndefined;
156238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                break;
156320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
156420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
156538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
156638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
156738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone)
156838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
156938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
157038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.outputIndexTimestamp++;
157138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
157238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
157338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[0] = pVideoBuffer->planes[0].addr;
157401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin    pDstOutputData->buffer.multiPlaneBuffer.fd[0] = pVideoBuffer->planes[0].fd;
157538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[1] = pVideoBuffer->planes[1].addr;
157601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin    pDstOutputData->buffer.multiPlaneBuffer.fd[1] = pVideoBuffer->planes[1].fd;
157738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[2] = pVideoBuffer->planes[2].addr;
157801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin    pDstOutputData->buffer.multiPlaneBuffer.fd[2] = pVideoBuffer->planes[2].fd;
157938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->allocSize   = pVideoBuffer->planes[0].allocSize + pVideoBuffer->planes[1].allocSize + pVideoBuffer->planes[2].allocSize;
158038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->dataLen     = pVideoBuffer->planes[0].dataSize + pVideoBuffer->planes[1].dataSize + pVideoBuffer->planes[2].dataSize;
158138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->usedDataLen = 0;
158238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->pPrivate = pVideoBuffer;
158338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* For Share Buffer */
158438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
158538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
158638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
158738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    bufferGeometry = &pVp8Dec->hMFCVp8Handle.codecOutbufConf;
158838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
158938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
159038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    switch (bufferGeometry->eColorFormat) {
159138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case VIDEO_COLORFORMAT_NV12:
159238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
159338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
159438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case VIDEO_COLORFORMAT_NV12_TILED:
159538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    default:
159638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
159738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
159838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
159938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
160038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
16013e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
160238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
160338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
160438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
160538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
160638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
16073e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
160838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
160938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = 0x00;
161038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = 0x00;
161120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
161220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
161338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* For timestamp correction. if mfc support frametype detect */
161438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
161538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef NEED_TIMESTAMP_REORDER
161638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
161738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
161838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
161938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = indexTimestamp;
162038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
162138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
162238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
162320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
162438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#else
162538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
162638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
162738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif
162838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData->timeStamp, pDstOutputData->timeStamp / 1E6, indexTimestamp, pDstOutputData->nFlags);
162938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
163020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
163138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
163238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
16333e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
163438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->remainDataLen = 0;
163538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
163638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
163738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
163838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
163938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
164038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
164138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
164238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
164338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
164438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
164538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
164638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
164738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
164838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
164938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
165038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
165138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
165238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
165320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
165438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
165520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
165638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
165720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
165838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
165920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
166038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
166138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
166238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
166320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
166420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
166538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_VP8Dec_SrcIn(pOMXComponent, pSrcInputData);
166638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
166738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
166838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
166938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
167038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
167120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
167238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
167338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
167420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
167538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
167638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
1677800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
167838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
167938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
168038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
168138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
168238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
168338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
168420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
168538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
168620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
168738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
168838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
168938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
169038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
1691800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
169238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
169338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
169438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorNone;
169538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
169620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
169738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
169838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pVp8Dec->bSourceStart == OMX_FALSE) &&
169938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang       (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
170038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SignalWait(pVp8Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
170138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SignalReset(pVp8Dec->hSourceStartEvent);
170238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
170320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
170438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_VP8Dec_SrcOut(pOMXComponent, pSrcOutputData);
170538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) &&
170638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pExynosComponent->currentState == OMX_StateExecuting)) {
170738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
170838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
170938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
171038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
171120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
171238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
171338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
171420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
171538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
171638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
171738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
171838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
171938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
172038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
172138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
172238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
172338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
172438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
172538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
172638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
172738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
172838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
172938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
173038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
173138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
173238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
173338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
173438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
173538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
173638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVp8Dec->bDestinationStart == OMX_FALSE) &&
173738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
173838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalWait(pVp8Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
173938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalReset(pVp8Dec->hDestinationStartEvent);
174020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
174138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
174238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_TRUE) {
174338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_VP8Dec_DstIn(pOMXComponent, pDstInputData);
174438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (ret != OMX_ErrorNone) {
174538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
174638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
174738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
174820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
174920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
175020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
175120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
175220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
175320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
175420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
175520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
175620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
175738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
175820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
175938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
176038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
176138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
176238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
176320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
176420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
176520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
176638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
176720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
176820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
176920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
177038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
177120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
177220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
177320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
177420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
177538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
177638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVp8Dec->bDestinationStart == OMX_FALSE) &&
177738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
177838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalWait(pVp8Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
177938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalReset(pVp8Dec->hDestinationStartEvent);
178020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
178138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
178238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_VP8Dec_DstOut(pOMXComponent, pDstOutputData);
178338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) &&
178438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pExynosComponent->currentState == OMX_StateExecuting)) {
178538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
178638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
178738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
178820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
178920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
179020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
179120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
179220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
179320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
179420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
179520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
179620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
179720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE  hComponent,
179820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_STRING      componentName)
179920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
180020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                    ret                = OMX_ErrorNone;
180120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE               *pOMXComponent      = NULL;
180220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT        *pExynosComponent   = NULL;
180320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT             *pExynosPort        = NULL;
180420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT   *pVideoDec          = NULL;
180520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_VP8DEC_HANDLE            *pVp8Dec            = NULL;
180620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int i = 0;
180720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
180820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
180920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
181020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (componentName == NULL)) {
181120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
181220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
181320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
181420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
181520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_VP8_DEC, componentName) != 0) {
181620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
181720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
181820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
181920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
182020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
182120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
182220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
182320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
182420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
182520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
182620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
182720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
182820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
182920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
183020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
183120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->componentName == NULL) {
183220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
183320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
183420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
183520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
183620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
183720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
183820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
183920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVp8Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_VP8DEC_HANDLE));
184020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pVp8Dec == NULL) {
184120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
184220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
184320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
184420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
184520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
184620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pVp8Dec, 0, sizeof(EXYNOS_VP8DEC_HANDLE));
184720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
184820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pVp8Dec;
184920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
185020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_VP8_DEC);
185120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
185220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set componentVersion */
185320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
185420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
185520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
185620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
185720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set specVersion */
185820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
185920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
186020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
186120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
186220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
186320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Input port */
186420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
186520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
186620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
186720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
186820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
186920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
187020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX;
187120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
187220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/x-vnd.on2.vp8");
187320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.pNativeRender = 0;
187420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
187520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
187620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
187738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->bufferProcessType = BUFFER_SHARE;
187838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portWayType = WAY2_PORT;
187920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
188020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Output port */
188120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
188220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
188320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
188420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
188520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
188620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
188720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
188820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
188920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
189020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.pNativeRender = 0;
189120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
189220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
189320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
189438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE;
189538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portWayType = WAY2_PORT;
189638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
189738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->GetParameter      = &Exynos_VP8Dec_GetParameter;
189838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->SetParameter      = &Exynos_VP8Dec_SetParameter;
189938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->GetConfig         = &Exynos_VP8Dec_GetConfig;
190038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->SetConfig         = &Exynos_VP8Dec_SetConfig;
190138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->GetExtensionIndex = &Exynos_VP8Dec_GetExtensionIndex;
190238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->ComponentRoleEnum = &Exynos_VP8Dec_ComponentRoleEnum;
190320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
190420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
190538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_codec_componentInit      = &Exynos_VP8Dec_Init;
190638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_codec_componentTerminate = &Exynos_VP8Dec_Terminate;
190738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
190838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_srcInputProcess  = &Exynos_VP8Dec_srcInputBufferProcess;
190938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_srcOutputProcess = &Exynos_VP8Dec_srcOutputBufferProcess;
191038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_dstInputProcess  = &Exynos_VP8Dec_dstInputBufferProcess;
191138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_dstOutputProcess = &Exynos_VP8Dec_dstOutputBufferProcess;
191238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
19133e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    pVideoDec->exynos_codec_start            = &VP8CodecStart;
19143e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    pVideoDec->exynos_codec_stop             = &VP8CodecStop;
191538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_bufferProcessRun = &VP8CodecOutputBufferProcessRun;
191638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_enqueueAllBuffer = &VP8CodecEnQueueAllBuffer;
191738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
191838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_checkInputFrame                 = &Check_VP8_Frame;
191938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
192038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
192138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
192238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
192338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->hSharedMemory == NULL) {
19243e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
192538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pVp8Dec);
192638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
192738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
192838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
192938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
193038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
193120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
193220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->currentState = OMX_StateLoaded;
193320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
193420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
193520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
193620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
193720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
193820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
193920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
194020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
194120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
194220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentDeinit(
194320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent)
194420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
194520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                ret                = OMX_ErrorNone;
194620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE           *pOMXComponent      = NULL;
194720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT    *pExynosComponent   = NULL;
194838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
194920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_VP8DEC_HANDLE        *pVp8Dec            = NULL;
195020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
195120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
195220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
195320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
195420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
195520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
195620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
195720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
195820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
195938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
196038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
196138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
196220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
196320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pExynosComponent->componentName);
196420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = NULL;
196520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
196638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
196720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pVp8Dec != NULL) {
196820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pVp8Dec);
196938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec = pVideoDec->hCodecHandle = NULL;
197020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
197120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
197220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
197320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
197420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
197520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
197620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
197720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
197820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
197920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
198020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
198120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
198220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
198320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
1984