Exynos_OMX_Vp8dec.c revision 569b6f9c0afe66023cc50fe41664240f67b7c6bf
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#if 0
60838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
60938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#else /* This is temporal code to fix broken thumbnail until 3D ddk supports tiled mode */
61038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE)
61138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12;
61238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    else
61338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
61438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif
6153e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
61638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
61738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
61938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
62038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
62138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
62238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* input buffer enqueue for header parsing */
6233e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
62494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
62594d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                        (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
62638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing");
62738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//        ret = OMX_ErrorInsufficientResources;
62838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit;
62938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
63038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
63138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
63238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* start header parsing */
63338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
63438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing");
63538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorCodecInit;
63638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
63938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get geometry for output */
64038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(&pVp8Dec->hMFCVp8Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry));
64138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Get_Geometry(hMFCHandle, &pVp8Dec->hMFCVp8Handle.codecOutbufConf) != VIDEO_ERROR_NONE) {
64238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info");
64338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
64438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
64538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
64638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
64738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get dpb count */
648bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    pVp8Dec->hMFCVp8Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle);
64938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->bThumbnailMode == OMX_FALSE)
650bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim        pVp8Dec->hMFCVp8Handle.maxDPBNum += EXTRA_DPB_NUM;
651bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Vp8CodecSetup nOutbufs: %d", pVp8Dec->hMFCVp8Handle.maxDPBNum);
65238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
65338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_TRUE;
65438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
65538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
65638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) ||
65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight)) {
65838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth;
65938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight;
66038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
66138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
66238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
66338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_UpdateFrameSize(pOMXComponent);
66438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /** Send Port Settings changed call back **/
66738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (*(pExynosComponent->pCallbacks->EventHandler))
66838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (pOMXComponent,
66938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 pExynosComponent->callbackData,
67038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_EventPortSettingsChanged, /* The command was completed */
67138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_DirOutput, /* This is the port index */
67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 0,
67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 NULL);
67438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
67538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
67638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) ||
67738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight) ||
678bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            (pExynosOutputPort->portDefinition.nBufferCountActual != pVp8Dec->hMFCVp8Handle.maxDPBNum)) {
67938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth;
68038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight;
68138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
68238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
684bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            pExynosOutputPort->portDefinition.nBufferCountActual = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2;
685bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            pExynosOutputPort->portDefinition.nBufferCountMin = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2;
68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
68738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_UpdateFrameSize(pOMXComponent);
68838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
68938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
69038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /** Send Port Settings changed call back **/
69138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (*(pExynosComponent->pCallbacks->EventHandler))
69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (pOMXComponent,
69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 pExynosComponent->callbackData,
69438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_EventPortSettingsChanged, /* The command was completed */
69538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_DirOutput, /* This is the port index */
69638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 0,
69738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 NULL);
69838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
69938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SleepMillisec(0);
70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorInputDataDecodeYet;
70238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    VP8CodecStop(pOMXComponent, INPUT_PORT_INDEX);
70338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
70438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
70538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
70638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
70738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
71038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
71138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
71238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
71338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
71438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
71538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
71938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
72038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
72138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
72238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
72357fbf5bae538500a8332718cec7a7446e02d4da4SeungBeom Kim
72438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i, nOutbufs;
72538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
72638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
72738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
72838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get dpb count */
729bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    nOutbufs = pVp8Dec->hMFCVp8Handle.maxDPBNum;
73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
731fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
732fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim        /* should be done before prepare output buffer */
733fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim        if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
734fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim            ret = OMX_ErrorInsufficientResources;
735fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim            goto EXIT;
736fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim        }
73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
73838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
73938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps->Set_Shareable(hMFCHandle);
74038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
74138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
74238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
74338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
74438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
74538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
746ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
747ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
74894d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
749ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int plane;
750ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
751ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    nAllocLen[0] = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth,
752ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight);
753ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    nAllocLen[1] = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth,
754ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight >> 1);
755ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
75638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
75701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        /* Register output buffer */
75838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < nOutbufs; i++) {
759ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
760ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
76101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
76294d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
763ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] =
764ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], NORMAL_MEMORY);
765ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) {
766ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
767ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    ret = OMX_ErrorInsufficientResources;
768ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    goto EXIT;
769ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
770ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] =
771ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
772ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                                                       pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
773ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane];
774ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
775ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane];
77601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane];
777ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
77801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            }
77901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
78094d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
78138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
78238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
78338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
78438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
785ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
78694d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                            (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
78738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
78838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
78901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        /* Register output buffer */
79038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
79138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
79238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
793ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#ifdef USE_ANB
794ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) {
795ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
796ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
797ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane];
798ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane];
799ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    planes[plane].allocSize = nAllocLen[plane];
800ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
801ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
802ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
803ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
804ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    ret = OMX_ErrorInsufficientResources;
805ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    goto EXIT;
806ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
807569b6f9c0afe66023cc50fe41664240f67b7c6bfSeungBeom Kim                pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf,
808569b6f9c0afe66023cc50fe41664240f67b7c6bfSeungBeom Kim                              (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
80938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
810ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        } else {
811ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            ret = OMX_ErrorNotImplemented;
812ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            goto EXIT;
81338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
814ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#else
815ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        ret = OMX_ErrorNotImplemented;
816ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        goto EXIT;
817ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#endif
81838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
819ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
82038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
82438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
82538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
82738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        VP8CodecStop (pOMXComponent, OUTPUT_PORT_INDEX);
82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
82938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_TRUE;
83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
83138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
83238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
83338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
83438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
83538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
83638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
83838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
83938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetParameter(
84020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
84120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nParamIndex,
84220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_PTR     pComponentParameterStructure)
84320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
84538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
84620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
84720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
84820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
84920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
85020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
85120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
85220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
85320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
85420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
85520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
85620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
85720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
85820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
85920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
86020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
86120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
86220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
86320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
86420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
86520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
86620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
86720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
86820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
86920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
87020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nParamIndex) {
87120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
87220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
87320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
87420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
87520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
87620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
87720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
87820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
87920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE);
88020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
88120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
88220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoErrorCorrection:
88320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
88420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
88520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
88620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_VP8DEC_HANDLE                *pVp8Dec                 = NULL;
88720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
88820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
88920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
89020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
89120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
89220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
89320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
89420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
89520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
89620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
89720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
89820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
89920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX];
90020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
90120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
90220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
90320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
90420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
90520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
90620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
90720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
90820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
90920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
91020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
91120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
91220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
91320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
91420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
91520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
91620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
91720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
91838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SetParameter(
91920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
92020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
92120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentParameterStructure)
92220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
92338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE           ret = OMX_ErrorNone;
92438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
92520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
92620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
92720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
92820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
92920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
93020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
93120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
93220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
93320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
93420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
93520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
93620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
93720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
93820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
93920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
94020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
94120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
94220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
94320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
94420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
94520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
94620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
94720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
94820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
94920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
95020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
95120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
95220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
95320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
95420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
95520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
95620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
95720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
95820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
95920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
96020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateOperation;
96120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
96220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
96320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
96420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE)) {
96520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX;
96620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
96720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadParameter;
96820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
96920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
97020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
97120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
97220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoErrorCorrection:
97320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
97420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
97520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
97620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_VP8DEC_HANDLE                *pVp8Dec                 = NULL;
97720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
97820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
97920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
98020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
98120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
98220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
98320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
98420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
98520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
98620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
98720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
98820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
98920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX];
99020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
99120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
99220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
99320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
99420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
99520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
99620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
99720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
99820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
99920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
100020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
100120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
100220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
100320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
100420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
100520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
100620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
100720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
100838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetConfig(
100920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
101020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INDEXTYPE  nIndex,
101120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR        pComponentConfigStructure)
101220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
101320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
101420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
101520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
101620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
101720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
101820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1019440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    if (hComponent == NULL || pComponentConfigStructure == NULL) {
102020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
102120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
102220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
102320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
102420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
102620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
102720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
102820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
102920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
103020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
103120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
103220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
103320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
103420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
103520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
103620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
103720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
103820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
103920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
104020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
104120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
104220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
104320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
104420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
104520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
104620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
104720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
104820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
104920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
105038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SetConfig(
105120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
105220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INDEXTYPE  nIndex,
105320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR        pComponentConfigStructure)
105420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
105520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
105620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
105720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
105820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
105920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
106020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1061440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    if (hComponent == NULL || pComponentConfigStructure == NULL) {
106220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
106320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
106420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
106520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
106620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
106720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
106820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
106920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
107020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
107120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
107220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
107520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
107620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
107720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
107820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
107920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
108120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
108220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
108320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
108420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
108520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
108720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
108820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
109020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
109120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
109238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetExtensionIndex(
109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_HANDLETYPE  hComponent,
109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_STRING      cParameterName,
10953e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_OUT OMX_INDEXTYPE  *pIndexType)
109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
110020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
110120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
110420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
110520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
110720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
110920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
111020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
111220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
111320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
111420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
111520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
111620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
111720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((cParameterName == NULL) || (pIndexType == NULL)) {
111820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
111920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
112020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
112120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
112220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
112320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
112420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        *pIndexType = OMX_IndexVendorThumbnailMode;
112920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
113020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
113220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
113320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
113420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
113520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
113620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
113720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
113820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
113920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_ComponentRoleEnum(
114120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
114220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8        *cRole,
114320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32        nIndex)
114420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
114520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
114620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
114720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
114820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (cRole == NULL)) {
115220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
115320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
115420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
115520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) {
115620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE);
115720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
115820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
115920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNoMore;
116020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
116120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
116220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
116320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
116420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
116520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
116620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
116720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
116820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Init */
116938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
117020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
11713e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
11723e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
11733e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec         = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
11743e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
11753e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
11763e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_VP8DEC_HANDLE          *pVp8Dec           = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
11773e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_PTR                        hMFCHandle        = pVp8Dec->hMFCVp8Handle.hMFCHandle;
117838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
117938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
118038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
118138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
118220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
118320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    CSC_METHOD csc_method = CSC_METHOD_SW;
1184ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int i, plane;
1185800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
11863e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
11873e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
118838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_FALSE;
118938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_FALSE;
119038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->bUseFlagEOF = OMX_TRUE;
119138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
119238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
119338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* H.264 Codec Open */
119438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = VP8CodecOpen(pVp8Dec);
119538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
119620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
119720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
119820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
119938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
120038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
120138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
120238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
120338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
120438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
120538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
120638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
12073e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1208ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
1209ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
121038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
1211ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
1212ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1213ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                /* Use ION Allocator */
1214ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
1215ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1216ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
1217ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
1218ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
1219ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
1220ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    ret = OMX_ErrorInsufficientResources;
1221ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    goto EXIT;
1222ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
1223ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1224ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            }
122538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
122638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
122720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
122838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
122938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
123038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
123138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
123238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
123320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
123420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
123538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
123638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
123738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
123838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
123938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
124038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
124138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
124238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
124338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
124438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
124538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->bSourceStart = OMX_FALSE;
124638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalCreate(&pVp8Dec->hSourceStartEvent);
124738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->bDestinationStart = OMX_FALSE;
124838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalCreate(&pVp8Dec->hDestinationStartEvent);
124920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
125020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
125120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
125220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVp8Dec->hMFCVp8Handle.indexTimestamp = 0;
125320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = 0;
125420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
125520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->getAllDelayBuffer = OMX_FALSE;
125620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
125738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#if 0//defined(USE_CSC_GSCALER)
125838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
1259800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#endif
126038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->csc_handle = csc_init(csc_method);
126138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->csc_handle == NULL) {
126238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
126338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
1264800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
126538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->csc_set_format = OMX_FALSE;
126620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
126820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
126920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
127020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
127120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
127220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
127320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Terminate */
127438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
127520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
127638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
127738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
127838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
127938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
128038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
128138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
128238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_PTR                hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
128338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
128438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
128538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
128638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
128738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
1288ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int i, plane;
128920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
129120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->csc_handle != NULL) {
129338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        csc_deinit(pVideoDec->csc_handle);
129438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVideoDec->csc_handle = NULL;
129538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
129620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalTerminate(pVp8Dec->hDestinationStartEvent);
129838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hDestinationStartEvent = NULL;
129938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->bDestinationStart = OMX_FALSE;
130038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalTerminate(pVp8Dec->hSourceStartEvent);
130138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hSourceStartEvent = NULL;
130238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->bSourceStart = OMX_FALSE;
130338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
130438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
13053e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
130638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
1307ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1308ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL)
1309ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
1310ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
1311ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
131238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
131338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pVideoDec->pMFCDecOutputBuffer[i] = NULL;
131438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
131538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
131620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
131738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
131838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
131938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
132038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
132138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
132238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
132338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
132420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
132520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
132638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
13273e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
132838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
1329ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1330ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
1331ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1332ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
1333ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
13343e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
13353e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i] = NULL;
13363e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim            }
133738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
133820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
133938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
134038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
134138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
134238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
134338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
134438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
134538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
134620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
134738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    VP8CodecClose(pVp8Dec);
134820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
134920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
135020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
135120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
135220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
135320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
135420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
135538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
135620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
135738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE               ret = OMX_ErrorNone;
135838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
135938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
136038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
136138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
136238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
136338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
136438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32  oneFrameSize = pSrcInputData->dataLen;
136538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
136638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
136738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
136838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
136938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i;
137020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
137120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
137220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
137338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc == OMX_FALSE) {
137438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = VP8CodecSrcSetup(pOMXComponent, pSrcInputData);
137520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
137620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
137738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_FALSE) {
137838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = VP8CodecDstSetup(pOMXComponent);
137938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
138038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
138138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((Check_VP8_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize) == OMX_TRUE) ||
13823e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
138338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->timeStamp;
138438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->nFlags;
138538ef2572d26fc760c584a1855a3d002f34eb0231Jiho 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);
138638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDecOps->Set_FrameTag(hMFCHandle, pVp8Dec->hMFCVp8Handle.indexTimestamp);
138738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec->hMFCVp8Handle.indexTimestamp++;
138838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec->hMFCVp8Handle.indexTimestamp %= MAX_TIMESTAMP;
138938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
139038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* queue work for input buffer */
139138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
139294d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
139394d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                                    (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
139438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (codecReturn != VIDEO_ERROR_NONE) {
139538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
139638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
139720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
139820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
139938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        VP8CodecStart(pOMXComponent, INPUT_PORT_INDEX);
140038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pVp8Dec->bSourceStart == OMX_FALSE) {
140138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVp8Dec->bSourceStart = OMX_TRUE;
140238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pVp8Dec->hSourceStartEvent);
140338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
140438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
140538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pVp8Dec->bDestinationStart == OMX_FALSE) {
140638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVp8Dec->bDestinationStart = OMX_TRUE;
140738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pVp8Dec->hDestinationStartEvent);
140838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
1409800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        }
1410800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1411800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
141238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
141320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
141438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
141538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
141620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
141738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
141838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
141920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
142138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
142238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
142338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
142438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
142538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
142638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
142738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
142838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
142938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
143038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer       *pVideoBuffer;
143120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
143238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
143320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
143438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
143520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
143638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->dataLen       = 0;
143738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->usedDataLen   = 0;
143838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->remainDataLen = 0;
143938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->nFlags    = 0;
144038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->timeStamp = 0;
144120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
144238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoBuffer == NULL) {
144338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
144438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->allocSize  = 0;
144538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->pPrivate = NULL;
144638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->bufferHeader = NULL;
144738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
144838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
144901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
145038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->allocSize  = pVideoBuffer->planes[0].allocSize;
145138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
145238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
145338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            int i = 0;
1454ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
145538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
145638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
14573e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                    ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
145838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    goto EXIT;
145938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
146038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                i++;
146138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
146238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
146338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
146420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
146520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
146638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* For Share Buffer */
146738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
146820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
146920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
147120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
147320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
147438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
147520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
147620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
1477800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
147838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
147920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
148038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
148138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
148238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
148338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
148438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
1485ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
148638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
148738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
148894d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
148938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
149020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
149120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
149220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
149338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
149438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
149538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
149620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
149720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
149820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1499ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
1500ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
1501ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
1502ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
150394d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
150494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                     (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
150594d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim
150638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (codecReturn != VIDEO_ERROR_NONE) {
150738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
15083e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
150938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
151038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
151138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    VP8CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
151220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
151420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
151638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
151720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
151938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
152020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
152138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
152238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
152338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
152438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
152538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
152638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
152738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
152838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
152938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
153038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
153138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
153238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer       *pVideoBuffer;
153338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
153438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoGeometry *bufferGeometry;
153538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
153638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_S32 indexTimestamp = 0;
1537ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int plane;
153820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
154020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
154138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->bDestinationStart == OMX_FALSE) {
154238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
154338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
154438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
154520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
154638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    while (1) {
154738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
154838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorNone;
154938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
155038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
155138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        displayStatus = pVideoBuffer->displayStatus;
155238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
155338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
155438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
155538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
155638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
155738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
155838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoBuffer != NULL) {
155938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorNone;
156038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                break;
156120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
156238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorUndefined;
156338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                break;
156420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
156520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
156638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
156738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
156838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone)
156938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
157038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
157138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.outputIndexTimestamp++;
157238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec->hMFCVp8Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
157338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
1574ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
1575ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1576ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
1577ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
1578ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
1579ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->dataLen +=  pVideoBuffer->planes[plane].dataSize;
1580ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    }
158138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->usedDataLen = 0;
158238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->pPrivate = pVideoBuffer;
158338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* For Share Buffer */
158438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
158538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
158638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
158738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    bufferGeometry = &pVp8Dec->hMFCVp8Handle.codecOutbufConf;
158838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
158938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
159038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    switch (bufferGeometry->eColorFormat) {
159138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case VIDEO_COLORFORMAT_NV12:
159238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
159338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
159438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case VIDEO_COLORFORMAT_NV12_TILED:
159538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    default:
159638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
159738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
159838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
159938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
160038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
16013e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
160238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
160338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
160438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
160538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
160638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
16073e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
160838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
160938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = 0x00;
161038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = 0x00;
161120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
161220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
161338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* For timestamp correction. if mfc support frametype detect */
161438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
161538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef NEED_TIMESTAMP_REORDER
161638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
161738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
161838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
161938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = indexTimestamp;
162038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
162138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
162238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
162320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
162438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#else
162538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
162638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
162738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif
162838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData->timeStamp, pDstOutputData->timeStamp / 1E6, indexTimestamp, pDstOutputData->nFlags);
162938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
163020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
163138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
163238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
16333e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
163438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->remainDataLen = 0;
163538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
163638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
163738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
163838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
163938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
164038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
164138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
164238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
164338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
164438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
164538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
164638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
164738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
164838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
164938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
165038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
165138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
165238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
165320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
165438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
165520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
165638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
165720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
165838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
165920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
166038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
166138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
166238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
166320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
166420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
166538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_VP8Dec_SrcIn(pOMXComponent, pSrcInputData);
166638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
166738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
166838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
166938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
167038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
167120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
167238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
167338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
167420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
167538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
167638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
1677800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
167838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
167938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
168038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
168138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
168238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
168338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
168420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
168538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
168620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
168738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
168838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
168938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
169038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
1691800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
169238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
169338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
169438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorNone;
169538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
169620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
169738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
169838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pVp8Dec->bSourceStart == OMX_FALSE) &&
169938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang       (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
170038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SignalWait(pVp8Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
170138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SignalReset(pVp8Dec->hSourceStartEvent);
170238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
170320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
170438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_VP8Dec_SrcOut(pOMXComponent, pSrcOutputData);
170538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) &&
170638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pExynosComponent->currentState == OMX_StateExecuting)) {
170738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
170838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
170938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
171038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
171120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
171238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
171338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
171420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
171538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
171638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
171738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
171838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
171938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
172038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
172138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
172238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
172338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
172438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
172538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
172638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
172738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
172838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
172938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
173038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
173138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
173238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
173338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
173438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
173538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
173638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVp8Dec->bDestinationStart == OMX_FALSE) &&
173738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
173838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalWait(pVp8Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
173938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalReset(pVp8Dec->hDestinationStartEvent);
174020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
174138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
174238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_TRUE) {
174338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_VP8Dec_DstIn(pOMXComponent, pDstInputData);
174438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (ret != OMX_ErrorNone) {
174538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
174638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
174738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
174820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
174920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
175020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
175120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
175220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
175320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
175420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
175520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
175620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
175738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
175820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
175938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
176038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
176138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
176238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
176320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
176420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
176520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
176638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
176720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
176820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
176920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
177038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
177120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
177220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
177320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
177420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
177538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
177638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVp8Dec->bDestinationStart == OMX_FALSE) &&
177738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
177838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalWait(pVp8Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
177938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalReset(pVp8Dec->hDestinationStartEvent);
178020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
178138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
178238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_VP8Dec_DstOut(pOMXComponent, pDstOutputData);
178338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) &&
178438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pExynosComponent->currentState == OMX_StateExecuting)) {
178538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
178638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
178738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
178820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
178920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
179020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
179120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
179220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
179320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
179420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
179520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
179620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
179720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE  hComponent,
179820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_STRING      componentName)
179920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
180020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                    ret                = OMX_ErrorNone;
180120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE               *pOMXComponent      = NULL;
180220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT        *pExynosComponent   = NULL;
180320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT             *pExynosPort        = NULL;
180420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT   *pVideoDec          = NULL;
180520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_VP8DEC_HANDLE            *pVp8Dec            = NULL;
180620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int i = 0;
180720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
180820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
180920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
181020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (componentName == NULL)) {
181120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
181220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
181320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
181420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
181520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_VP8_DEC, componentName) != 0) {
181620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
181720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
181820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
181920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
182020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
182120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
182220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
182320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
182420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
182520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
182620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
182720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
182820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
182920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
183020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
183120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->componentName == NULL) {
183220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
183320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
183420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
183520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
183620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
183720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
183820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
183920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVp8Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_VP8DEC_HANDLE));
184020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pVp8Dec == NULL) {
184120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
184220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
184320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
184420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
184520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
184620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pVp8Dec, 0, sizeof(EXYNOS_VP8DEC_HANDLE));
184720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
184820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pVp8Dec;
184920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
185020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_VP8_DEC);
185120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
185220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set componentVersion */
185320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
185420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
185520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
185620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
185720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set specVersion */
185820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
185920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
186020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
186120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
186220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
186320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Input port */
186420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
186520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
186620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
186720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
186820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
186920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
187020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX;
187120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
187220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/x-vnd.on2.vp8");
187320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.pNativeRender = 0;
187420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
187520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
187620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
187738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->bufferProcessType = BUFFER_SHARE;
187838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portWayType = WAY2_PORT;
187920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
188020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Output port */
188120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
188220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
188320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
188420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
188520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
188620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
188720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
188820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
188920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
189020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.pNativeRender = 0;
189120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
189220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
189320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
189438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE;
189538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portWayType = WAY2_PORT;
189638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
189738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->GetParameter      = &Exynos_VP8Dec_GetParameter;
189838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->SetParameter      = &Exynos_VP8Dec_SetParameter;
189938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->GetConfig         = &Exynos_VP8Dec_GetConfig;
190038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->SetConfig         = &Exynos_VP8Dec_SetConfig;
190138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->GetExtensionIndex = &Exynos_VP8Dec_GetExtensionIndex;
190238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent->ComponentRoleEnum = &Exynos_VP8Dec_ComponentRoleEnum;
190320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
190420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
190538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_codec_componentInit      = &Exynos_VP8Dec_Init;
190638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_codec_componentTerminate = &Exynos_VP8Dec_Terminate;
190738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
190838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_srcInputProcess  = &Exynos_VP8Dec_srcInputBufferProcess;
190938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_srcOutputProcess = &Exynos_VP8Dec_srcOutputBufferProcess;
191038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_dstInputProcess  = &Exynos_VP8Dec_dstInputBufferProcess;
191138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_dstOutputProcess = &Exynos_VP8Dec_dstOutputBufferProcess;
191238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
19133e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    pVideoDec->exynos_codec_start            = &VP8CodecStart;
19143e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    pVideoDec->exynos_codec_stop             = &VP8CodecStop;
191538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_bufferProcessRun = &VP8CodecOutputBufferProcessRun;
191638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_enqueueAllBuffer = &VP8CodecEnQueueAllBuffer;
191738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
191838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_checkInputFrame                 = &Check_VP8_Frame;
191938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
192038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
192138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
192238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
192338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->hSharedMemory == NULL) {
19243e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
192538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pVp8Dec);
192638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
192738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
192838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
192938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
193038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
193120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
193220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->currentState = OMX_StateLoaded;
193320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
193420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
193520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
193620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
193720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
193820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
193920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
194020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
194120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
194220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentDeinit(
194320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent)
194420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
194520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                ret                = OMX_ErrorNone;
194620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE           *pOMXComponent      = NULL;
194720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT    *pExynosComponent   = NULL;
194838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
194920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_VP8DEC_HANDLE        *pVp8Dec            = NULL;
195020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
195120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
195220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
195320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
195420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
195520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
195620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
195720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
195820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
195938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
196038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
196138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
196220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
196320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pExynosComponent->componentName);
196420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = NULL;
196520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
196638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
196720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pVp8Dec != NULL) {
196820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pVp8Dec);
196938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVp8Dec = pVideoDec->hCodecHandle = NULL;
197020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
197120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
197220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
197320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
197420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
197520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
197620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
197720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
197820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
197920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
198020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
198120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
198220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
198320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
1984