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_Mpeg4dec.c
2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief
2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author    Yunji Kim (yunji.kim@samsung.com)
22d03573a4a182b0a36eaa16fb7638d98429d1c3fbSeungBeom Kim * @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_Mpeg4dec.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_MPEG4_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 MPEG4_DEC_NUM_OF_EXTRA_BUFFERS 7
6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang//#define FULL_FRAME_SEARCH
6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MPEG4 Decoder Supported Levels & profiles */
6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXYNOS_OMX_VIDEO_PROFILELEVEL supportedMPEG4ProfileLevels[] ={
6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0},
6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0b},
6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1},
6820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level2},
6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3},
7020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4},
7120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4a},
7220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5},
7320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0},
7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0b},
7520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level1},
7620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level2},
7720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level3},
7820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4},
7920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4a},
8020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level5}};
8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* H.263 Decoder Supported Levels & profiles */
8320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXYNOS_OMX_VIDEO_PROFILELEVEL supportedH263ProfileLevels[] = {
8420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Baseline (Profile 0) */
8520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level10},
8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level20},
8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level30},
8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level40},
8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level45},
9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level50},
9120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level60},
9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level70},
9320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Profile 1 */
9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level10},
9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level20},
9620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level30},
9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level40},
9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level45},
9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level50},
10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level60},
10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level70},
10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Profile 2 */
10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level10},
10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level20},
10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level30},
10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level40},
10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level45},
10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level50},
10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level60},
11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level70},
11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Profile 3, restricted up to SD resolution */
11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level10},
11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level20},
11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level30},
11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level40},
11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level45},
11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level50},
11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level60},
11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level70}};
12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
12238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, void *pVirtAddr, OMX_U32 *dataSize)
12338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
12438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE       ret = OMX_ErrorNone;
12538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
12638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
12738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
12838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
12938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
13038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, void *addr[], int size[])
13138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
13238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE       ret = OMX_ErrorNone;
13338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer  *pCodecBuffer;
13438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
13538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (codecBuffer == NULL) {
13638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
13738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
13838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
13938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
14038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
14138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
14238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (addr != NULL) {
14338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        addr[0] = pCodecBuffer->planes[0].addr;
14438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        addr[1] = pCodecBuffer->planes[1].addr;
14538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        addr[2] = pCodecBuffer->planes[2].addr;
14638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
14738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
14838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (size != NULL) {
14938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        size[0] = pCodecBuffer->planes[0].allocSize;
15038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        size[1] = pCodecBuffer->planes[1].allocSize;
15138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        size[2] = pCodecBuffer->planes[2].allocSize;
15238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
15338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
15438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
15538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
15638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
15738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_BOOL gbFIMV1 = OMX_FALSE;
15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic int Check_Mpeg4_Frame(
16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8   *pInputStream,
16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32   buffSize,
16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32   flag,
16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL  bPreviousFrameEOF,
16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL *pbEndOfFrame)
16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32  len;
16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int      readStream;
16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    unsigned startCode;
17020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL bFrameStart;
17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    len = 0;
17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    bFrameStart = OMX_FALSE;
17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (flag & OMX_BUFFERFLAG_CODECCONFIG) {
17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (*pInputStream == 0x03) { /* FIMV1 */
17720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            BitmapInfoHhr *pInfoHeader;
17820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pInfoHeader = (BitmapInfoHhr *)(pInputStream + 1);
18020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /* FIXME */
18120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "############## NOT SUPPORTED #################");
18220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "width(%d), height(%d)", pInfoHeader->BiWidth, pInfoHeader->BiHeight);
18320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            gbFIMV1 = OMX_TRUE;
18420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            *pbEndOfFrame = OMX_TRUE;
18520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            return buffSize;
18620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
18720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
18820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
18920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (gbFIMV1) {
19020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        *pbEndOfFrame = OMX_TRUE;
19120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        return buffSize;
19220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
19320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (bPreviousFrameEOF == OMX_FALSE)
19520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        bFrameStart = OMX_TRUE;
19620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    startCode = 0xFFFFFFFF;
19820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (bFrameStart == OMX_FALSE) {
19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        /* find VOP start code */
20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        while(startCode != 0x1B6) {
20120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            readStream = *(pInputStream + len);
20220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            startCode = (startCode << 8) | readStream;
20320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            len++;
20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (len > buffSize)
20520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
20620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
20820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* find next VOP start code */
21020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    startCode = 0xFFFFFFFF;
21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    while ((startCode != 0x1B6)) {
21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        readStream = *(pInputStream + len);
21320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        startCode = (startCode << 8) | readStream;
21420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        len++;
21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (len > buffSize)
21620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
21820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
21920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    *pbEndOfFrame = OMX_TRUE;
22020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "1. Check_Mpeg4_Frame returned EOF = %d, len = %d, buffSize = %d", *pbEndOfFrame, len - 4, buffSize);
22220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return len - 4;
22420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT :
22620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    *pbEndOfFrame = OMX_FALSE;
22720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "2. Check_Mpeg4_Frame returned EOF = %d, len = %d, buffSize = %d", *pbEndOfFrame, len - 1, buffSize);
22920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return --len;
23120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
23220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic int Check_H263_Frame(
23420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8   *pInputStream,
23520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32   buffSize,
23620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32   flag,
23720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL  bPreviousFrameEOF,
23820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL *pbEndOfFrame)
23920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
24020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32  len;
24120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int      readStream;
24220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    unsigned startCode;
24320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL bFrameStart = 0;
24420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    unsigned pTypeMask   = 0x03;
24520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    unsigned pType       = 0;
24620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
24720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    len = 0;
24820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    bFrameStart = OMX_FALSE;
24920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
25020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (bPreviousFrameEOF == OMX_FALSE)
25120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        bFrameStart = OMX_TRUE;
25220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
25320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    startCode = 0xFFFFFFFF;
25420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (bFrameStart == OMX_FALSE) {
25520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        /* find PSC(Picture Start Code) : 0000 0000 0000 0000 1000 00 */
25620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        while (((startCode << 8 >> 10) != 0x20) || (pType != 0x02)) {
25720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            readStream = *(pInputStream + len);
25820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            startCode = (startCode << 8) | readStream;
25920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
26020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            readStream = *(pInputStream + len + 1);
26120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pType = readStream & pTypeMask;
26220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
26320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            len++;
26420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (len > buffSize)
26520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
26620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
26720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
26820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
26920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* find next PSC */
27020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    startCode = 0xFFFFFFFF;
27120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pType = 0;
27220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    while (((startCode << 8 >> 10) != 0x20) || (pType != 0x02)) {
27320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        readStream = *(pInputStream + len);
27420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        startCode = (startCode << 8) | readStream;
27520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
27620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        readStream = *(pInputStream + len + 1);
27720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pType = readStream & pTypeMask;
27820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
27920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        len++;
28020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (len > buffSize)
28120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
28220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
28320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
28420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    *pbEndOfFrame = OMX_TRUE;
28520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
28620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "1. Check_H263_Frame returned EOF = %d, len = %d, iBuffSize = %d", *pbEndOfFrame, len - 3, buffSize);
28720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
28820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return len - 3;
28920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
29020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT :
29120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
29220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    *pbEndOfFrame = OMX_FALSE;
29320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
29420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "2. Check_H263_Frame returned EOF = %d, len = %d, iBuffSize = %d", *pbEndOfFrame, len - 1, buffSize);
29520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
29620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return --len;
29720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
29820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
299800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic OMX_BOOL Check_Stream_StartCode(
30020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8    *pInputStream,
30120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32    streamSize,
30220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    CODEC_TYPE codecType)
30320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
30420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (codecType) {
30520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case CODEC_TYPE_MPEG4:
30620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (gbFIMV1) {
30720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            return OMX_TRUE;
30820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
30920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (streamSize < 3) {
31020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                return OMX_FALSE;
31120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else if ((pInputStream[0] == 0x00) &&
31220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                       (pInputStream[1] == 0x00) &&
31320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                       (pInputStream[2] == 0x01)) {
31420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                return OMX_TRUE;
31520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
31620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                return OMX_FALSE;
31720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
31820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
31920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
32020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case CODEC_TYPE_H263:
321800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (streamSize > 0) {
322800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            unsigned startCode = 0xFFFFFFFF;
323800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            unsigned pTypeMask = 0x03;
324800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            unsigned pType     = 0;
325800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            OMX_U32  len       = 0;
326800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            int      readStream;
327800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            /* Check PSC(Picture Start Code) : 0000 0000 0000 0000 1000 00 */
328800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            while (((startCode << 8 >> 10) != 0x20) || (pType != 0x02)) {
329800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                readStream = *(pInputStream + len);
330800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                startCode = (startCode << 8) | readStream;
331800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
332800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                readStream = *(pInputStream + len + 1);
333800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                pType = readStream & pTypeMask;
334800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
335800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                len++;
336800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                if (len > 0x3)
337800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                    break;
338800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            }
339800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
340800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            if (len > 0x3) {
341800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "[%s] Picture Start Code Missing", __FUNCTION__);
342800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                return OMX_FALSE;
343800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            } else {
344800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                return OMX_TRUE;
345800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            }
346800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        } else {
34720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            return OMX_FALSE;
348800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        }
34920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
35020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "%s: undefined codec type (%d)", __FUNCTION__, codecType);
35120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        return OMX_FALSE;
35220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
35320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
35420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
35538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecOpen(EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec)
35638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
3573e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_ERRORTYPE            ret        = OMX_ErrorNone;
35838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
35938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
36038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
36138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
36238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
36338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
36438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pMpeg4Dec == NULL) {
36538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
36638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
36738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
36838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
36938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
37038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* alloc ops structure */
37138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = (ExynosVideoDecOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps));
37238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
37338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
37438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
37538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pDecOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
37638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate decoder ops buffer");
37738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
37838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
37938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
38038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
38138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.pDecOps    = pDecOps;
38238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.pInbufOps  = pInbufOps;
38338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = pOutbufOps;
38438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
38538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* function pointer mapping */
38638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps->nSize    = sizeof(ExynosVideoDecOps);
38738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps->nSize  = sizeof(ExynosVideoDecBufferOps);
38838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
38938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
39038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_Video_Register_Decoder(pDecOps, pInbufOps, pOutbufOps);
3913e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
39238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* check mandatory functions for decoder ops */
39338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pDecOps->Init == NULL) || (pDecOps->Finalize == NULL) ||
39438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pDecOps->Get_ActualBufferCount == NULL) || (pDecOps->Set_FrameTag == NULL) ||
39538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pDecOps->Get_FrameTag == NULL)) {
39638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
39738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
39838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
39938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
40038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
40138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* check mandatory functions for buffer ops */
40238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
40338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
40438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
40538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
40638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
40738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
40838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
40938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
41038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
41138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
41238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* alloc context, open, querycap */
413c94beaeb6990ddf010f7934c201f68e2d66dff62SeungBeom Kim    pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.pDecOps->Init(V4L2_MEMORY_DMABUF);
41438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle == NULL) {
41538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
41638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
41738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
41838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
41938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
42038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
42138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
42238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
423440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    if (ret != OMX_ErrorNone) {
424440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        if (pDecOps != NULL) {
425440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            Exynos_OSAL_Free(pDecOps);
426440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            pMpeg4Dec->hMFCMpeg4Handle.pDecOps = NULL;
427440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        }
428440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        if (pInbufOps != NULL) {
429440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            Exynos_OSAL_Free(pInbufOps);
430440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            pMpeg4Dec->hMFCMpeg4Handle.pInbufOps = NULL;
431440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        }
432440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        if (pOutbufOps != NULL) {
433440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            Exynos_OSAL_Free(pOutbufOps);
434440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = NULL;
435440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        }
436440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    }
437440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim
43838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
43938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
44038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
44138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
44238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
44338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecClose(EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec)
44438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
4453e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_ERRORTYPE            ret        = OMX_ErrorNone;
44638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                    *hMFCHandle = NULL;
44738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
44838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
44938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
45038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
4513e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
4523e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
45338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pMpeg4Dec == NULL) {
45438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
45538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
45638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
45738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
45838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
45938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
46038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
46138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
46238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
46338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (hMFCHandle != NULL) {
46438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDecOps->Finalize(hMFCHandle);
4653e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle = NULL;
46638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
46738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps != NULL) {
46838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pOutbufOps);
4693e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = NULL;
47038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
47138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps != NULL) {
47238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pInbufOps);
4733e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        pMpeg4Dec->hMFCMpeg4Handle.pInbufOps = NULL;
47438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
47538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pDecOps != NULL) {
47638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pDecOps);
4773e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        pMpeg4Dec->hMFCMpeg4Handle.pDecOps = NULL;
47838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
47938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
48038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
48138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
48238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
48338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
48438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
48538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
48638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
48738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
48838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
48938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
49038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE            ret = OMX_ErrorNone;
49138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                    *hMFCHandle = NULL;
49238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
49338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
49438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
49538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
49638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = NULL;
49738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
4983e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
4993e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
50038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent == NULL) {
50138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
50238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
50338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
50438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
50538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
50638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec == NULL) {
50738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
50838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
50938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
5103e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
51238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pMpeg4Dec == NULL) {
51338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
51438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
51538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
51638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
51738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
51838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
51938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
52038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
52138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
52238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPortIndex == INPUT_PORT_INDEX)
52338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pInbufOps->Run(hMFCHandle);
52438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    else if (nPortIndex == OUTPUT_PORT_INDEX)
52538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pOutbufOps->Run(hMFCHandle);
52638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
52738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
52838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
52938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
53038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
53138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
53238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
53338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
53438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
53538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
53638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
53738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE            ret = OMX_ErrorNone;
53838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                    *hMFCHandle = NULL;
53938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
54038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
54138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
54238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
54338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = NULL;
54438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
5453e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
5463e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
54738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent == NULL) {
54838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
54938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
55038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
55138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
55238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
55338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec == NULL) {
55438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
55538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
55638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
55738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
55838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pMpeg4Dec == NULL) {
55938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
56038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
56138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
56238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
56338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
56438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
56538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
56638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
56738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
568440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
56938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pInbufOps->Stop(hMFCHandle);
570440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
57138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pOutbufOps->Stop(hMFCHandle);
57238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
57338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
57438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
57538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
57638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
57738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
57838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
57938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
58038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
58138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
58238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
58338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE            ret = OMX_ErrorNone;
58438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                    *hMFCHandle = NULL;
58538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
58638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
58738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
58838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
58938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = NULL;
59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
5913e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
5923e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
59338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent == NULL) {
59438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
59538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
59638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
59738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
59838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
59938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec == NULL) {
60038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
60138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
60238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
60338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
60438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pMpeg4Dec == NULL) {
60538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
60638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
60738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
60838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
60938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
61038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
61138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
61238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
61338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
61438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPortIndex == INPUT_PORT_INDEX) {
61538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pMpeg4Dec->bSourceStart == OMX_FALSE) {
61638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pMpeg4Dec->hSourceStartEvent);
61738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
61938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
62038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
62138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPortIndex == OUTPUT_PORT_INDEX) {
62238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pMpeg4Dec->bDestinationStart == OMX_FALSE) {
62338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pMpeg4Dec->hDestinationStartEvent);
62438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
62538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
62638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
62738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
62838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
62938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
63038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
63138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
63238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
63338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
63438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
63538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
63638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
63938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
64038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
6413e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
64238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
64338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
64438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
64538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i, nOutbufs;
64638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
64738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
64838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
64938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
65038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
6513e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
65238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
65338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((nPortIndex == INPUT_PORT_INDEX) &&
65438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pMpeg4Dec->bSourceStart == OMX_TRUE)) {
65538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
65638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
6573e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
65838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
659ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
66038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
66138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
66238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
66338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
66438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pInbufOps->Clear_Queue(hMFCHandle);
66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang               (pMpeg4Dec->bDestinationStart == OMX_TRUE)) {
66794d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim        OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
66838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ExynosVideoBuffer *pBuffer = NULL;
66938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
67038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
67138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        nOutbufs = pDecOps->Get_ActualBufferCount(hMFCHandle);
67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        nOutbufs += EXTRA_DPB_NUM;
67438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < nOutbufs; i++) {
67538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer);
67638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer);
67738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
67838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pOutbufOps->Clear_Queue(hMFCHandle);
67938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
68038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
68138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
68238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
68438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
68538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
68738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
68838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
68938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
69038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
69138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
69438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
69538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
69638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
69738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
69838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
69938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                     oneFrameSize = pSrcInputData->dataLen;
70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
70238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
70338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
70438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoGeometry      bufferConf;
70538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                  inputBufferNumber = 0;
70638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i;
70738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
71038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
71154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
71254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
71354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        if (OMXBuffer == NULL) {
71438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorUndefined;
71538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
71854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
71954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        OMXBuffer->nFlags = pSrcInputData->nFlags;
72054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
72138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
72238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
72338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
72438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
72538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
72638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->bThumbnailMode == OMX_TRUE)
72738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDecOps->Set_DisplayDelay(hMFCHandle, 0);
72838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
72938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* input buffer info */
73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
73138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pMpeg4Dec->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
73238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferConf.eCompressionFormat = VIDEO_CODING_MPEG4;
73338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    else
73438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferConf.eCompressionFormat = VIDEO_CODING_H263;
73538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
7361ed2fc89aa809989164905497b680fa10e74a134Dima Zavin    pInbufOps->Set_Shareable(hMFCHandle);
73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
73894d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim        bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth
73994d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                                * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
74038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM;
74138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
74238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE;
74338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
74438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
74538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
74638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* should be done before prepare input buffer */
74738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
74838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
74938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
75038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
75138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
75238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* set input buffer geometry */
75338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
75438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
75538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
75638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
75738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
75838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
75938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* setup input buffer */
76038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
76138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
76238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
76338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
76438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
76538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
76638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
76738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Register input buffer */
76838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
76901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            ExynosVideoPlane plane;
770ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            plane.addr = pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0];
771ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize[0];
772ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            plane.fd = pVideoDec->pMFCDecInputBuffer[i]->fd[0];
77394d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
77438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
77538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
77638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
77738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
77838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
77938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
78038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Register input buffer */
78138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
78201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            ExynosVideoPlane plane;
78301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
78401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
78501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0];
78694d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
78738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
78838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
78938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
79038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
79138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
79238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
79338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
79438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* set output geometry */
79538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
79638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
79738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
79838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
79938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
80038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
80138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
80238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
80338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* input buffer enqueue for header parsing */
80438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
80594d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
80694d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                        (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
80738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing");
80838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//        ret = OMX_ErrorInsufficientResources;
80938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit;
81038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
81138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
81238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
81338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* start header parsing */
81438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
81538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing");
81638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorCodecInit;
81738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
81838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
81938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
82038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get geometry for output */
82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(&pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry));
82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Get_Geometry(hMFCHandle, &pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf) != VIDEO_ERROR_NONE) {
82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info");
82438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
82538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
82738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get dpb count */
829bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle);
83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->bThumbnailMode == OMX_FALSE)
831bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim        pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum += EXTRA_DPB_NUM;
832bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Mpeg4CodecSetup nOutbufs: %d", pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum);
83338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
83438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_TRUE;
83538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
83638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth) ||
83838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight)) {
83938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameWidth = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth;
84038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameHeight = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight;
84138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nStride = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
84238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
84338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_UpdateFrameSize(pOMXComponent);
84538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
84638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
84738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /** Send Port Settings changed call back **/
84838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (*(pExynosComponent->pCallbacks->EventHandler))
84938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (pOMXComponent,
85038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 pExynosComponent->callbackData,
85138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_EventPortSettingsChanged, /* The command was completed */
85238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_DirOutput, /* This is the port index */
85338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 0,
85438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 NULL);
85538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
85638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
85738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth) ||
85838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight) ||
859bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            (pExynosOutputPort->portDefinition.nBufferCountActual != pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum)) {
86038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameWidth = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth;
86138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameHeight = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight;
86238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nStride = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
86338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
86438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
865bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            pExynosOutputPort->portDefinition.nBufferCountActual = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum - 2;
866bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            pExynosOutputPort->portDefinition.nBufferCountMin = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum - 2;
86738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
86838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_UpdateFrameSize(pOMXComponent);
86938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
87038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
87138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /** Send Port Settings changed call back **/
87238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (*(pExynosComponent->pCallbacks->EventHandler))
87338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (pOMXComponent,
87438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 pExynosComponent->callbackData,
87538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_EventPortSettingsChanged, /* The command was completed */
87638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_DirOutput, /* This is the port index */
87738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 0,
87838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 NULL);
87938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
88038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
88138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SleepMillisec(0);
88238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorInputDataDecodeYet;
88338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Mpeg4CodecStop(pOMXComponent, INPUT_PORT_INDEX);
88438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
88538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
88638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
88738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
88838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
88938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
89038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
89138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
89238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
89338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
89438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
89538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
89638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
89738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
89838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
89938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
90038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
90138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
90238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
90338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
90457fbf5bae538500a8332718cec7a7446e02d4da4SeungBeom Kim
90538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i, nOutbufs;
90638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
90738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
90838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
90938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get dpb count */
910bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    nOutbufs = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum;
91138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
912fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
913fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim        /* should be done before prepare output buffer */
914fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim        if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
915fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim            ret = OMX_ErrorInsufficientResources;
916fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim            goto EXIT;
917fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim        }
91838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
91938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps->Set_Shareable(hMFCHandle);
92038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
92138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
92238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
92338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
92438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
92538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
926ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
927ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
92894d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
929ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int plane;
930ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
931ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    nAllocLen[0] = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth,
932ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight);
933ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    nAllocLen[1] = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth,
934ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight >> 1);
935ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
93638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
93701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        /* Register output buffer */
93838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < nOutbufs; i++) {
939ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
940ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
94101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
94294d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
943ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] =
944ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], NORMAL_MEMORY);
945ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) {
946ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
947ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    ret = OMX_ErrorInsufficientResources;
948ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    goto EXIT;
949ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
950ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] =
951ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
952ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                                                       pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
953ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane];
954ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
955ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane];
95601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane];
957ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
95801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            }
95901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
96094d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
96138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
96238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
96338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
96438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
965ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
96694d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                            (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
96738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
96838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
96901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        /* Register output buffer */
97038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
97138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
97238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
973ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#ifdef USE_ANB
974ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) {
975ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
976ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
977ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane];
978ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane];
979ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    planes[plane].allocSize = nAllocLen[plane];
980ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
981ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
982ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
983ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
984ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    ret = OMX_ErrorInsufficientResources;
985ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    goto EXIT;
986ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
987569b6f9c0afe66023cc50fe41664240f67b7c6bfSeungBeom Kim                pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf,
988569b6f9c0afe66023cc50fe41664240f67b7c6bfSeungBeom Kim                               (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
98938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
990ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        } else {
991ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            ret = OMX_ErrorNotImplemented;
992ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            goto EXIT;
99338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
994ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#else
995ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        ret = OMX_ErrorNotImplemented;
996ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        goto EXIT;
997ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#endif
99838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
9993e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
100038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
100138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
100238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
100338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
100438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
100538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
100638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
10073e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        Mpeg4CodecStop(pOMXComponent, OUTPUT_PORT_INDEX);
100838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
100938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_TRUE;
101038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
101138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
101238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
101338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
101438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
101538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
101638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
101738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
101838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
1019800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_GetParameter(
102038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
102138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_INDEXTYPE  nParamIndex,
102238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_INOUT OMX_PTR     pComponentParameterStructure)
102320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
102420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
102620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
102720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
102820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
102920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
103020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
103120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
103220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
103320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
103420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
103520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
103620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
103720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
103820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
103920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
104020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
104120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
104220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
104320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
104420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
104520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
104620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
104720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
104820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
104920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
105020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nParamIndex) {
105120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoMpeg4:
105220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
105320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Param = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
105420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Param = NULL;
10553e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec      = NULL;
105638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
105720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
105820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
105920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
106020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
106120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
106220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstMpeg4Param->nPortIndex >= ALL_PORT_NUM) {
106320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
106420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
106520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
106620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
106738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
106820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcMpeg4Param = &pMpeg4Dec->mpeg4Component[pDstMpeg4Param->nPortIndex];
106920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
107020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memcpy(pDstMpeg4Param, pSrcMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
107120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
107220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoH263:
107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
10753e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        OMX_VIDEO_PARAM_H263TYPE *pDstH263Param = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
10763e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        OMX_VIDEO_PARAM_H263TYPE *pSrcH263Param = NULL;
10773e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec     = NULL;
107838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
107920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
108020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
108120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
108220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
108320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstH263Param->nPortIndex >= ALL_PORT_NUM) {
108520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
108620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
108720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
108820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
109020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcH263Param = &pMpeg4Dec->h263Component[pDstH263Param->nPortIndex];
109120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
109220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memcpy(pDstH263Param, pSrcH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
109520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_S32                      codecType;
109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
110020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
110120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
110420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
110538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        codecType = ((EXYNOS_MPEG4DEC_HANDLE *)(((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (codecType == CODEC_TYPE_MPEG4)
110720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE);
110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
110920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_DEC_ROLE);
111020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
111220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoProfileLevelQuerySupported:
111320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
111420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel   = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
111520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_OMX_VIDEO_PROFILELEVEL    *pProfileLevel      = NULL;
111620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32                           maxProfileLevelNum = 0;
111720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_S32                           codecType;
111820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
111920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
112020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
112120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
112220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
112320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
112420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
112938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        codecType = ((EXYNOS_MPEG4DEC_HANDLE *)(((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
113020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (codecType == CODEC_TYPE_MPEG4) {
113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pProfileLevel = supportedMPEG4ProfileLevels;
113220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            maxProfileLevelNum = sizeof(supportedMPEG4ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
113320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
113420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pProfileLevel = supportedH263ProfileLevels;
113520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            maxProfileLevelNum = sizeof(supportedH263ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
113620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
113720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
113820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) {
113920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNoMore;
114020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
114120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
114220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pProfileLevel += pDstProfileLevel->nProfileIndex;
114420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstProfileLevel->eProfile = pProfileLevel->profile;
114520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstProfileLevel->eLevel = pProfileLevel->level;
114620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
114720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
114820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoProfileLevelCurrent:
114920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_MPEG4TYPE        *pSrcMpeg4Param   = NULL;
115220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_H263TYPE         *pSrcH263Param    = NULL;
11533e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        EXYNOS_MPEG4DEC_HANDLE           *pMpeg4Dec        = NULL;
115420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_S32                           codecType;
115520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
115620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
115720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
115820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
115920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
116020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
116120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
116220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
116320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
116420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
116520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
116638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
116720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        codecType = pMpeg4Dec->hMFCMpeg4Handle.codecType;
116820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (codecType == CODEC_TYPE_MPEG4) {
116920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pSrcMpeg4Param = &pMpeg4Dec->mpeg4Component[pDstProfileLevel->nPortIndex];
117020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pDstProfileLevel->eProfile = pSrcMpeg4Param->eProfile;
117120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pDstProfileLevel->eLevel = pSrcMpeg4Param->eLevel;
117220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
117320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pSrcH263Param = &pMpeg4Dec->h263Component[pDstProfileLevel->nPortIndex];
117420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pDstProfileLevel->eProfile = pSrcH263Param->eProfile;
117520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pDstProfileLevel->eLevel = pSrcH263Param->eLevel;
117620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
117720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
117820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
117920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoErrorCorrection:
118020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
118120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
118220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
11833e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        EXYNOS_MPEG4DEC_HANDLE              *pMpeg4Dec               = NULL;
118420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
118520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
118620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
118720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
118820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
118920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
119020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
119120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
119220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
119320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
119420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
119538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
119620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcErrorCorrectionType = &pMpeg4Dec->errorCorrectionType[INPUT_PORT_INDEX];
119720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
119820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
119920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
120020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
120120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
120220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
120320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
120420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
120520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
120620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
120720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
120820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
120920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
121020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
121120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
121220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
121320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
121420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1215800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_SetParameter(
121620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
121720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
121820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentParameterStructure)
121920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
122020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
122120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
122220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
122320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
122420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
122520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
122620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
122720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
122820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
122920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
123020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
123120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
123220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
123320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
123420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
123520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
123620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
123720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
123820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
123920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
124020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
124120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
124220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
124320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
124420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
124520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
124620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
124720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoMpeg4:
124820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
124920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Param = NULL;
125020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Param = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
125138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec      = NULL;
125220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
125320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
125420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
125520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
125620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
125720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
125820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcMpeg4Param->nPortIndex >= ALL_PORT_NUM) {
125920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
126020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
126120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
126220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
126420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstMpeg4Param = &pMpeg4Dec->mpeg4Component[pSrcMpeg4Param->nPortIndex];
126520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memcpy(pDstMpeg4Param, pSrcMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
126720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
126820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
126920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoH263:
127020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
127120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_H263TYPE *pDstH263Param = NULL;
127220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_H263TYPE *pSrcH263Param = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
127338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec     = NULL;
127420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
127520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
127620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
127720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
127820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
127920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcH263Param->nPortIndex >= ALL_PORT_NUM) {
128120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
128220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
128320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
128420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
128620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstH263Param = &pMpeg4Dec->h263Component[pSrcH263Param->nPortIndex];
128720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memcpy(pDstH263Param, pSrcH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
128920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
129020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
129120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
129220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
129320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
129420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
129620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
129720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
129820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
129920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
130020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
130120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateOperation;
130220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
130320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
130420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
130520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE)) {
130620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
130720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_DEC_ROLE)) {
130820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
130920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
131020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadParameter;
131120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
131220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
131320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
131420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
131520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoProfileLevelCurrent:
131620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
131720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
131820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_MPEG4TYPE        *pDstMpeg4Param   = NULL;
131920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_H263TYPE         *pDstH263Param    = NULL;
132038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        EXYNOS_MPEG4DEC_HANDLE           *pMpeg4Dec        = NULL;
132120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_S32                           codecType;
132220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
132320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
13243e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        if (ret != OMX_ErrorNone)
132520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
132620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
132720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
132820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
132920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
133020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
133120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
133238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
133320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        codecType = pMpeg4Dec->hMFCMpeg4Handle.codecType;
133420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (codecType == CODEC_TYPE_MPEG4) {
133520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /*
133620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang             * To do: Check validity of profile & level parameters
133720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang             */
133820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
133920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pDstMpeg4Param = &pMpeg4Dec->mpeg4Component[pSrcProfileLevel->nPortIndex];
134020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pDstMpeg4Param->eProfile = pSrcProfileLevel->eProfile;
134120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pDstMpeg4Param->eLevel = pSrcProfileLevel->eLevel;
134220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
134320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /*
134420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang             * To do: Check validity of profile & level parameters
134520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang             */
134620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
134720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pDstH263Param = &pMpeg4Dec->h263Component[pSrcProfileLevel->nPortIndex];
134820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pDstH263Param->eProfile = pSrcProfileLevel->eProfile;
134920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pDstH263Param->eLevel = pSrcProfileLevel->eLevel;
135020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
135120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
135220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
135320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoErrorCorrection:
135420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
135520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
135620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
135738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        EXYNOS_MPEG4DEC_HANDLE              *pMpeg4Dec               = NULL;
135820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
135920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
136020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
136120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
136220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
136320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
136420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
136520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
136620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
136720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
136820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
136938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
137020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType = &pMpeg4Dec->errorCorrectionType[INPUT_PORT_INDEX];
137120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
137220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
137320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
137420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
137520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
137620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
137720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
137820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
137920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
138020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
138120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
138220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
138320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
138420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
138520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
138620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
138720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
138820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1389800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_GetConfig(
139020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
139120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
139220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentConfigStructure)
139320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
139420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
139520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
139620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
139720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
139820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
139920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
140020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentConfigStructure == NULL) {
140120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
140220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
140320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
140420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
140520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
140620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
140720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
140820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
140920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
141020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
141120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
141220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
141320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
141420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
141520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
141620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
141720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
141820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
141920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
142020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
142120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
142220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
142320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
142420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
142620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
142720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
142920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
143020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1431800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_SetConfig(
143220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
143320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
143420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentConfigStructure)
143520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
143620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
143720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
143820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
143920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
144020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
144120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
144220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentConfigStructure == NULL) {
144320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
144420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
144520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
144620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
144720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
144820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
144920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
145020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
145120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
145220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
145320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
145420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
145520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
145620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
145720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
145820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
145920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
146020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
146120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
146220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
146320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
146420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
146520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
146620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
146720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
146820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
146920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
147120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
147220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1473800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_GetExtensionIndex(
147420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_HANDLETYPE  hComponent,
147520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_STRING      cParameterName,
147620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_INDEXTYPE  *pIndexType)
147720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
147820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
147920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
148020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
148120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
148220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
148320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
148420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
148520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
148620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
148720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
148820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
148920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
149020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
149120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
149220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
149320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
149420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
149520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
149620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
149720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
149820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((cParameterName == NULL) || (pIndexType == NULL)) {
149920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
150020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
150120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
150220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
150320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
150420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
150520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
150620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
150720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
150838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
150920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        *pIndexType = OMX_IndexVendorThumbnailMode;
151020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
151120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
151220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
151320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
151420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
151620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
151720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
151920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
152020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1521800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_ComponentRoleEnum(
152220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_HANDLETYPE hComponent,
152320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_U8        *cRole,
152420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_U32        nIndex)
152520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
152620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
152720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
152820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
152920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32                   codecType;
153020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
153220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (cRole == NULL)) {
153420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
153520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
153620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
153720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (nIndex != (MAX_COMPONENT_ROLE_NUM - 1)) {
153820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNoMore;
153920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
154020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
154120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
154220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
154320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
154420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
154520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
154620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
154720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
154820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
154920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
155020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
155120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
155220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
155320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
155420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
155520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
155638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    codecType = ((EXYNOS_MPEG4DEC_HANDLE *)(((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
155720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (codecType == CODEC_TYPE_MPEG4)
155820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE);
155920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    else
156020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_H263_DEC_ROLE);
156120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
156220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
156320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
156420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
156520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
156620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
156720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
156820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Init */
156938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
157020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
15713e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
15723e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
15733e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec         = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
15743e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
15753e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
15763e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_MPEG4DEC_HANDLE        *pMpeg4Dec         = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
15773e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_PTR                        hMFCHandle        = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
157838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
157938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
158038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
158138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
158220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
158320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    CSC_METHOD csc_method = CSC_METHOD_SW;
1584ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int i, plane;
158520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
15863e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
15873e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
158838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_FALSE;
158938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_FALSE;
159038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->bUseFlagEOF = OMX_TRUE;
159120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
159220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
159338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* H.264 Codec Open */
159438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Mpeg4CodecOpen(pMpeg4Dec);
159538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
159620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
159720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
159820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
159938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
160038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
160138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
160238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
160338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
160438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
160538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
160638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
16073e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1608ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
1609ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
161038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
1611ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
1612ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1613ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                /* Use ION Allocator */
1614ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
1615ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1616ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
1617ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
1618ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
1619ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
1620ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    ret = OMX_ErrorInsufficientResources;
1621ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    goto EXIT;
1622ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
1623ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1624ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            }
162538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
162638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
162720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
162838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
162938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
163038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
163138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
163238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
163320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
163420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
163538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
163638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
163738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
163838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
163938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
164038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
164138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
164238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
164338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
164438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
164538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->bSourceStart = OMX_FALSE;
164638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalCreate(&pMpeg4Dec->hSourceStartEvent);
164738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->bDestinationStart = OMX_FALSE;
164838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalCreate(&pMpeg4Dec->hDestinationStartEvent);
164920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
165020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
165120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
165220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp = 0;
165320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp = 0;
165420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
165520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->getAllDelayBuffer = OMX_FALSE;
165620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
165738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#if 0//defined(USE_CSC_GSCALER)
165838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
1659800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#endif
166038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->csc_handle = csc_init(csc_method);
166138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->csc_handle == NULL) {
166238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
166338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
1664800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
166538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->csc_set_format = OMX_FALSE;
166620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
166720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
166820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
166920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
167020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
167120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
167220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
167320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Terminate */
167438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
167520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
167638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
167738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
167838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
167938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
168038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
168138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
168238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_PTR                hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
168338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
168438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
168538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
168638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
168738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
1688ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int i, plane;
168920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
169020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
169120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
169238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->csc_handle != NULL) {
169338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        csc_deinit(pVideoDec->csc_handle);
169438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVideoDec->csc_handle = NULL;
169538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
169620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
169738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalTerminate(pMpeg4Dec->hDestinationStartEvent);
169838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->hDestinationStartEvent = NULL;
169938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->bDestinationStart = OMX_FALSE;
170038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalTerminate(pMpeg4Dec->hSourceStartEvent);
170138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->hSourceStartEvent = NULL;
170238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->bSourceStart = OMX_FALSE;
170338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
170438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
17053e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
170638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
1707ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1708ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL)
1709ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
1710ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
1711ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
171238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
171338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pVideoDec->pMFCDecOutputBuffer[i] = NULL;
171438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
171538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
171620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
171738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
171838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
171938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
172038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
172138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
172238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
172338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
172420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
172520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
172638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
17273e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
172838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
1729ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1730ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
1731ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1732ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
1733ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
17343e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
17353e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i] = NULL;
17363e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim            }
173738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
173820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
173938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
174038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
174138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
174238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
174338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
174438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
174538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
174620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
174738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Mpeg4CodecClose(pMpeg4Dec);
174820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
174920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
175020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
175120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
175220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
175320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
175420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
175538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
175620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
175738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE               ret = OMX_ErrorNone;
175838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
175938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
176038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
176138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
176238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
176338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
176438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32  oneFrameSize = pSrcInputData->dataLen;
176538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
176638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
176738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
176838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
176938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i;
177020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
177138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
177220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
177338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc == OMX_FALSE) {
177438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Mpeg4CodecSrcSetup(pOMXComponent, pSrcInputData);
177520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
177620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
177738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_FALSE) {
177838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Mpeg4CodecDstSetup(pOMXComponent);
177938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
178038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
178138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((Check_Stream_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize, pMpeg4Dec->hMFCMpeg4Handle.codecType) == OMX_TRUE) ||
17823e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
178338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->timeStamp[pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->timeStamp;
178438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->nFlags;
178538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp, pSrcInputData->nFlags);
178638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDecOps->Set_FrameTag(hMFCHandle, pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp);
178738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp++;
178838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp %= MAX_TIMESTAMP;
178938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
179038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* queue work for input buffer */
179138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
179294d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
179394d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                                    (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
179438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (codecReturn != VIDEO_ERROR_NONE) {
179538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
179638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
179720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
179820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
179938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Mpeg4CodecStart(pOMXComponent, INPUT_PORT_INDEX);
180038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pMpeg4Dec->bSourceStart == OMX_FALSE) {
180138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pMpeg4Dec->bSourceStart = OMX_TRUE;
180238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pMpeg4Dec->hSourceStartEvent);
180338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
180420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
180538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pMpeg4Dec->bDestinationStart == OMX_FALSE) {
180638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pMpeg4Dec->bDestinationStart = OMX_TRUE;
180738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pMpeg4Dec->hDestinationStartEvent);
180838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
1809800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        }
1810800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1811800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
181238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
181320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
181438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
181538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
181620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
181738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
181838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
181920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
182038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
182138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
182238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
182338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
182438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
182538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
182638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
182738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
182838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
182938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
183038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer       *pVideoBuffer;
183120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
183238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
183320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
183438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
183520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
183638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->dataLen       = 0;
183738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->usedDataLen   = 0;
183838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->remainDataLen = 0;
183938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->nFlags    = 0;
184038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->timeStamp = 0;
184120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
184238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoBuffer == NULL) {
184338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
184438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->allocSize  = 0;
184538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->pPrivate = NULL;
184638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->bufferHeader = NULL;
184738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
184838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
184901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
185038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->allocSize  = pVideoBuffer->planes[0].allocSize;
185138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
185238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
185338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            int i = 0;
1854ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
185538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
185638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
18573e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                    ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
185838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    goto EXIT;
185938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
186038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                i++;
186138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
186238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
186338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
186420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
186520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
186638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* For Share Buffer */
186738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
186820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
186920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
187038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
187120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
187220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
187338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
187438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
187520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
187620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
187720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
187838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
187920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
188038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
188138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
188238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
188338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
188438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
1885ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
188638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
188738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
188894d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
188938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
189020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
189120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
189220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
189338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
189438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
189538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
189620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
189720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
189820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1899ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
1900ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
1901ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
1902ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
190394d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
190494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                     (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
190594d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim
190638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (codecReturn != VIDEO_ERROR_NONE) {
190738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
19083e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
190938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
191038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
191138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Mpeg4CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
191220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
191338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
191420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
191538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
191638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
191720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
191838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
191938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
192020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
192138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
192238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
192338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
192438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
192538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
192638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
192738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
192838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
192938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
193038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
193138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
193238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer       *pVideoBuffer;
193338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
193438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoGeometry *bufferGeometry;
193538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
193638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_S32 indexTimestamp = 0;
1937ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int plane;
193820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
193938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
194020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
194138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pMpeg4Dec->bDestinationStart == OMX_FALSE) {
194238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
194338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
194438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
194520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
194638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    while (1) {
194738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
194838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorNone;
194938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
195038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
195138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        displayStatus = pVideoBuffer->displayStatus;
195238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
195338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
195438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
195538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
195638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
195738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
195838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoBuffer != NULL) {
195938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorNone;
196038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                break;
196120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
196238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorUndefined;
196338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                break;
196420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
196520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
196638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
196738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
196838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone)
196938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
197038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
197138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp++;
197238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
197338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
1974ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
1975ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1976ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
1977ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
1978ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
1979ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->dataLen +=  pVideoBuffer->planes[plane].dataSize;
1980ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    }
198138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->usedDataLen = 0;
198238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->pPrivate = pVideoBuffer;
198338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* For Share Buffer */
198438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
198538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
198638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
198738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    bufferGeometry = &pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf;
198838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
198938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
199038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    switch (bufferGeometry->eColorFormat) {
199138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case VIDEO_COLORFORMAT_NV12:
199238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
199338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
199438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case VIDEO_COLORFORMAT_NV12_TILED:
199538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    default:
199638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
199738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
199838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
199938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
200038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
20013e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
200238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
200338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
200438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
200538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
200638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
20073e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
200838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
200938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = 0x00;
201038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = 0x00;
201120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
201220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
201338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* For timestamp correction. if mfc support frametype detect */
201438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
201538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef NEED_TIMESTAMP_REORDER
201638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
201738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
201838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
201938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp = indexTimestamp;
202038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
202138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
202238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
202320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
202438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#else
202538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
202638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
202738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif
202838ef2572d26fc760c584a1855a3d002f34eb0231Jiho 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);
202938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
203020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
203138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
203238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
203338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
203438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->remainDataLen = 0;
203538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
203638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
203738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
203838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
203938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
204038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
204138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
204238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
204338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
204438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
204538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
204638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
204738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
204838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
204938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
205038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
205138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
205238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
205320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
205438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
205520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
205638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
205720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
205838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
205920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
206038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
206138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
206238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
206320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
206420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
206538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_Mpeg4Dec_SrcIn(pOMXComponent, pSrcInputData);
206638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
206738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
206838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
206938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
207038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
207120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
207238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
207338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
207420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
207538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
207638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
2077800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
207838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
207938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
208038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
208138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
208238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
208338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
208420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
208538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
208620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
208738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
208838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
208938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
209038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
2091800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
209238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
209338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
209438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorNone;
209538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
209620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
209738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
209838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pMpeg4Dec->bSourceStart == OMX_FALSE) &&
209938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang       (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
210038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SignalWait(pMpeg4Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
210138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SignalReset(pMpeg4Dec->hSourceStartEvent);
210238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
210320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
210438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_Mpeg4Dec_SrcOut(pOMXComponent, pSrcOutputData);
210538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) &&
210638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pExynosComponent->currentState == OMX_StateExecuting)) {
210738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
210838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
210938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
211038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
211120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
211238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
211338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
211420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
211538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
211638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
211720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
211838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
211938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
212038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
212138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
212238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
212338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
212438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
212538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
212638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
212738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
212838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
212938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
213038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
213138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
213238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
213338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
213438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
213538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
213638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pMpeg4Dec->bDestinationStart == OMX_FALSE) &&
213738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
213838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalWait(pMpeg4Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
213938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalReset(pMpeg4Dec->hDestinationStartEvent);
214020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
214138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
214238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_TRUE) {
214338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_Mpeg4Dec_DstIn(pOMXComponent, pDstInputData);
214438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (ret != OMX_ErrorNone) {
214538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
214638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
214738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
214820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
214920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
215020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
215120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
215220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
215320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
215420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
215520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
215620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
215738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
215820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
215938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
216038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
216138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
216238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
216320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
216420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
216520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
216638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
216720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
216820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
216920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
217038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
217120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
217220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
217320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
217420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
217538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
217638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pMpeg4Dec->bDestinationStart == OMX_FALSE) &&
217738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
217838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalWait(pMpeg4Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
217938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalReset(pMpeg4Dec->hDestinationStartEvent);
218020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
218138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
218238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_Mpeg4Dec_DstOut(pOMXComponent, pDstOutputData);
218338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) &&
218438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pExynosComponent->currentState == OMX_StateExecuting)) {
218538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
218638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
218738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
218820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
218920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
219020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
219120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
219220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
219320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
219420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
219520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
219638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName)
219720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
21983e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
21993e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
220020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
22013e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASEPORT           *pExynosPort      = NULL;
22023e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec        = NULL;
22033e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_MPEG4DEC_HANDLE        *pMpeg4Dec        = NULL;
220420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int i = 0;
220538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_S32 codecType = -1;
220620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
220720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
220820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
220920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (componentName == NULL)) {
221020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
221138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
221220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
221320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
221420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG4_DEC, componentName) == 0) {
221520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        codecType = CODEC_TYPE_MPEG4;
221620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H263_DEC, componentName) == 0) {
221720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        codecType = CODEC_TYPE_H263;
221820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
221920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
222038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
222120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
222220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
222320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
222420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
222520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
222620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
222738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
222820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
222920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
223020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
223120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
223220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
223320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
223420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->componentName == NULL) {
223520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
223620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
223738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
223820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
223920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
224020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
224120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
224238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG4DEC_HANDLE));
224320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pMpeg4Dec == NULL) {
224420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
224520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
224638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
224720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
224820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
224938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(pMpeg4Dec, 0, sizeof(EXYNOS_MPEG4DEC_HANDLE));
225020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
225120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pMpeg4Dec;
225220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMpeg4Dec->hMFCMpeg4Handle.codecType = codecType;
225320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
225420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (codecType == CODEC_TYPE_MPEG4)
225520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MPEG4_DEC);
225620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    else
225720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H263_DEC);
225820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
225920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set componentVersion */
226020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
226120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
226220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
226320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
226420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set specVersion */
226520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
226620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
226720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
226820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
226920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
227020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Input port */
227120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
227220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
227320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
227438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
227520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
227620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
227720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (codecType == CODEC_TYPE_MPEG4) {
227820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
227920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
228020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/mpeg4");
228120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
228220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
228320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
228420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/h263");
228520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
228620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.pNativeRender = 0;
228720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
228820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
228920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
229038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->bufferProcessType = BUFFER_SHARE;
229138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portWayType = WAY2_PORT;
229220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
229320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Output port */
229420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
229520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
229620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
229738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
229820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
229920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
230020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
230120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
230220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
230320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.pNativeRender = 0;
230420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
230520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
230620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
230738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE;
230838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portWayType = WAY2_PORT;
230920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
231020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (codecType == CODEC_TYPE_MPEG4) {
231120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        for(i = 0; i < ALL_PORT_NUM; i++) {
231220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            INIT_SET_SIZE_VERSION(&pMpeg4Dec->mpeg4Component[i], OMX_VIDEO_PARAM_MPEG4TYPE);
231320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Dec->mpeg4Component[i].nPortIndex = i;
231420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Dec->mpeg4Component[i].eProfile   = OMX_VIDEO_MPEG4ProfileSimple;
231520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Dec->mpeg4Component[i].eLevel     = OMX_VIDEO_MPEG4Level3;
231620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
231720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
231820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        for(i = 0; i < ALL_PORT_NUM; i++) {
231920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            INIT_SET_SIZE_VERSION(&pMpeg4Dec->h263Component[i], OMX_VIDEO_PARAM_H263TYPE);
232020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Dec->h263Component[i].nPortIndex = i;
232120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Dec->h263Component[i].eProfile   = OMX_VIDEO_H263ProfileBaseline | OMX_VIDEO_H263ProfileISWV2;
232220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Dec->h263Component[i].eLevel     = OMX_VIDEO_H263Level45;
232320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
232420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
232520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
2326800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->GetParameter      = &Exynos_Mpeg4Dec_GetParameter;
2327800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->SetParameter      = &Exynos_Mpeg4Dec_SetParameter;
2328800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->GetConfig         = &Exynos_Mpeg4Dec_GetConfig;
2329800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->SetConfig         = &Exynos_Mpeg4Dec_SetConfig;
2330800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->GetExtensionIndex = &Exynos_Mpeg4Dec_GetExtensionIndex;
2331800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->ComponentRoleEnum = &Exynos_Mpeg4Dec_ComponentRoleEnum;
233220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
233320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
233438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_codec_componentInit      = &Exynos_Mpeg4Dec_Init;
233538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_codec_componentTerminate = &Exynos_Mpeg4Dec_Terminate;
233638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
233738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_srcInputProcess  = &Exynos_Mpeg4Dec_srcInputBufferProcess;
233838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_srcOutputProcess = &Exynos_Mpeg4Dec_srcOutputBufferProcess;
233938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_dstInputProcess  = &Exynos_Mpeg4Dec_dstInputBufferProcess;
234038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_dstOutputProcess = &Exynos_Mpeg4Dec_dstOutputBufferProcess;
234138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
23423e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    pVideoDec->exynos_codec_start            = &Mpeg4CodecStart;
23433e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    pVideoDec->exynos_codec_stop             = &Mpeg4CodecStop;
234438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_bufferProcessRun = &Mpeg4CodecOutputBufferProcessRun;
234538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_enqueueAllBuffer = &Mpeg4CodecEnQueueAllBuffer;
234638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
234720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (codecType == CODEC_TYPE_MPEG4)
234838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVideoDec->exynos_checkInputFrame = &Check_Mpeg4_Frame;
234920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    else
235038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVideoDec->exynos_checkInputFrame = &Check_H263_Frame;
235138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
235238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
235338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
235438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
235538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
235638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->hSharedMemory == NULL) {
23573e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
235838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pMpeg4Dec);
235938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pMpeg4Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
236038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
236138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
236238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
236338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
236420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
236520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->currentState = OMX_StateLoaded;
236620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
236720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
236820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
236920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
237020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
237120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
237220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
237320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
237420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
237538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
237620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
237738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE            ret = OMX_ErrorNone;
237838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE       *pOMXComponent = NULL;
237920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
238038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
238138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_MPEG4DEC_HANDLE      *pMpeg4Dec = NULL;
238220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
238320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
238420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
238520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
238620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
238720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
238820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
238920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
239020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
239138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
239238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
239338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
239420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
239520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pExynosComponent->componentName);
239620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = NULL;
239720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
239838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
239920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pMpeg4Dec != NULL) {
240020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pMpeg4Dec);
240138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pMpeg4Dec = pVideoDec->hCodecHandle = NULL;
240220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
240320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
240420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
240520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
240620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
240720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
240820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
240920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
241020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
241120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
241220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
241320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
241420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
241520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
2416