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_H264dec.c
2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief
2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
2238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version     2.0.0
2320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history
2438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *   2012.02.20 : Create
2520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */
2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h>
2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h>
2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h>
3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Macros.h"
3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Basecomponent.h"
3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Baseport.h"
3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Vdec.h"
3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_ETC.h"
3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Semaphore.h"
3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Thread.h"
3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "library_register.h"
3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_H264dec.h"
4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "ExynosVideoApi.h"
41800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include "Exynos_OSAL_SharedMemory.h"
4238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Event.h"
4320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#ifdef USE_ANB
4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Android.h"
4620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
4720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang/* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
4920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "csc.h"
5120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
5220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef  EXYNOS_LOG_TAG
5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG    "EXYNOS_H264_DEC"
5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF
5538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//#define EXYNOS_TRACE_ON
5620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h"
5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define H264_DEC_NUM_OF_EXTRA_BUFFERS 7
5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//#define ADD_SPS_PPS_I_FRAME
6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang//#define FULL_FRAME_SEARCH
6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* H.264 Decoder Supported Levels & profiles */
6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXYNOS_OMX_VIDEO_PROFILELEVEL supportedAVCProfileLevels[] ={
6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1},
6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1b},
6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel11},
6820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel12},
6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13},
7020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel2},
7120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel21},
7220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel22},
7320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel3},
7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel31},
7520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel32},
7620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel4},
77800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel41},
78800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel42},
7920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
8020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel1},
8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel1b},
8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel11},
8320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel12},
8420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel13},
8520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel2},
8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel21},
8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel22},
8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel3},
8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel31},
9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel32},
9120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel4},
92800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel41},
93800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel42},
9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel1},
9620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel1b},
9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel11},
9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel12},
9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel13},
10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel2},
10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel21},
10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel22},
10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel3},
10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel31},
10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel32},
106800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel4},
107800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel41},
108800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel42}};
10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
11038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, void *pVirtAddr, OMX_U32 *dataSize)
11138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
11238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE       ret = OMX_ErrorNone;
11338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
11438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
11538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
11638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
11738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
11838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, void *addr[], int size[])
11938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
12038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE       ret = OMX_ErrorNone;
12138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer  *pCodecBuffer;
12238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
12338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (codecBuffer == NULL) {
12438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
12538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
12638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
12738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
12838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
12938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
13038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (addr != NULL) {
13138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        addr[0] = pCodecBuffer->planes[0].addr;
13238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        addr[1] = pCodecBuffer->planes[1].addr;
13338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        addr[2] = pCodecBuffer->planes[2].addr;
13438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
13538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
13638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (size != NULL) {
13738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        size[0] = pCodecBuffer->planes[0].allocSize;
13838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        size[1] = pCodecBuffer->planes[1].allocSize;
13938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        size[2] = pCodecBuffer->planes[2].allocSize;
14038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
14138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
14238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
14338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
14438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
146800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changint Check_H264_Frame(
14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8   *pInputStream,
14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32   buffSize,
14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32   flag,
15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL  bPreviousFrameEOF,
15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL *pbEndOfFrame)
15220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
15320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32  preFourByte       = (OMX_U32)-1;
15420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int      accessUnitSize    = 0;
15520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int      frameTypeBoundary = 0;
15620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int      nextNaluSize      = 0;
15720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int      naluStart         = 0;
15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (bPreviousFrameEOF == OMX_TRUE)
16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        naluStart = 0;
16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    else
16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        naluStart = 1;
16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    while (1) {
16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        int inputOneByte = 0;
16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (accessUnitSize == (int)buffSize)
16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        inputOneByte = *(pInputStream++);
17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        accessUnitSize += 1;
17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (preFourByte == 0x00000001 || (preFourByte << 8) == 0x00000100) {
17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            int naluType = inputOneByte & 0x1F;
17520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NaluType : %d", naluType);
17720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (naluStart == 0) {
17820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#ifdef ADD_SPS_PPS_I_FRAME
17920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (naluType == 1 || naluType == 5)
18020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#else
18120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (naluType == 1 || naluType == 5 || naluType == 7 || naluType == 8)
18220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
18320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    naluStart = 1;
18420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
18520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#ifdef OLD_DETECT
18620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                frameTypeBoundary = (8 - naluType) & (naluType - 10); //AUD(9)
18720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#else
18820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (naluType == 9)
18920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    frameTypeBoundary = -2;
19020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
19120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (naluType == 1 || naluType == 5) {
19220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    if (accessUnitSize == (int)buffSize) {
19320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        accessUnitSize--;
19420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        goto EXIT;
19520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    }
19620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    inputOneByte = *pInputStream++;
19720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    accessUnitSize += 1;
19820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    if (inputOneByte >= 0x80)
20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        frameTypeBoundary = -1;
20120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
20220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (frameTypeBoundary < 0) {
20320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    break;
20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
20520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
20620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
20820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        preFourByte = (preFourByte << 8) + inputOneByte;
20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
21020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    *pbEndOfFrame = OMX_TRUE;
21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    nextNaluSize = -5;
21320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (frameTypeBoundary == -1)
21420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        nextNaluSize = -6;
21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (preFourByte != 0x00000001)
21620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        nextNaluSize++;
21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return (accessUnitSize + nextNaluSize);
21820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
21920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
22020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    *pbEndOfFrame = OMX_FALSE;
22120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return accessUnitSize;
22320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
22420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
225800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic OMX_BOOL Check_H264_StartCode(
22620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8 *pInputStream,
22720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32 streamSize)
22820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
22920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (streamSize < 4) {
23020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        return OMX_FALSE;
23138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
23238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
23338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pInputStream[0] == 0x00) &&
23438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInputStream[1] == 0x00) &&
23538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInputStream[2] == 0x00) &&
23638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInputStream[3] != 0x00) &&
23738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ((pInputStream[3] >> 3) == 0x00)) {
23838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NaluType : %d, 0x%x, 0x%x, 0x%x", (pInputStream[4] & 0x1F), pInputStream[3], pInputStream[4], pInputStream[5]);
23920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        return OMX_TRUE;
24020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else if ((pInputStream[0] == 0x00) &&
24138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang               (pInputStream[1] == 0x00) &&
24238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang               (pInputStream[2] != 0x00) &&
24338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang               ((pInputStream[2] >> 3) == 0x00)) {
24438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NaluType : %d, 0x%x, 0x%x, 0x%x", (pInputStream[3] & 0x1F), pInputStream[2], pInputStream[3], pInputStream[4]);
24520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        return OMX_TRUE;
24620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
24720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        return OMX_FALSE;
24820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
24920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
25020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
25138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE H264CodecOpen(EXYNOS_H264DEC_HANDLE *pH264Dec)
25238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
2533e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_ERRORTYPE            ret        = OMX_ErrorNone;
25438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
25538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
25638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
25738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
25838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
25938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
26038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pH264Dec == NULL) {
26138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
26238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
26338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
26438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
26538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
26638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* alloc ops structure */
26738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = (ExynosVideoDecOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps));
26838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
26938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
27038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
27138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pDecOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
27238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate decoder ops buffer");
27338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
27438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
27538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
27638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
27738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->hMFCH264Handle.pDecOps    = pDecOps;
27838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->hMFCH264Handle.pInbufOps  = pInbufOps;
27938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->hMFCH264Handle.pOutbufOps = pOutbufOps;
28038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
28138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* function pointer mapping */
28238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps->nSize    = sizeof(ExynosVideoDecOps);
28338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps->nSize  = sizeof(ExynosVideoDecBufferOps);
28438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
28538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
28638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_Video_Register_Decoder(pDecOps, pInbufOps, pOutbufOps);
2873e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
28838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* check mandatory functions for decoder ops */
28938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pDecOps->Init == NULL) || (pDecOps->Finalize == NULL) ||
29038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pDecOps->Get_ActualBufferCount == NULL) || (pDecOps->Set_FrameTag == NULL) ||
29138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pDecOps->Get_FrameTag == NULL)) {
29238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
29338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
29438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
29538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
29638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
29738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* check mandatory functions for buffer ops */
29838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
29938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
30038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
30138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
30238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
30338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
30438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
30538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
30638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
30738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
30838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* alloc context, open, querycap */
309c94beaeb6990ddf010f7934c201f68e2d66dff62SeungBeom Kim    pH264Dec->hMFCH264Handle.hMFCHandle = pH264Dec->hMFCH264Handle.pDecOps->Init(V4L2_MEMORY_DMABUF);
31038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pH264Dec->hMFCH264Handle.hMFCHandle == NULL) {
31138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
31238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
31338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
31438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
31538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
31638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
31738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
31838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
319440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    if (ret != OMX_ErrorNone) {
320440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        if (pDecOps != NULL) {
321440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            Exynos_OSAL_Free(pDecOps);
322440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            pH264Dec->hMFCH264Handle.pDecOps = NULL;
323440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        }
324440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        if (pInbufOps != NULL) {
325440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            Exynos_OSAL_Free(pInbufOps);
326440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            pH264Dec->hMFCH264Handle.pInbufOps = NULL;
327440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        }
328440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        if (pOutbufOps != NULL) {
329440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            Exynos_OSAL_Free(pOutbufOps);
330440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim            pH264Dec->hMFCH264Handle.pOutbufOps = NULL;
331440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim        }
332440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    }
333440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim
33438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
33538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
33638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
33738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
33838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
33938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE H264CodecClose(EXYNOS_H264DEC_HANDLE *pH264Dec)
34038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
34138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE            ret = OMX_ErrorNone;
34238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                    *hMFCHandle = NULL;
34338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
34438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
34538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
34638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
3473e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
3483e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
34938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pH264Dec == NULL) {
35038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
35138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
35238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
35338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
35438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
35538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
35638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
35738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
35838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
35938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (hMFCHandle != NULL) {
36038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDecOps->Finalize(hMFCHandle);
3613e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        pH264Dec->hMFCH264Handle.hMFCHandle = NULL;
36238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
36338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps != NULL) {
36438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pOutbufOps);
3653e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        pH264Dec->hMFCH264Handle.pOutbufOps = NULL;
36638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
36738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps != NULL) {
36838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pInbufOps);
3693e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        pH264Dec->hMFCH264Handle.pInbufOps = NULL;
37038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
37138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pDecOps != NULL) {
37238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pDecOps);
3733e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        pH264Dec->hMFCH264Handle.pDecOps = NULL;
37438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
37538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
37638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
37738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
37838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
37938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
38038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
38138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
38238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
38338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
38438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE H264CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
38538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
38638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE            ret = OMX_ErrorNone;
38738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                    *hMFCHandle = NULL;
38838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
38938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
39038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
39138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
39238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE   *pH264Dec = NULL;
39338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
3943e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
3953e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
39638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent == NULL) {
39738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
39838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
39938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
40038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
40138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
40238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec == NULL) {
40338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
40438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
40538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
4063e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
40738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec = (EXYNOS_H264DEC_HANDLE *)pVideoDec->hCodecHandle;
40838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pH264Dec == NULL) {
40938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
41038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
41138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
41238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
41338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
41438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
41538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
41638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
41738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
41838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPortIndex == INPUT_PORT_INDEX)
41938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pInbufOps->Run(hMFCHandle);
42038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    else if (nPortIndex == OUTPUT_PORT_INDEX)
42138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pOutbufOps->Run(hMFCHandle);
42238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
42338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
42438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
42538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
42638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
42738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
42838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
42938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
43038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
43138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE H264CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
43238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
43338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE            ret = OMX_ErrorNone;
43438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                    *hMFCHandle = NULL;
43538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
43638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
43738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
43838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
43938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE   *pH264Dec = NULL;
44038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
4413e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    FunctionIn();
4423e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim
44338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent == NULL) {
44438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
44538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
44638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
44738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
44838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
44938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec == NULL) {
45038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
45138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
45238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
45338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec = (EXYNOS_H264DEC_HANDLE *)pVideoDec->hCodecHandle;
45438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pH264Dec == NULL) {
45538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
45638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
45738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
45838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
45938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
46038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
46138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
46238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
46338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
46438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
46538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pInbufOps->Stop(hMFCHandle);
46638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
46738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pOutbufOps->Stop(hMFCHandle);
46838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
46938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
47038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
47138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
47238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
47338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
47438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
47538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
47638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
47738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE H264CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
47838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
47938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE            ret = OMX_ErrorNone;
48038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                    *hMFCHandle = NULL;
48138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
48238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
48338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
48438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
48538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE   *pH264Dec = NULL;
48638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
48738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
48838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
48938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent == NULL) {
49038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
49138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
49238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
49338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
49438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
49538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec == NULL) {
49638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
49738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
49838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
49938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec = (EXYNOS_H264DEC_HANDLE *)pVideoDec->hCodecHandle;
50038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pH264Dec == NULL) {
50138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
50238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
50338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
50438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
50538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
50638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
50738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
50838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
50938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
51038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPortIndex == INPUT_PORT_INDEX) {
51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pH264Dec->bSourceStart == OMX_FALSE) {
51238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pH264Dec->hSourceStartEvent);
51338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
51438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
51538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
51638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
51738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPortIndex == OUTPUT_PORT_INDEX) {
51838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pH264Dec->bDestinationStart == OMX_FALSE) {
51938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pH264Dec->hDestinationStartEvent);
52038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
52138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
52238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
52338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
52438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
52538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
52638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
52738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
52838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
52938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
53038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
53138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
53238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE H264CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
533800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{
53438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
535800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
53638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
53738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
53838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
53938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
54038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
54138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i, nOutbufs;
54238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
54338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
54438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
54538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
546800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
547800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    FunctionIn();
548800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
54938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((nPortIndex == INPUT_PORT_INDEX) &&
55038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pH264Dec->bSourceStart == OMX_TRUE)) {
55138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
55238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
55338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
55438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
555ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
55638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
55738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
55838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
55938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
56038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pInbufOps->Clear_Queue(hMFCHandle);
56138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
56238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang               (pH264Dec->bDestinationStart == OMX_TRUE)) {
56394d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim        OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
56438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ExynosVideoBuffer *pBuffer = NULL;
56538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
56638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
56738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
56838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        nOutbufs = pDecOps->Get_ActualBufferCount(hMFCHandle);
56938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        nOutbufs += EXTRA_DPB_NUM;
57038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < nOutbufs; i++) {
57138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer);
57238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer);
57338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
57438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pOutbufOps->Clear_Queue(hMFCHandle);
57538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
57638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
57738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
57838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
57938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
58038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
58138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
58238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
58338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
58438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
58538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
58638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
58738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
58838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
58938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
59138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
59238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
59338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
59438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
59538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                     oneFrameSize = pSrcInputData->dataLen;
59638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
59738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
59838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
59938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
60038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoGeometry      bufferConf;
60138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                  inputBufferNumber = 0;
60238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i;
60338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
60438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
60538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
60638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
60754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
60854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
60954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        if (OMXBuffer == NULL) {
61038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorUndefined;
61138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
61238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
61338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
61454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
61554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        OMXBuffer->nFlags = pSrcInputData->nFlags;
61654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
61738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
61938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
62038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
62138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
62238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->bThumbnailMode == OMX_TRUE)
62338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDecOps->Set_DisplayDelay(hMFCHandle, 0);
62438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
62538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* input buffer info */
62638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
62738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    bufferConf.eCompressionFormat = VIDEO_CODING_AVC;
6281ed2fc89aa809989164905497b680fa10e74a134Dima Zavin    pInbufOps->Set_Shareable(hMFCHandle);
62938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
63094d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim        bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth
63194d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                                * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
63238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM;
63338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
63438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE;
63538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
63638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* should be done before prepare input buffer */
63938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
64038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
64138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
64238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
64338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
64438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* set input buffer geometry */
64538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
64638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
64738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
64838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
64938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
65038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
65138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* setup input buffer */
65238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
65338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
65438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
65538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
65638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
65838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
65938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Register input buffer */
66038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
66101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            ExynosVideoPlane plane;
662ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            plane.addr = pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0];
663ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize[0];
664ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            plane.fd = pVideoDec->pMFCDecInputBuffer[i]->fd[0];
66594d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
66738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
66838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
66938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
67038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
67138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Register input buffer */
67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
67401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            ExynosVideoPlane plane;
6750e6617d9084f11fe951775e67a2ab8a71e50af94SeungBeom Kim            if (pVideoDec->bDRMPlayerMode == OMX_FALSE) {
6760e6617d9084f11fe951775e67a2ab8a71e50af94SeungBeom Kim                plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
6770e6617d9084f11fe951775e67a2ab8a71e50af94SeungBeom Kim            } else {
6780e6617d9084f11fe951775e67a2ab8a71e50af94SeungBeom Kim                plane.addr = Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec->hSharedMemory,
6790e6617d9084f11fe951775e67a2ab8a71e50af94SeungBeom Kim                                               pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
6800e6617d9084f11fe951775e67a2ab8a71e50af94SeungBeom Kim            }
68101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
68201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0];
68394d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
68438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
68538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
68738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
68838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
68938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
69038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
69138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* set output geometry */
69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->hMFCH264Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
69438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
69538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
69638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
69738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
69838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
69938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* input buffer enqueue for header parsing */
70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
70294d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
70394d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                        (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
70438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing");
70538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//        ret = OMX_ErrorInsufficientResources;
70638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit;
70738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
71038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* start header parsing */
71138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
71238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing");
71338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorCodecInit;
714800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        goto EXIT;
715800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
716800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get geometry for output */
71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(&pH264Dec->hMFCH264Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry));
71938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Get_Geometry(hMFCHandle, &pH264Dec->hMFCH264Handle.codecOutbufConf) != VIDEO_ERROR_NONE) {
72038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info");
721800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = OMX_ErrorInsufficientResources;
722800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        goto EXIT;
723800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
724800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
72538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get dpb count */
726bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    pH264Dec->hMFCH264Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle);
72738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->bThumbnailMode == OMX_FALSE)
728bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim        pH264Dec->hMFCH264Handle.maxDPBNum += EXTRA_DPB_NUM;
729bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "H264CodecSetup nOutbufs: %d", pH264Dec->hMFCH264Handle.maxDPBNum);
73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
73138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->hMFCH264Handle.bConfiguredMFCSrc = OMX_TRUE;
73238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
73338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosOutputPort->cropRectangle.nTop = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nTop;
73438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosOutputPort->cropRectangle.nLeft = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nLeft;
73538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosOutputPort->cropRectangle.nWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nWidth;
73638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosOutputPort->cropRectangle.nHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nHeight;
73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
73838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
73938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth) ||
74038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight)) {
74138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth;
74238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight;
74338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
74438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
74538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
74638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_UpdateFrameSize(pOMXComponent);
74738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
74838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
74938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /** Send Port Settings changed call back **/
75038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (*(pExynosComponent->pCallbacks->EventHandler))
75138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (pOMXComponent,
75238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 pExynosComponent->callbackData,
75338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_EventPortSettingsChanged, /* The command was completed */
75438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_DirOutput, /* This is the port index */
75538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 0,
75638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 NULL);
75738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
75838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
75938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth) ||
76038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight) ||
761bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            (pExynosOutputPort->portDefinition.nBufferCountActual != pH264Dec->hMFCH264Handle.maxDPBNum)) {
76238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth;
76338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nFrameHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight;
76438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
76538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
76638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
767bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            pExynosOutputPort->portDefinition.nBufferCountActual = pH264Dec->hMFCH264Handle.maxDPBNum - 2;
768bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim            pExynosOutputPort->portDefinition.nBufferCountMin = pH264Dec->hMFCH264Handle.maxDPBNum - 2;
76938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
77038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_UpdateFrameSize(pOMXComponent);
77138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
77238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
77338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /** Send Port Settings changed call back **/
77438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (*(pExynosComponent->pCallbacks->EventHandler))
77538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (pOMXComponent,
77638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 pExynosComponent->callbackData,
77738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_EventPortSettingsChanged, /* The command was completed */
77838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 OMX_DirOutput, /* This is the port index */
77938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 0,
78038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 NULL);
78138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
78238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
783495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim    if ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth != pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nWidth) ||
784495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim        (pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight != pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nHeight)) {
785495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim        /* Check Crop */
786495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim        pExynosInputPort->portDefinition.format.video.nFrameWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth;
787495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim        pExynosInputPort->portDefinition.format.video.nFrameHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight;
788495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim        pExynosInputPort->portDefinition.format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
789495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim        pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
790495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim        Exynos_UpdateFrameSize(pOMXComponent);
791495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim
792495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim        /** Send crop info call back **/
793495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim        (*(pExynosComponent->pCallbacks->EventHandler))
794495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim            (pOMXComponent,
795495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim             pExynosComponent->callbackData,
796495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim             OMX_EventPortSettingsChanged, /* The command was completed */
797495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim             OMX_DirOutput, /* This is the port index */
798495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim             OMX_IndexConfigCommonOutputCrop,
799495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim             NULL);
800495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim    }
801495cf0628abd630705bb28c4f1efc89b8685f6edSeungBeom Kim
80238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SleepMillisec(0);
80338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorInputDataDecodeYet;
80438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    H264CodecStop(pOMXComponent, INPUT_PORT_INDEX);
805800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
806800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangEXIT:
807800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    FunctionOut();
80838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
809800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    return ret;
810800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang}
811800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
81238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE H264CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
813800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{
81438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
815800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
81638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
81738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
81838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
81938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
82038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
82438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
82557fbf5bae538500a8332718cec7a7446e02d4da4SeungBeom Kim
82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i, nOutbufs;
827800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
828800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    FunctionIn();
829800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* get dpb count */
831bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim    nOutbufs = pH264Dec->hMFCH264Handle.maxDPBNum;
83238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
833fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
834fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim        /* should be done before prepare output buffer */
835fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim        if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
836fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim            ret = OMX_ErrorInsufficientResources;
837fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim            goto EXIT;
838fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim        }
839800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
840800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
84138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps->Set_Shareable(hMFCHandle);
84238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
84338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
845800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        goto EXIT;
846800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
847800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
848ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
849ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
85094d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
851ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int plane;
852ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
853ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    nAllocLen[0] = calc_plane(pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth,
854ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight);
855ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    nAllocLen[1] = calc_plane(pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth,
856ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight >> 1);
857ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
85838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
859ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        MEMORY_TYPE memoryType;
860ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        if (pVideoDec->bDRMPlayerMode == OMX_TRUE)
861ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            memoryType = SECURE_MEMORY;
862ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        else
863ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            memoryType = NORMAL_MEMORY;
864ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
86501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        /* Register output buffer */
86638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        for (i = 0; i < nOutbufs; i++) {
867ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
868ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
86901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
87094d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
871ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] =
872ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], memoryType);
873ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) {
874ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
875ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    ret = OMX_ErrorInsufficientResources;
876ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    goto EXIT;
877ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
878ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] =
879ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
880ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                                                       pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
881ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane];
882ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
883ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane];
88401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin                planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane];
885ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
88601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            }
88701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin
88894d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim            if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
88938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
89038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorInsufficientResources;
89138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
89238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
893ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
89494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                            (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
89538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
89638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
89701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        /* Register output buffer */
89838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
89938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
90038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
901ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#ifdef USE_ANB
902ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) {
903ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
904ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
905ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane];
906ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane];
907ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    planes[plane].allocSize = nAllocLen[plane];
908ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
909ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
910ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
911ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
912ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    ret = OMX_ErrorInsufficientResources;
913ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    goto EXIT;
914ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
915569b6f9c0afe66023cc50fe41664240f67b7c6bfSeungBeom Kim                pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf,
916569b6f9c0afe66023cc50fe41664240f67b7c6bfSeungBeom Kim                               (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
91738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
918ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        } else {
919ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            ret = OMX_ErrorNotImplemented;
920ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            goto EXIT;
92138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
922ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#else
923ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        ret = OMX_ErrorNotImplemented;
924ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        goto EXIT;
925ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#endif
92638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
927ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
92838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
92938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
93038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
93138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
93238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
93338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
93438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
93538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        H264CodecStop(pOMXComponent, OUTPUT_PORT_INDEX);
93638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
93738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->hMFCH264Handle.bConfiguredMFCDst = OMX_TRUE;
93838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
93938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
940800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
941800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangEXIT:
942800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    FunctionOut();
94338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
944800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    return ret;
945800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang}
946800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
947800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_H264Dec_GetParameter(
94820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
94920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nParamIndex,
95020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_PTR     pComponentParameterStructure)
95120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
95220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret               = OMX_ErrorNone;
95320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent     = NULL;
95420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent  = NULL;
95520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
95620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
95720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
95820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
95920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
96020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
96120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
96220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
96320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
96420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
96520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
96620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
96720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
96820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
96920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
97020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
97120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
97220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
97320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
97420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
97520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
97620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
97720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
97820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nParamIndex) {
97920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoAvc:
98020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
98120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_AVCTYPE *pDstAVCComponent = (OMX_VIDEO_PARAM_AVCTYPE *)pComponentParameterStructure;
98220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_AVCTYPE *pSrcAVCComponent = NULL;
98320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_H264DEC_HANDLE      *pH264Dec = NULL;
98420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
98520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE));
98620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
98720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
98820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
98920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
99020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstAVCComponent->nPortIndex >= ALL_PORT_NUM) {
99120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
99220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
99320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
99420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
99520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
99620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcAVCComponent = &pH264Dec->AVCComponent[pDstAVCComponent->nPortIndex];
99720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
99820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memcpy(pDstAVCComponent, pSrcAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE));
99920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
100020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
100120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
100220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
100320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
100420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
100520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
100620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
100720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
100820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
100920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H264_DEC_ROLE);
101020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
101120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
101220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoProfileLevelQuerySupported:
101320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
101420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)pComponentParameterStructure;
101520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_OMX_VIDEO_PROFILELEVEL *pProfileLevel = NULL;
101620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32 maxProfileLevelNum = 0;
101720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
101820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
101920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
102020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
102120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
102220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
102320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
102420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
102620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
102720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
102820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pProfileLevel = supportedAVCProfileLevels;
102920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        maxProfileLevelNum = sizeof(supportedAVCProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
103020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
103120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) {
103220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNoMore;
103320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
103420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
103520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
103620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pProfileLevel += pDstProfileLevel->nProfileIndex;
103720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstProfileLevel->eProfile = pProfileLevel->profile;
103820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstProfileLevel->eLevel = pProfileLevel->level;
103920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
104020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
104120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoProfileLevelCurrent:
104220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
104320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)pComponentParameterStructure;
104420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_AVCTYPE *pSrcAVCComponent = NULL;
104520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_H264DEC_HANDLE      *pH264Dec = NULL;
104620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
104720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
104820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
104920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
105020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
105120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
105220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
105320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
105420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
105520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
105620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
105720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
105820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcAVCComponent = &pH264Dec->AVCComponent[pDstProfileLevel->nPortIndex];
105920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
106020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstProfileLevel->eProfile = pSrcAVCComponent->eProfile;
106120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstProfileLevel->eLevel = pSrcAVCComponent->eLevel;
106220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
106320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
106420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoErrorCorrection:
106520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
106620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
106720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
106820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_H264DEC_HANDLE      *pH264Dec = NULL;
106920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
107020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
107120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
107220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
107520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
107620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
107720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
107820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
107920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
108120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcErrorCorrectionType = &pH264Dec->errorCorrectionType[INPUT_PORT_INDEX];
108220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
108420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
108520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
108620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
108720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
108820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
108920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
109020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
109120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
109220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
109520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1100800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_H264Dec_SetParameter(
110120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentParameterStructure)
110420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
110520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret               = OMX_ErrorNone;
110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent     = NULL;
110720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent  = NULL;
110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
110920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
111020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
111220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
111320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
111420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
111520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
111620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
111720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
111820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
111920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
112020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
112120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
112220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
112320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
112420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
112920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
113020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
113220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoAvc:
113320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
113420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_AVCTYPE *pDstAVCComponent = NULL;
113520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_AVCTYPE *pSrcAVCComponent = (OMX_VIDEO_PARAM_AVCTYPE *)pComponentParameterStructure;
113620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_H264DEC_HANDLE   *pH264Dec = NULL;
113720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
113820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE));
113920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
114020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
114120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
114220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcAVCComponent->nPortIndex >= ALL_PORT_NUM) {
114420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
114520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
114620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
114720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
114920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstAVCComponent = &pH264Dec->AVCComponent[pSrcAVCComponent->nPortIndex];
115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memcpy(pDstAVCComponent, pSrcAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE));
115220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
115320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
115420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
115520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
115620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
115720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
115820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
115920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
116020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
116120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
116220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
116320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
116420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateOperation;
116520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
116620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
116738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
116838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H264_DEC_ROLE)) {
116938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
117038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
117138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorBadParameter;
117238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
117338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
117420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
117520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
117620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoProfileLevelCurrent:
117720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
117820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
117938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_VIDEO_PARAM_AVCTYPE          *pDstAVCComponent = NULL;
118038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        EXYNOS_H264DEC_HANDLE            *pH264Dec = NULL;
118120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
118220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
118320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone)
118420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
118520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
118620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
118720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
118820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
118920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
119020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
119120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
119220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
119320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstAVCComponent = &pH264Dec->AVCComponent[pSrcProfileLevel->nPortIndex];
119420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstAVCComponent->eProfile = pSrcProfileLevel->eProfile;
119520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstAVCComponent->eLevel = pSrcProfileLevel->eLevel;
119620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
119720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
119820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoErrorCorrection:
119920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
120020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
120120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
120238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        EXYNOS_H264DEC_HANDLE               *pH264Dec = NULL;
120320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
120420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
120520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
120620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
120720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
120820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
120920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
121020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
121120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
121220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
121320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
121420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
121520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType = &pH264Dec->errorCorrectionType[INPUT_PORT_INDEX];
121620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
121720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
121820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
121920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
122020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
122120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
122220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
122320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
122420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
122520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
122620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
122720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
122820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
122920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
123020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
123120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
123220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
123320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1234800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_H264Dec_GetConfig(
123520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
123620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INDEXTYPE  nIndex,
123720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR        pComponentConfigStructure)
123820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
123920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret               = OMX_ErrorNone;
124020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent     = NULL;
124120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent  = NULL;
124220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
124320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
124420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
124520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
124620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
124720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
124820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
124920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
125020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
125120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
125220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
125320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
125420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
125520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
125620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
125720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
125820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
125920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pComponentConfigStructure == NULL) {
126020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
126120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
126220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
126320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
126420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
126520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
126620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
126720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
126920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexConfigCommonOutputCrop:
127020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
127120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_H264DEC_HANDLE  *pH264Dec = NULL;
127220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_CONFIG_RECTTYPE    *pSrcRectType = NULL;
127320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_CONFIG_RECTTYPE    *pDstRectType = NULL;
127420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
127520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
127638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pH264Dec->hMFCH264Handle.bConfiguredMFCSrc == OMX_FALSE) {
127720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNotReady;
127820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
127920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
128020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstRectType = (OMX_CONFIG_RECTTYPE *)pComponentConfigStructure;
128220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pDstRectType->nPortIndex != INPUT_PORT_INDEX) &&
128420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            (pDstRectType->nPortIndex != OUTPUT_PORT_INDEX)) {
128520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
128620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
128720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
128820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[pDstRectType->nPortIndex];
129020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcRectType = &(pExynosPort->cropRectangle);
129220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstRectType->nTop = pSrcRectType->nTop;
129420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstRectType->nLeft = pSrcRectType->nLeft;
129520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstRectType->nHeight = pSrcRectType->nHeight;
129620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstRectType->nWidth = pSrcRectType->nWidth;
129720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
129820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
129920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
130020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
130120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
130220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
130320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
130420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
130520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
130620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
130720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
130820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
130920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1310800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_H264Dec_SetConfig(
131120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
131220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INDEXTYPE  nIndex,
131320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR        pComponentConfigStructure)
131420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
131520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret               = OMX_ErrorNone;
131620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent     = NULL;
131720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent  = NULL;
131820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
131920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
132020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
132120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
132220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
132320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
132420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
132520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
132620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
132720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
132820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
132920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
133020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
133120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
133220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
133320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
133420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
133520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pComponentConfigStructure == NULL) {
133620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
133720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
133820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
133920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
134020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
134120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
134220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
134320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
134420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
134520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
134620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
134720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
134820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
134920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
135020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
135120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
135220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
135320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
135420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
135520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1356800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_H264Dec_GetExtensionIndex(
135720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE  hComponent,
135820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_STRING      cParameterName,
135920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_INDEXTYPE *pIndexType)
136020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
136120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret               = OMX_ErrorNone;
136220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent     = NULL;
136320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent  = NULL;
136420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
136520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
136620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
136720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
136820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
136920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
137020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
137120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
137220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
137320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
137420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
137520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
137620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
137720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
137820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
137920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
138020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
138120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((cParameterName == NULL) || (pIndexType == NULL)) {
138220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
138320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
138420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
138520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
138620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
138720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
138820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
138920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
139020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
139120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_H264DEC_HANDLE *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
139220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        *pIndexType = OMX_IndexVendorThumbnailMode;
139320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
139420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
139520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
139620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
139720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
139820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
139920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
140020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
140120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
140220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
140320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1404800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_H264Dec_ComponentRoleEnum(
140520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
140620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8        *cRole,
140720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32        nIndex)
140820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
140920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret               = OMX_ErrorNone;
141020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent     = NULL;
141120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent  = NULL;
141220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
141320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
141420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
141520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (cRole == NULL)) {
141620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
141720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
141820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
141920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) {
142020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_H264_DEC_ROLE);
142120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
142220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
142320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNoMore;
142420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
142520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
142720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
142820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
143020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
143120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
143220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Init */
1433800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_H264Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
143420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
143520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
143620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
143720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec         = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
143838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
143920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
14403e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_H264DEC_HANDLE         *pH264Dec          = (EXYNOS_H264DEC_HANDLE *)pVideoDec->hCodecHandle;
144138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_PTR                        hMFCHandle        = pH264Dec->hMFCH264Handle.hMFCHandle;
144220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
144338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = NULL;
144438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = NULL;
144538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = NULL;
144620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
144720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    CSC_METHOD csc_method = CSC_METHOD_SW;
1448ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int i, plane;
144920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
145020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
145120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
145238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->hMFCH264Handle.bConfiguredMFCSrc = OMX_FALSE;
145338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->hMFCH264Handle.bConfiguredMFCDst = OMX_FALSE;
145438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->bUseFlagEOF = OMX_TRUE;
145520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
145620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
145738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* H.264 Codec Open */
145838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = H264CodecOpen(pH264Dec);
145938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
146020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
146120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
1462800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
146338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
146438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
146538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
146638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
146738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
146838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
146938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
147038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
14713e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1472ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
1473ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
147438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
1475ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
1476ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1477ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                /* Use ION Allocator */
1478ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
1479ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1480ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
1481ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
1482ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
1483ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
1484ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    ret = OMX_ErrorInsufficientResources;
1485ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    goto EXIT;
1486ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
1487ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1488ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            }
148920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
149038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
149120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
149238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
149338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
149438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
149538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
149638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
149720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
149820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
149938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
150038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
150138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
150238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
150338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
150438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
150538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
150638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
150720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
150820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
150938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->bSourceStart = OMX_FALSE;
151038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalCreate(&pH264Dec->hSourceStartEvent);
151138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->bDestinationStart = OMX_FALSE;
151238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalCreate(&pH264Dec->hDestinationStartEvent);
151320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
151520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
151620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pH264Dec->hMFCH264Handle.indexTimestamp = 0;
151720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pH264Dec->hMFCH264Handle.outputIndexTimestamp = 0;
151820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->getAllDelayBuffer = OMX_FALSE;
152020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
152138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#if 0//defined(USE_CSC_GSCALER)
152238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
152320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
1524388744c044e15959e8205bf5565e52aca5334eb7SeungBeom Kim    if (pVideoDec->bDRMPlayerMode == OMX_TRUE) {
1525388744c044e15959e8205bf5565e52aca5334eb7SeungBeom Kim        pVideoDec->csc_handle = csc_init(CSC_METHOD_HW);
1526388744c044e15959e8205bf5565e52aca5334eb7SeungBeom Kim        csc_set_hw_property(pVideoDec->csc_handle, CSC_HW_PROPERTY_FIXED_NODE, 2);
1527388744c044e15959e8205bf5565e52aca5334eb7SeungBeom Kim        csc_set_hw_property(pVideoDec->csc_handle, CSC_HW_PROPERTY_MODE_DRM, pVideoDec->bDRMPlayerMode);
1528388744c044e15959e8205bf5565e52aca5334eb7SeungBeom Kim    } else {
1529388744c044e15959e8205bf5565e52aca5334eb7SeungBeom Kim        pVideoDec->csc_handle = csc_init(csc_method);
1530388744c044e15959e8205bf5565e52aca5334eb7SeungBeom Kim    }
1531388744c044e15959e8205bf5565e52aca5334eb7SeungBeom Kim
153238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->csc_handle == NULL) {
153338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
153438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
1535800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
153620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoDec->csc_set_format = OMX_FALSE;
153720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
153920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
154020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
154120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
154220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
154320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
154420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Terminate */
1545800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_H264Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
154620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
154720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
154820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
154920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec         = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
155020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
155120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
155238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE         *pH264Dec          = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
155338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_PTR                        hMFCHandle        = pH264Dec->hMFCH264Handle.hMFCHandle;
155420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
155538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
155638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
155738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
155820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1559ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int i, plane;
156020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
156138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
156220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
156338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->csc_handle != NULL) {
156438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        csc_deinit(pVideoDec->csc_handle);
156538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVideoDec->csc_handle = NULL;
156620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
156720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
156838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalTerminate(pH264Dec->hDestinationStartEvent);
156938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->hDestinationStartEvent = NULL;
157038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->bDestinationStart = OMX_FALSE;
157138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalTerminate(pH264Dec->hSourceStartEvent);
157238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->hSourceStartEvent = NULL;
157338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->bSourceStart = OMX_FALSE;
157438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
157538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
15763e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
157738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
1578ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1579ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL)
1580ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
1581ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
1582ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
158338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
158438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pVideoDec->pMFCDecOutputBuffer[i] = NULL;
158538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
1586800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        }
158720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
158838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
158938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
159038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
159138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
159238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
159338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
159438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
159520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
159620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
159738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
15983e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
159938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
1600ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1601ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                    if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
1602ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1603ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                }
160438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
160538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pVideoDec->pMFCDecInputBuffer[i] = NULL;
160638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
160720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
1608800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
160938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
161038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
161138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
161238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
161338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*    TBD    */
161438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /*************/
161538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Does not require any actions. */
161638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
161738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    H264CodecClose(pH264Dec);
161820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
161920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
162038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
162138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
162220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
162320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
162420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
162538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_H264Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
162620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
162738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE               ret = OMX_ErrorNone;
162838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
162938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
163038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
163138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
163238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
163338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
163438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32  oneFrameSize = pSrcInputData->dataLen;
163538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
163638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
163738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
163838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
163938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i;
164020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
164120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
164220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
164338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pH264Dec->hMFCH264Handle.bConfiguredMFCSrc == OMX_FALSE) {
164438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = H264CodecSrcSetup(pOMXComponent, pSrcInputData);
164520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
164620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
164738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pH264Dec->hMFCH264Handle.bConfiguredMFCDst == OMX_FALSE) {
164838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = H264CodecDstSetup(pOMXComponent);
164938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
165038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
1651388744c044e15959e8205bf5565e52aca5334eb7SeungBeom Kim    if (((pVideoDec->bDRMPlayerMode == OMX_TRUE) ||
1652388744c044e15959e8205bf5565e52aca5334eb7SeungBeom Kim            (Check_H264_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize) == OMX_TRUE)) ||
1653388744c044e15959e8205bf5565e52aca5334eb7SeungBeom Kim        ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
165438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->timeStamp[pH264Dec->hMFCH264Handle.indexTimestamp] = pSrcInputData->timeStamp;
165538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->nFlags[pH264Dec->hMFCH264Handle.indexTimestamp] = pSrcInputData->nFlags;
165638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pH264Dec->hMFCH264Handle.indexTimestamp, pSrcInputData->nFlags);
165738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDecOps->Set_FrameTag(hMFCHandle, pH264Dec->hMFCH264Handle.indexTimestamp);
165838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pH264Dec->hMFCH264Handle.indexTimestamp++;
165938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pH264Dec->hMFCH264Handle.indexTimestamp %= MAX_TIMESTAMP;
166038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
166138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* queue work for input buffer */
166238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
166394d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
166494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                                    (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
166538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (codecReturn != VIDEO_ERROR_NONE) {
166638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
166738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
166838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
166938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
167038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        H264CodecStart(pOMXComponent, INPUT_PORT_INDEX);
167138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pH264Dec->bSourceStart == OMX_FALSE) {
167238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pH264Dec->bSourceStart = OMX_TRUE;
167338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pH264Dec->hSourceStartEvent);
167438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
167520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
167638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pH264Dec->bDestinationStart == OMX_FALSE) {
167738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pH264Dec->bDestinationStart = OMX_TRUE;
167838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalSet(pH264Dec->hDestinationStartEvent);
167938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SleepMillisec(0);
168038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
168138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
168220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
168338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
168420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
168538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
168638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
168720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
168838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
168938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
169020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
169138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_H264Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
169238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
169338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
169438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
169538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
169638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
169738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
169838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
169938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
170038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
170138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer       *pVideoBuffer;
170220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
170338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
170420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
170538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
170620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
170738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->dataLen       = 0;
170838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->usedDataLen   = 0;
170938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->remainDataLen = 0;
171038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->nFlags    = 0;
171138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSrcOutputData->timeStamp = 0;
171238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
171338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoBuffer == NULL) {
171438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
171538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->allocSize  = 0;
171638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->pPrivate = NULL;
171738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->bufferHeader = NULL;
171820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
171938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
172001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
172138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->allocSize  = pVideoBuffer->planes[0].allocSize;
172238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
172338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
172438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            int i = 0;
1725ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim            while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
172638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
172738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
17283e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim                    ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
172938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    goto EXIT;
173038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
173138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                i++;
173238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
173338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
173438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
173520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
173620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
173738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* For Share Buffer */
173838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
173920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
174020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
174138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
174220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
174338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
174438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
174520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
174638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
174738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
174820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
174938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_H264Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
175038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
175138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
175238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
175338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
175438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
175538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
1756ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
175738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
175838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
175994d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
176038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
1761800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
176238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
176320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
176438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
176538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
176638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
176738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
176838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
176920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1770ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
1771ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
1772ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
1773ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim
177494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
177594d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim                     (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
177694d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim
177738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (codecReturn != VIDEO_ERROR_NONE) {
177838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
17793e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
178038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
178138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
178238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    H264CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
1783800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
178438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
178520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
178638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
178738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
178820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
178938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
179038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
179120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
179238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_H264Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
179338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
179438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
179538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
179638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
179794d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)pVideoDec->hCodecHandle;
179838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
179938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
180038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
180138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
180238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
180338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoBuffer       *pVideoBuffer;
180438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
180538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ExynosVideoGeometry *bufferGeometry;
180638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
180738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_S32 indexTimestamp = 0;
1808ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    int plane;
180920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
181038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
181120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
181238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pH264Dec->bDestinationStart == OMX_FALSE) {
181338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
181438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
181538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
181620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
181738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    while (1) {
181838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
181938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorNone;
182038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
182120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
182238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        displayStatus = pVideoBuffer->displayStatus;
182338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
182438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
182538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
182638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
182738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
182838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
182938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pVideoBuffer != NULL) {
183038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorNone;
183120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                break;
183238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            } else {
183338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorUndefined;
183420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                break;
183520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
183638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
183738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
183820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
183938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone)
184038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
184138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
184238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->hMFCH264Handle.outputIndexTimestamp++;
184338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec->hMFCH264Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
184438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
1845ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
1846ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1847ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
1848ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
1849ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
1850ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim        pDstOutputData->dataLen +=  pVideoBuffer->planes[plane].dataSize;
1851ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim    }
185238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->usedDataLen = 0;
185338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->pPrivate = pVideoBuffer;
185438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* For Share Buffer */
185538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
185638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
185738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
185838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    bufferGeometry = &pH264Dec->hMFCH264Handle.codecOutbufConf;
185938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
186038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
186138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    switch (bufferGeometry->eColorFormat) {
186238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case VIDEO_COLORFORMAT_NV12:
186338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
186438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
186538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case VIDEO_COLORFORMAT_NV12_TILED:
186638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    default:
186738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
186838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
186938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
187038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
187138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
187238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
187338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
187438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
187538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
187638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pH264Dec->hMFCH264Handle.outputIndexTimestamp];
187738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[pH264Dec->hMFCH264Handle.outputIndexTimestamp];
187838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
187938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
188038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = 0x00;
188138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = 0x00;
188220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
188338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
188438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* For timestamp correction. if mfc support frametype detect */
188538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
188638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef NEED_TIMESTAMP_REORDER
188738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
188838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
188938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
189038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pH264Dec->hMFCH264Handle.outputIndexTimestamp = indexTimestamp;
189138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
189238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pH264Dec->hMFCH264Handle.outputIndexTimestamp];
189338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDstOutputData->nFlags = pExynosComponent->nFlags[pH264Dec->hMFCH264Handle.outputIndexTimestamp];
189420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
189538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#else
189638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
189738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
189820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
189938ef2572d26fc760c584a1855a3d002f34eb0231Jiho 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);
190038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
190138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
190238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
190338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
19043e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
190538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->remainDataLen = 0;
190620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
190738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
190820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
190920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
191038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
191138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
191220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
191320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
191420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
191520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
191620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
191720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
191838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_H264Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
191920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
192038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
192138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
192238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE    *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
192338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
192420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
192520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
192620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
192738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
192820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
192920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
193020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
193138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
193220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
193320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
193420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
193520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
193638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_H264Dec_SrcIn(pOMXComponent, pSrcInputData);
193738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
193838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
193938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
194038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
194120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
194220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
194320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
194420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
194520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
194620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
194720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
194820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
194938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_H264Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
1950800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{
195138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
195238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
195338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE    *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
195438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1955800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1956800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    FunctionIn();
1957800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
195838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
195938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
196038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
196138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
1962800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
196338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
196438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
196538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorNone;
196638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
196738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
196838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
196938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pH264Dec->bSourceStart == OMX_FALSE) &&
197038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang       (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
197138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SignalWait(pH264Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
197238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SignalReset(pH264Dec->hSourceStartEvent);
197338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
1974800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
197538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_H264Dec_SrcOut(pOMXComponent, pSrcOutputData);
197638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) {
197738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
197838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
197938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
198038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
1981800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
198238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
198338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
198438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
198538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
198638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
1987800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
198838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_H264Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
198938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
199038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
199138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
199238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE    *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
199338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1994800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
199538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
1996800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
199738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
199838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
1999800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        goto EXIT;
2000800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
200138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
200238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
200338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
200438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
200538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
200638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pH264Dec->bDestinationStart == OMX_FALSE) &&
200738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
200838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalWait(pH264Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
200938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalReset(pH264Dec->hDestinationStartEvent);
201038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
201138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
201238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pH264Dec->hMFCH264Handle.bConfiguredMFCDst == OMX_TRUE) {
201338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_H264Dec_DstIn(pOMXComponent, pDstInputData);
201438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (ret != OMX_ErrorNone) {
201538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
201638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                    pExynosComponent->callbackData,
201738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                    OMX_EventError, ret, 0, NULL);
201838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
201938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
202038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
202138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
202238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
2023800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
202438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
202538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
2026800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
202738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_H264Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
202838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
202938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
203038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
203138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_H264DEC_HANDLE    *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
203238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2033800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
203438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
2035800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
203638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
203738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
2038800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        goto EXIT;
2039800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
204038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
204138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
2042800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        goto EXIT;
2043800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
2044800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
204538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
204638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pH264Dec->bDestinationStart == OMX_FALSE) &&
204738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
204838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalWait(pH264Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
204938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SignalReset(pH264Dec->hDestinationStartEvent);
205038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
205138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
205238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_H264Dec_DstOut(pOMXComponent, pDstOutputData);
205338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) {
205438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
205538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                pExynosComponent->callbackData,
205638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                                OMX_EventError, ret, 0, NULL);
2057800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
2058800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
2059800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangEXIT:
2060800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    FunctionOut();
2061800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
2062800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    return ret;
2063800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang}
2064800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
206538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName)
206620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
20673e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
20683e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
206920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
20703e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_BASEPORT           *pExynosPort      = NULL;
20713e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec        = NULL;
20723e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    EXYNOS_H264DEC_HANDLE         *pH264Dec         = NULL;
20733e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    OMX_BOOL                       bDRMPlayerMode   = OMX_FALSE;
207420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int i = 0;
207520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
207620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
207720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
207820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (componentName == NULL)) {
207920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
208020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
208120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
208220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
208338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H264_DEC, componentName) == 0) {
208438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bDRMPlayerMode = OMX_FALSE;
208538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H264_DRM_DEC, componentName) == 0) {
2086800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        bDRMPlayerMode = OMX_TRUE;
208738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
208820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
208920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
209020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
209120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
209220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
209320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
209420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
209520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
209620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
209720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
209820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
209920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
210020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
210120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
210220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
210320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->componentName == NULL) {
210420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
210520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
210620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
210720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
210820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
210920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
211020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
211120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pH264Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_H264DEC_HANDLE));
211220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pH264Dec == NULL) {
211320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
211420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
211520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
211620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
211720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
211820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pH264Dec, 0, sizeof(EXYNOS_H264DEC_HANDLE));
211920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
212020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pH264Dec;
212120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
212238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (bDRMPlayerMode == OMX_TRUE)
2123800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H264_DRM_DEC);
212420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    else
212520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H264_DEC);
212620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
2127800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoDec->bDRMPlayerMode = bDRMPlayerMode;
212820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
212920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set componentVersion */
213020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
213120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
213220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
213320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
213420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set specVersion */
213520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
213620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
213720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
213820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
213920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
214020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Input port */
214120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
214220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
214320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
214420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
214520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
214620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
214720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
214820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
214920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/avc");
215020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.pNativeRender = 0;
215120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
215220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
215320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
215438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->bufferProcessType = BUFFER_SHARE;
215538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (bDRMPlayerMode == OMX_TRUE)
215638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosPort->bufferProcessType = BUFFER_SHARE;
215738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portWayType = WAY2_PORT;
215820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
215920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Output port */
216020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
216120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
216220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
216320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
216420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
216520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
216620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
216720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
216820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
216920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.pNativeRender = 0;
217020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
217120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
217220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
217338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE;
217438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portWayType = WAY2_PORT;
217520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
217620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for(i = 0; i < ALL_PORT_NUM; i++) {
217720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        INIT_SET_SIZE_VERSION(&pH264Dec->AVCComponent[i], OMX_VIDEO_PARAM_AVCTYPE);
217820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pH264Dec->AVCComponent[i].nPortIndex = i;
217920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pH264Dec->AVCComponent[i].eProfile   = OMX_VIDEO_AVCProfileBaseline;
218020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pH264Dec->AVCComponent[i].eLevel     = OMX_VIDEO_AVCLevel4;
218120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
218220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
2183800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->GetParameter      = &Exynos_H264Dec_GetParameter;
2184800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->SetParameter      = &Exynos_H264Dec_SetParameter;
2185800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->GetConfig         = &Exynos_H264Dec_GetConfig;
2186800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->SetConfig         = &Exynos_H264Dec_SetConfig;
2187800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->GetExtensionIndex = &Exynos_H264Dec_GetExtensionIndex;
2188800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->ComponentRoleEnum = &Exynos_H264Dec_ComponentRoleEnum;
218920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
219020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
219138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_codec_componentInit      = &Exynos_H264Dec_Init;
219238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_codec_componentTerminate = &Exynos_H264Dec_Terminate;
2193800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
219438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_srcInputProcess  = &Exynos_H264Dec_srcInputBufferProcess;
219538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_srcOutputProcess = &Exynos_H264Dec_srcOutputBufferProcess;
219638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_dstInputProcess  = &Exynos_H264Dec_dstInputBufferProcess;
219738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_dstOutputProcess = &Exynos_H264Dec_dstOutputBufferProcess;
219838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
21993e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    pVideoDec->exynos_codec_start            = &H264CodecStart;
22003e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    pVideoDec->exynos_codec_stop             = &H264CodecStop;
220138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_bufferProcessRun = &H264CodecOutputBufferProcessRun;
220238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_enqueueAllBuffer = &H264CodecEnQueueAllBuffer;
220338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
220438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_checkInputFrame                 = &Check_H264_Frame;
220538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
220638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
220738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
220838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
220938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pVideoDec->hSharedMemory == NULL) {
22103e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
221138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pH264Dec);
221238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pH264Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
221338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
221438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
221538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
2216800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
221720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
221820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->currentState = OMX_StateLoaded;
221920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
222020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
222120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
222220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
222320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
222420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
222520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
222620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
222720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
222820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
222920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
223020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
223120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
223220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
223320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec        = NULL;
223420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_H264DEC_HANDLE         *pH264Dec         = NULL;
223520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
223620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
223720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
223820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
223920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
224020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
224120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
224220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
224320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
224420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
224520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
224638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
224738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
224820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pExynosComponent->componentName);
224920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = NULL;
225020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
225138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pH264Dec = (EXYNOS_H264DEC_HANDLE *)pVideoDec->hCodecHandle;
225220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pH264Dec != NULL) {
225320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pH264Dec);
225438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pH264Dec = pVideoDec->hCodecHandle = NULL;
225520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
225620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
225720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
225820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
225920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
226020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
226120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
226220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
226320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
226420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
226520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
226620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
226720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
226820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
2269