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]);
474ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
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)) {
48294d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim        OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {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)) {
52654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
52754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
52854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        if (OMXBuffer == NULL) {
52938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorUndefined;
53038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
53138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
53238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
53354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
53454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        OMXBuffer->nFlags = pSrcInputData->nFlags;
53554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
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) {
54994d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim        bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth
55094d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                                * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
55138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM;
55238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
55338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE;
55438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
55538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
55638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
55738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* should be done before prepare input buffer */
55838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
55938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
56038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
56138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
56238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
56338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* set input buffer geometry */
56438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
56538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
56638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
56738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
56838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
56938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
57038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* setup input buffer */
57138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
57238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
57338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
57438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
57538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
57638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
57738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
57838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Register input buffer */
57938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
58001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            ExynosVideoPlane plane;
581ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            plane.addr = pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0];
582ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize[0];
583ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            plane.fd = pVideoDec->pMFCDecInputBuffer[i]->fd[0];
58494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
58538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
58638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
58738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
58838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
58938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
59138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Register input buffer */
59238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
59301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            ExynosVideoPlane plane;
59401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
59501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
59601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0];
59794d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
59838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
59938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
60038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
60138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
60238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
60338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
60438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
60538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* set output geometry */
60638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
60738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
60838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
60938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
61038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
61138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
61238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
61338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
61438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* input buffer enqueue for header parsing */
6153e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
61694d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
61794d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                        (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing");
61938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//        ret = OMX_ErrorInsufficientResources;
62038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit;
62138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
62238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
62338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
62438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* start header parsing */
62538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
62638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing");
62738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorCodecInit;
62838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
62938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
63038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
63138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get geometry for output */
63238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(&pVp8Dec->hMFCVp8Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry));
63338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Get_Geometry(hMFCHandle, &pVp8Dec->hMFCVp8Handle.codecOutbufConf) != VIDEO_ERROR_NONE) {
63438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info");
63538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
63638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
63938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get dpb count */
640bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    pVp8Dec->hMFCVp8Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle);
64138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->bThumbnailMode == OMX_FALSE)
642bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim        pVp8Dec->hMFCVp8Handle.maxDPBNum += EXTRA_DPB_NUM;
643bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Vp8CodecSetup nOutbufs: %d", pVp8Dec->hMFCVp8Handle.maxDPBNum);
64438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
64538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_TRUE;
64638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
64738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
64838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) ||
64938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight)) {
65038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth;
65138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight;
65238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
65338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
65438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
65538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_UpdateFrameSize(pOMXComponent);
65638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
65838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /** Send Port Settings changed call back **/
65938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (*(pExynosComponent->pCallbacks->EventHandler))
66038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (pOMXComponent,
66138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 pExynosComponent->callbackData,
66238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_EventPortSettingsChanged, /* The command was completed */
66338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_DirOutput, /* This is the port index */
66438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 0,
66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 NULL);
66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
66738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
66838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) ||
66938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight) ||
670bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            (pExynosOutputPort->portDefinition.nBufferCountActual != pVp8Dec->hMFCVp8Handle.maxDPBNum)) {
67138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth;
67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight;
67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
67438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
67538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
676bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            pExynosOutputPort->portDefinition.nBufferCountActual = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2;
677bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            pExynosOutputPort->portDefinition.nBufferCountMin = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2;
67838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
67938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_UpdateFrameSize(pOMXComponent);
68038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
68138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
68238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /** Send Port Settings changed call back **/
68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (*(pExynosComponent->pCallbacks->EventHandler))
68438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (pOMXComponent,
68538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 pExynosComponent->callbackData,
68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_EventPortSettingsChanged, /* The command was completed */
68738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_DirOutput, /* This is the port index */
68838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 0,
68938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 NULL);
69038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
69138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SleepMillisec(0);
69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorInputDataDecodeYet;
69438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    VP8CodecStop(pOMXComponent, INPUT_PORT_INDEX);
69538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
69638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
69738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
69838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
69938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
70238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
70338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
70438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
70538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
70638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
70738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
71038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
71138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
71238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
71338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
71438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
71557fbf5bae538500a8332718cec7a7446e02d4da4SeungBeom Kim
71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i, nOutbufs;
71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
71938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
72038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get dpb count */
721bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    nOutbufs = pVp8Dec->hMFCVp8Handle.maxDPBNum;
72238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
723fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
724fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim        /* should be done before prepare output buffer */
725fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim        if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
726fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim            ret = OMX_ErrorInsufficientResources;
727fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim            goto EXIT;
728fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim        }
72938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
73138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps->Set_Shareable(hMFCHandle);
73238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
73338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
73438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
73538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
73638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
738ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
739ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
74094d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
741ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int plane;
742ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
743ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    nAllocLen[0] = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth,
744ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight);
745ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    nAllocLen[1] = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth,
746ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight >> 1);
747ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
74838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
74901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        /* Register output buffer */
75038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < nOutbufs; i++) {
751ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
752ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
75301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
75494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
755ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] =
756ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], NORMAL_MEMORY);
757ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) {
758ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
759ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    ret = OMX_ErrorInsufficientResources;
760ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    goto EXIT;
761ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
762ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] =
763ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
764ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                                                       pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
765ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane];
766ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
767ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane];
76801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane];
769ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
77001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            }
77101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
77294d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
77338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
77438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
77538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
77638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
777ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
77894d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                            (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
77938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
78038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
78101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        /* Register output buffer */
78238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
78338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
78438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
785ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#ifdef USE_ANB
786ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) {
787ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
788ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
789ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane];
790ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane];
791ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    planes[plane].allocSize = nAllocLen[plane];
792ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
793ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
794ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
795ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
796ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    ret = OMX_ErrorInsufficientResources;
797ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    goto EXIT;
798ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
799569b6f9c0afe66023cc50fe41664240f67b7c6bfSeungBeom Kim                pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf,
800569b6f9c0afe66023cc50fe41664240f67b7c6bfSeungBeom Kim                              (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
80138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
802ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        } else {
803ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            ret = OMX_ErrorNotImplemented;
804ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            goto EXIT;
80538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
806ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#else
807ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        ret = OMX_ErrorNotImplemented;
808ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        goto EXIT;
809ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#endif
81038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
811ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
81238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
81338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
81438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
81538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
81638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
81738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
81838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
81938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        VP8CodecStop (pOMXComponent, OUTPUT_PORT_INDEX);
82038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_TRUE;
82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
82438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
82538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
82738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
82938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
83138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetParameter(
83220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
83320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nParamIndex,
83420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_PTR     pComponentParameterStructure)
83520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
83638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
83820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
83920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
84020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
84120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
84220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
84320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
84420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
84520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
84620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
84720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
84820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
84920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
85020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
85120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
85220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
85320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
85420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
85520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
85620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
85720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
85820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
85920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
86020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
86120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
86220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nParamIndex) {
86320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
86420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
86520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
86620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
86720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
86820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
86920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
87020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
87120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE);
87220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
87320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
87420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoErrorCorrection:
87520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
87620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
87720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
87820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_VP8DEC_HANDLE                *pVp8Dec                 = NULL;
87920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
88020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
88120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
88220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
88320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
88420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
88520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
88620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
88720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
88820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
88920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
89020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
89120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX];
89220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
89320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
89420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
89520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
89620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
89720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
89820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
89920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
90020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
90120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
90220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
90320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
90420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
90520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
90620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
90720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
90820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
90920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
91038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SetParameter(
91120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
91220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
91320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentParameterStructure)
91420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
91538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE           ret = OMX_ErrorNone;
91638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
91720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
91820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
91920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
92020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
92120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
92220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
92320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
92420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
92520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
92620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
92720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
92820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
92920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
93020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
93120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
93220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
93320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
93420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
93520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
93620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
93720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
93820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
93920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
94020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
94120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
94220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
94320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
94420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
94520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
94620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
94720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
94820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
94920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
95020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
95120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
95220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateOperation;
95320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
95420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
95520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
95620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE)) {
95720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX;
95820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
95920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadParameter;
96020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
96120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
96220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
96320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
96420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoErrorCorrection:
96520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
96620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
96720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
96820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_VP8DEC_HANDLE                *pVp8Dec                 = NULL;
96920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
97020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
97120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
97220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
97320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
97420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
97520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
97620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
97720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
97820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
97920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
98020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
98120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX];
98220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
98320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
98420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
98520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
98620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
98720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
98820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
98920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
99020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
99120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
99220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
99320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
99420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
99520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
99620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
99720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
99820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
99920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
100038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetConfig(
100120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
100220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INDEXTYPE  nIndex,
100320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR        pComponentConfigStructure)
100420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
100520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
100620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
100720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
100820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
100920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
101020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1011440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    if (hComponent == NULL || pComponentConfigStructure == NULL) {
101220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
101320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
101420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
101520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
101620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
101720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
101820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
101920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
102020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
102120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
102220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
102320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
102420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
102620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
102720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
102820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
102920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
103020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
103120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
103220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
103320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
103420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
103520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
103620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
103720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
103820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
103920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
104020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
104120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
104238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SetConfig(
104320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
104420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INDEXTYPE  nIndex,
104520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR        pComponentConfigStructure)
104620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
104720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
104820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
104920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
105020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
105120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
105220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1053440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    if (hComponent == NULL || pComponentConfigStructure == NULL) {
105420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
105520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
105620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
105720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
105820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
105920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
106020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
106120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
106220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
106320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
106420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
106520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
106620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
106720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
106820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
106920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
107020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
107120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
107220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
107520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
107620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
107720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
107820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
107920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
108020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
108220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
108320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetExtensionIndex(
108520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_HANDLETYPE  hComponent,
108620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_STRING      cParameterName,
10873e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_OUT OMX_INDEXTYPE  *pIndexType)
108820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
108920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
109020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
109120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
109220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
109520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
110020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
110120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
110420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
110520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
110720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
110920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((cParameterName == NULL) || (pIndexType == NULL)) {
111020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
111220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
111320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
111420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
111520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
111620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
111720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
111820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
111920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
112020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        *pIndexType = OMX_IndexVendorThumbnailMode;
112120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
112220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
112320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
112420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
112920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
113020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
113238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_ComponentRoleEnum(
113320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
113420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8        *cRole,
113520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32        nIndex)
113620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
113720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
113820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
113920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
114020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
114220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (cRole == NULL)) {
114420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
114520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
114620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
114720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) {
114820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE);
114920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNoMore;
115220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
115320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
115420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
115520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
115620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
115720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
115820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
115920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
116020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Init */
116138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
116220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
11633e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
11643e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
11653e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec         = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
11663e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
11673e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
11683e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_VP8DEC_HANDLE          *pVp8Dec           = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
11693e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_PTR                        hMFCHandle        = pVp8Dec->hMFCVp8Handle.hMFCHandle;
117038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
117138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
117238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
117338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
117420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
117520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    CSC_METHOD csc_method = CSC_METHOD_SW;
1176ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int i, plane;
1177800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
11783e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
11793e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
118038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_FALSE;
118138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_FALSE;
118238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->bUseFlagEOF = OMX_TRUE;
118338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
118438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
118538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* H.264 Codec Open */
118638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = VP8CodecOpen(pVp8Dec);
118738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
118820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
118920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
119020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
119138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
119238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
119338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
119438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
119538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
119638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
119738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
119838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
11993e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1200ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
1201ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
120238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
1203ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
1204ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1205ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                /* Use ION Allocator */
1206ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
1207ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1208ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
1209ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
1210ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
1211ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
1212ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    ret = OMX_ErrorInsufficientResources;
1213ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    goto EXIT;
1214ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
1215ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1216ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            }
121738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
121838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
121920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
122038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
122138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
122238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
122338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
122438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
122520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
122620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
122738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
122838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
122938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
123038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
123138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
123238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
123338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
123438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
123538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
123638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
123738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->bSourceStart = OMX_FALSE;
123838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalCreate(&pVp8Dec->hSourceStartEvent);
123938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->bDestinationStart = OMX_FALSE;
124038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalCreate(&pVp8Dec->hDestinationStartEvent);
124120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
124220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
124320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
124420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVp8Dec->hMFCVp8Handle.indexTimestamp = 0;
124520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = 0;
124620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
124720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->getAllDelayBuffer = OMX_FALSE;
124820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
124938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#if 0//defined(USE_CSC_GSCALER)
125038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
1251800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#endif
125238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->csc_handle = csc_init(csc_method);
125338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->csc_handle == NULL) {
125438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
125538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
1256800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
125738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->csc_set_format = OMX_FALSE;
125820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
125920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
126020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
126120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
126320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
126420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Terminate */
126638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
126720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
126838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
126938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
127038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
127138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
127238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
127338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
127438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_PTR                hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
127538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
127638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
127738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
127838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
127938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
1280ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int i, plane;
128120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
128320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->csc_handle != NULL) {
128538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        csc_deinit(pVideoDec->csc_handle);
128638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVideoDec->csc_handle = NULL;
128738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
128820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalTerminate(pVp8Dec->hDestinationStartEvent);
129038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hDestinationStartEvent = NULL;
129138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->bDestinationStart = OMX_FALSE;
129238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalTerminate(pVp8Dec->hSourceStartEvent);
129338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hSourceStartEvent = NULL;
129438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->bSourceStart = OMX_FALSE;
129538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
129638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
12973e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
129838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
1299ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1300ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL)
1301ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
1302ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
1303ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
130438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
130538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pVideoDec->pMFCDecOutputBuffer[i] = NULL;
130638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
130738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
130820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
130938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
131038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
131138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
131238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
131338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
131438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
131538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
131620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
131720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
131838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
13193e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
132038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
1321ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1322ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
1323ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1324ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
1325ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
13263e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
13273e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i] = NULL;
13283e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim            }
132938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
133020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
133138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
133238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
133338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
133438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
133538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
133638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
133738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
133820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
133938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    VP8CodecClose(pVp8Dec);
134020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
134120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
134220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
134320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
134420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
134520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
134620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
134738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
134820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
134938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE               ret = OMX_ErrorNone;
135038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
135138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
135238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
135338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
135438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
135538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
135638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32  oneFrameSize = pSrcInputData->dataLen;
135738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
135838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
135938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
136038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
136138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i;
136220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
136320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
136420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
136538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc == OMX_FALSE) {
136638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = VP8CodecSrcSetup(pOMXComponent, pSrcInputData);
136720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
136820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
136938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_FALSE) {
137038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = VP8CodecDstSetup(pOMXComponent);
137138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
137238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
137338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((Check_VP8_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize) == OMX_TRUE) ||
13743e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
137538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->timeStamp;
137638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->nFlags;
137738ef2572d26fc760c584a1855a3d002f34eb0231Jiho 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);
137838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDecOps->Set_FrameTag(hMFCHandle, pVp8Dec->hMFCVp8Handle.indexTimestamp);
137938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec->hMFCVp8Handle.indexTimestamp++;
138038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec->hMFCVp8Handle.indexTimestamp %= MAX_TIMESTAMP;
138138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
138238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* queue work for input buffer */
138338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
138494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
138594d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                                    (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
138638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (codecReturn != VIDEO_ERROR_NONE) {
138738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
138838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
138920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
139020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
139138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        VP8CodecStart(pOMXComponent, INPUT_PORT_INDEX);
139238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pVp8Dec->bSourceStart == OMX_FALSE) {
139338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVp8Dec->bSourceStart = OMX_TRUE;
139438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pVp8Dec->hSourceStartEvent);
139538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
139638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
139738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pVp8Dec->bDestinationStart == OMX_FALSE) {
139838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVp8Dec->bDestinationStart = OMX_TRUE;
139938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pVp8Dec->hDestinationStartEvent);
140038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
1401800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        }
1402800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1403800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
140438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
140520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
140638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
140738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
140820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
140938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
141038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
141120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
141238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
141338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
141438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
141538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
141638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
141738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
141838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
141938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
142038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
142138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
142238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer       *pVideoBuffer;
142320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
142520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
142720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->dataLen       = 0;
142938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->usedDataLen   = 0;
143038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->remainDataLen = 0;
143138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->nFlags    = 0;
143238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->timeStamp = 0;
143320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
143438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoBuffer == NULL) {
143538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
143638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->allocSize  = 0;
143738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->pPrivate = NULL;
143838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->bufferHeader = NULL;
143938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
144038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
144101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
144238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->allocSize  = pVideoBuffer->planes[0].allocSize;
144338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
144438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
144538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            int i = 0;
1446ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
144738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
144838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
14493e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                    ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
145038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    goto EXIT;
145138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
145238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                i++;
145338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
145438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
145538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
145620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
145720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
145838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* For Share Buffer */
145938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
146020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
146120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
146238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
146320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
146420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
146520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
146638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
146720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
146820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
1469800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
147038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
147120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
147238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
147338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
147438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
147538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
147638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
1477ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
147838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
147938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
148094d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
148138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
148220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
148320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
148420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
148538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
148638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
148738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
148820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
148920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
149020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1491ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
1492ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
1493ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
1494ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
149594d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
149694d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                     (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
149794d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim
149838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (codecReturn != VIDEO_ERROR_NONE) {
149938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
15003e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
150138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
150238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
150338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    VP8CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
150420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
150538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
150620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
150738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
150838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
150920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
151138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
151220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
151438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
151538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
151638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
151738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
151838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
151938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
152038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
152138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
152238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
152338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
152438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer       *pVideoBuffer;
152538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
152638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoGeometry *bufferGeometry;
152738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
152838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_S32 indexTimestamp = 0;
1529ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int plane;
153020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
153220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->bDestinationStart == OMX_FALSE) {
153438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
153538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
153638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
153720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    while (1) {
153938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
154038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorNone;
154138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
154238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
154338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        displayStatus = pVideoBuffer->displayStatus;
154438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
154538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
154638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
154738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
154838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
154938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
155038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoBuffer != NULL) {
155138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorNone;
155238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                break;
155320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
155438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorUndefined;
155538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                break;
155620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
155720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
155838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
155938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
156038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone)
156138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
156238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
156338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.outputIndexTimestamp++;
156438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
156538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
1566ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
1567ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1568ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
1569ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
1570ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
1571ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->dataLen +=  pVideoBuffer->planes[plane].dataSize;
1572ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    }
157338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->usedDataLen = 0;
157438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->pPrivate = pVideoBuffer;
157538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* For Share Buffer */
157638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
157738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
157838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
157938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    bufferGeometry = &pVp8Dec->hMFCVp8Handle.codecOutbufConf;
158038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
158138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
158238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    switch (bufferGeometry->eColorFormat) {
158338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case VIDEO_COLORFORMAT_NV12:
158438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
158538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
158638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case VIDEO_COLORFORMAT_NV12_TILED:
158738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    default:
158838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
158938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
159038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
159138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
159238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
15933e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
159438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
159538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
159638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
159738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
159838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
15993e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
160038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
160138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = 0x00;
160238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = 0x00;
160320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
160420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
160538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* For timestamp correction. if mfc support frametype detect */
160638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
160738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef NEED_TIMESTAMP_REORDER
160838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
160938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
161038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
161138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = indexTimestamp;
161238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
161338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
161438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
161520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
161638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#else
161738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
161838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
161938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif
162038ef2572d26fc760c584a1855a3d002f34eb0231Jiho 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);
162138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
162220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
162338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
162438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
16253e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
162638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->remainDataLen = 0;
162738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
162838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
162938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
163038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
163138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
163238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
163338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
163438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
163538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
163638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
163738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
163838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
163938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
164038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
164138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
164238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
164338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
164438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
164520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
164638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
164720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
164838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
164920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
165038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
165120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
165238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
165338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
165438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
165520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
165620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
165738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_VP8Dec_SrcIn(pOMXComponent, pSrcInputData);
165838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
165938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
166038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
166138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
166238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
166320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
166438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
166538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
166620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
166738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
166838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
1669800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
167038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
167138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
167238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
167338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
167438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
167538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
167620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
167738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
167820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
167938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
168038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
168138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
168238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
1683800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
168438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
168538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
168638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorNone;
168738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
168820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
168938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
169038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pVp8Dec->bSourceStart == OMX_FALSE) &&
169138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang       (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
169238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SignalWait(pVp8Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
169338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SignalReset(pVp8Dec->hSourceStartEvent);
169438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
169520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
169638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_VP8Dec_SrcOut(pOMXComponent, pSrcOutputData);
169738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) &&
169838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pExynosComponent->currentState == OMX_StateExecuting)) {
169938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
170038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
170138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
170238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
170320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
170438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
170538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
170620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
170738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
170838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
170938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
171038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
171138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
171238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
171338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
171438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
171538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
171638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
171738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
171838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
171938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
172038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
172138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
172238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
172338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
172438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
172538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
172638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
172738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
172838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVp8Dec->bDestinationStart == OMX_FALSE) &&
172938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
173038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalWait(pVp8Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
173138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalReset(pVp8Dec->hDestinationStartEvent);
173220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
173338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
173438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_TRUE) {
173538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_VP8Dec_DstIn(pOMXComponent, pDstInputData);
173638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (ret != OMX_ErrorNone) {
173738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
173838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
173938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
174020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
174120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
174220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
174320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
174420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
174520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
174620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
174720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
174820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
174938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
175020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
175138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
175238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
175338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
175438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
175520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
175620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
175720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
175838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
175920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
176020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
176120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
176238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
176320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
176420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
176520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
176620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
176738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
176838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVp8Dec->bDestinationStart == OMX_FALSE) &&
176938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
177038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalWait(pVp8Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
177138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalReset(pVp8Dec->hDestinationStartEvent);
177220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
177338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
177438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_VP8Dec_DstOut(pOMXComponent, pDstOutputData);
177538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) &&
177638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pExynosComponent->currentState == OMX_StateExecuting)) {
177738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
177838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
177938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
178020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
178120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
178220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
178320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
178420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
178520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
178620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
178720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
178820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
178920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE  hComponent,
179020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_STRING      componentName)
179120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
179220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                    ret                = OMX_ErrorNone;
179320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE               *pOMXComponent      = NULL;
179420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT        *pExynosComponent   = NULL;
179520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT             *pExynosPort        = NULL;
179620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT   *pVideoDec          = NULL;
179720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_VP8DEC_HANDLE            *pVp8Dec            = NULL;
179820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int i = 0;
179920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
180020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
180120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
180220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (componentName == NULL)) {
180320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
180420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
180520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
180620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
180720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_VP8_DEC, componentName) != 0) {
180820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
180920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
181020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
181120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
181220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
181320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
181420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
181520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
181620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
181720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
181820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
181920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
182020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
182120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
182220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
182320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->componentName == NULL) {
182420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
182520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
182620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
182720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
182820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
182920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
183020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
183120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVp8Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_VP8DEC_HANDLE));
183220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pVp8Dec == NULL) {
183320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
183420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
183520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
183620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
183720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
183820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pVp8Dec, 0, sizeof(EXYNOS_VP8DEC_HANDLE));
183920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
184020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pVp8Dec;
184120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
184220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_VP8_DEC);
184320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
184420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set componentVersion */
184520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
184620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
184720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
184820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
184920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set specVersion */
185020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
185120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
185220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
185320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
185420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
185520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Input port */
185620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
185720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
185820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
185920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
186020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
186120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
186220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX;
186320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
186420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/x-vnd.on2.vp8");
186520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.pNativeRender = 0;
186620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
186720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
186820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
186938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->bufferProcessType = BUFFER_SHARE;
187038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portWayType = WAY2_PORT;
187120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
187220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Output port */
187320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
187420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
187520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
187620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
187720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
187820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
187920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
188020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
188120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
188220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.pNativeRender = 0;
188320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
188420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
188520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
188638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE;
188738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portWayType = WAY2_PORT;
188838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
188938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->GetParameter      = &Exynos_VP8Dec_GetParameter;
189038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->SetParameter      = &Exynos_VP8Dec_SetParameter;
189138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->GetConfig         = &Exynos_VP8Dec_GetConfig;
189238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->SetConfig         = &Exynos_VP8Dec_SetConfig;
189338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->GetExtensionIndex = &Exynos_VP8Dec_GetExtensionIndex;
189438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->ComponentRoleEnum = &Exynos_VP8Dec_ComponentRoleEnum;
189520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
189620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
189738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_codec_componentInit      = &Exynos_VP8Dec_Init;
189838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_codec_componentTerminate = &Exynos_VP8Dec_Terminate;
189938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
190038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_srcInputProcess  = &Exynos_VP8Dec_srcInputBufferProcess;
190138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_srcOutputProcess = &Exynos_VP8Dec_srcOutputBufferProcess;
190238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_dstInputProcess  = &Exynos_VP8Dec_dstInputBufferProcess;
190338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_dstOutputProcess = &Exynos_VP8Dec_dstOutputBufferProcess;
190438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
19053e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    pVideoDec->exynos_codec_start            = &VP8CodecStart;
19063e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    pVideoDec->exynos_codec_stop             = &VP8CodecStop;
190738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_bufferProcessRun = &VP8CodecOutputBufferProcessRun;
190838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_enqueueAllBuffer = &VP8CodecEnQueueAllBuffer;
190938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
191038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_checkInputFrame                 = &Check_VP8_Frame;
191138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
191238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
191338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
191438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
191538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->hSharedMemory == NULL) {
19163e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
191738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pVp8Dec);
191838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
191938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
192038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
192138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
192238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
192320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
192420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->currentState = OMX_StateLoaded;
192520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
192620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
192720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
192820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
192920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
193020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
193120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
193220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
193320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
193420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentDeinit(
193520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent)
193620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
193720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                ret                = OMX_ErrorNone;
193820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE           *pOMXComponent      = NULL;
193920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT    *pExynosComponent   = NULL;
194038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
194120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_VP8DEC_HANDLE        *pVp8Dec            = NULL;
194220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
194320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
194420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
194520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
194620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
194720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
194820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
194920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
195020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
195138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
195238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
195338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
195420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
195520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pExynosComponent->componentName);
195620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = NULL;
195720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
195838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
195920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pVp8Dec != NULL) {
196020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pVp8Dec);
196138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec = pVideoDec->hCodecHandle = NULL;
196220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
196320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
196420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
196520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
196620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
196720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
196820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
196920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
197020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
197120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
197220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
197320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
197420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
197520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
1976