Exynos_OMX_Mpeg4enc.c revision 800a8d754f6251b19a56b1aebde0e239c0e5f3cd
120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/*
220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *
320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Copyright 2010 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_Mpeg4enc.c
2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief
2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author      Yunji Kim (yunji.kim@samsung.com)
2220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @version     1.1.0
2320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history
2420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *   2010.7.15 : 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_Venc.h"
3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Semaphore.h"
3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Thread.h"
3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_ETC.h"
3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Android.h"
3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "library_register.h"
4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Mpeg4enc.h"
41800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include "ExynosVideoApi.h"
42800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include "csc.h"
4320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef  EXYNOS_LOG_TAG
4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG    "EXYNOS_MPEG4_ENC"
4620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF
4720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h"
4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MPEG4 Encoder Supported Levels & profiles */
5120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXYNOS_OMX_VIDEO_PROFILELEVEL supportedMPEG4ProfileLevels[] ={
5220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0},
5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0b},
5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1},
5520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level2},
5620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3},
5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4},
5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4a},
5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5},
6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0},
6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0b},
6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level1},
6320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level2},
6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level3},
6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4},
6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4a},
6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level5}};
6820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* H.263 Encoder Supported Levels & profiles */
7020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXYNOS_OMX_VIDEO_PROFILELEVEL supportedH263ProfileLevels[] = {
7120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level10},
7220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level20},
7320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level30},
7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level40},
7520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level45},
7620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level50},
7720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level60},
7820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level70}};
7920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
80800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic OMX_U32 OMXMpeg4ProfileToMFCProfile(OMX_VIDEO_MPEG4PROFILETYPE profile)
8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32 ret;
8320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
8420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (profile) {
8520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_VIDEO_MPEG4ProfileSimple:
8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = 0;
8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_VIDEO_MPEG4ProfileAdvancedSimple:
8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = 1;
9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
9120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = 0;
9320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    };
9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
9620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
97800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
98800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic OMX_U32 OMXMpeg4LevelToMFCLevel(OMX_VIDEO_MPEG4LEVELTYPE level)
9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32 ret;
10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (level) {
10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_VIDEO_MPEG4Level0:
10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = 0;
10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_VIDEO_MPEG4Level0b:
107800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = 1;
10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_VIDEO_MPEG4Level1:
110800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = 2;
11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_VIDEO_MPEG4Level2:
113800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = 3;
11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_VIDEO_MPEG4Level3:
116800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = 4;
11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_VIDEO_MPEG4Level4:
11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_VIDEO_MPEG4Level4a:
120800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = 6;
12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_VIDEO_MPEG4Level5:
123800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = 7;
12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
12520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = 0;
12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    };
12820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
13020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
132800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic void Print_Mpeg4Enc_Param(ExynosVideoEncParam *pEncParam)
13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
134800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncCommonParam *pCommonParam = &pEncParam->commonParam;
135800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncMpeg4Param  *pMpeg4Param  = &pEncParam->codecParam.mpeg4;
136800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
137800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* common parameters */
138800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceWidth             : %d", pCommonParam->SourceWidth);
139800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceHeight            : %d", pCommonParam->SourceHeight);
140800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "IDRPeriod               : %d", pCommonParam->IDRPeriod);
141800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceMode               : %d", pCommonParam->SliceMode);
142800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "RandomIntraMBRefresh    : %d", pCommonParam->RandomIntraMBRefresh);
143800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Bitrate                 : %d", pCommonParam->Bitrate);
144800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp                 : %d", pCommonParam->FrameQp);
145800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_P               : %d", pCommonParam->FrameQp_P);
146800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMax               : %d", pCommonParam->QSCodeMax);
147800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMin               : %d", pCommonParam->QSCodeMin);
148800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PadControlOn            : %d", pCommonParam->PadControlOn);
149800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LumaPadVal              : %d", pCommonParam->LumaPadVal);
150800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CbPadVal                : %d", pCommonParam->CbPadVal);
151800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CrPadVal                : %d", pCommonParam->CrPadVal);
152800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameMap                : %d", pCommonParam->FrameMap);
153800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
154800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* Mpeg4 specific parameters */
155800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "ProfileIDC              : %d", pMpeg4Param->ProfileIDC);
156800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LevelIDC                : %d", pMpeg4Param->LevelIDC);
157800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_B               : %d", pMpeg4Param->FrameQp_B);
158800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "TimeIncreamentRes       : %d", pMpeg4Param->TimeIncreamentRes);
159800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "VopTimeIncreament       : %d", pMpeg4Param->VopTimeIncreament);
160800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceArgument           : %d", pMpeg4Param->SliceArgument);
161800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NumberBFrames           : %d", pMpeg4Param->NumberBFrames);
162800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "DisableQpelME           : %d", pMpeg4Param->DisableQpelME);
163800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
164800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* rate control related parameters */
165800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableFRMRateControl    : %d", pCommonParam->EnableFRMRateControl);
166800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableMBRateControl     : %d", pCommonParam->EnableMBRateControl);
167800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CBRPeriodRf             : %d", pCommonParam->CBRPeriodRf);
16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
170800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic void Print_H263Enc_Param(ExynosVideoEncParam *pEncParam)
17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
172800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncCommonParam *pCommonParam = &pEncParam->commonParam;
173800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncH263Param   *pH263Param   = &pEncParam->codecParam.h263;
174800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
175800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* common parameters */
176800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceWidth             : %d", pCommonParam->SourceWidth);
177800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceHeight            : %d", pCommonParam->SourceHeight);
178800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "IDRPeriod               : %d", pCommonParam->IDRPeriod);
179800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceMode               : %d", pCommonParam->SliceMode);
180800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "RandomIntraMBRefresh    : %d", pCommonParam->RandomIntraMBRefresh);
181800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Bitrate                 : %d", pCommonParam->Bitrate);
182800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp                 : %d", pCommonParam->FrameQp);
183800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_P               : %d", pCommonParam->FrameQp_P);
184800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMax               : %d", pCommonParam->QSCodeMax);
185800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMin               : %d", pCommonParam->QSCodeMin);
186800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PadControlOn            : %d", pCommonParam->PadControlOn);
187800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LumaPadVal              : %d", pCommonParam->LumaPadVal);
188800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CbPadVal                : %d", pCommonParam->CbPadVal);
189800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CrPadVal                : %d", pCommonParam->CrPadVal);
190800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameMap                : %d", pCommonParam->FrameMap);
191800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
192800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* H263 specific parameters */
193800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameRate               : %d", pH263Param->FrameRate);
194800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
195800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* rate control related parameters */
196800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableFRMRateControl    : %d", pCommonParam->EnableFRMRateControl);
197800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableMBRateControl     : %d", pCommonParam->EnableMBRateControl);
198800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CBRPeriodRf             : %d", pCommonParam->CBRPeriodRf);
19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
201800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic void Set_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
20220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
203800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
205800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
206800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = NULL;
207800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
208800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncParam       *pEncParam    = NULL;
209800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncCommonParam *pCommonParam = NULL;
210800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncMpeg4Param  *pMpeg4Param  = NULL;
21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
213800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Enc = pVideoEnc->hCodecHandle;
214800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
21620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
217800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pEncParam    = &pVideoEnc->encParam;
218800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam = &pEncParam->commonParam;
219800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Param  = &pEncParam->codecParam.mpeg4;
220800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pEncParam->eCompressionFormat = VIDEO_CODING_MPEG4;
221800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "eCompressionFormat: %d", pEncParam->eCompressionFormat);
222800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
223800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* common parameters */
224800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->SourceWidth  = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
225800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
226800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->IDRPeriod    = pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1;
227800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->SliceMode    = 0;
228800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->RandomIntraMBRefresh = 0;
229800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->Bitrate      = pExynosOutputPort->portDefinition.format.video.nBitrate;
230800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->FrameQp      = pVideoEnc->quantization.nQpI;
231800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->FrameQp_P    = pVideoEnc->quantization.nQpP;
232800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->QSCodeMax    = 30;
233800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->QSCodeMin    = 10;
234800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->PadControlOn = 0; /* 0: Use boundary pixel, 1: Use the below setting value */
235800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->LumaPadVal   = 0;
236800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->CbPadVal     = 0;
237800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->CrPadVal     = 0;
238800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
239800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) {
240800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    case OMX_SEC_COLOR_FormatNV12LPhysicalAddress:
241800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    case OMX_SEC_COLOR_FormatNV12LVirtualAddress:
242800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    case OMX_COLOR_FormatYUV420SemiPlanar:
243800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    case OMX_COLOR_FormatYUV420Planar:
244800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#ifdef USE_METADATABUFFERTYPE
245800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    case OMX_COLOR_FormatAndroidOpaque:
246800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#endif
247800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
248800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        break;
249800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    case OMX_SEC_COLOR_FormatNV12TPhysicalAddress:
250800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    case OMX_SEC_COLOR_FormatNV12Tiled:
251800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
252800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        break;
253800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    case OMX_SEC_COLOR_FormatNV21LPhysicalAddress:
254800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    case OMX_SEC_COLOR_FormatNV21Linear:
255800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
256800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        break;
257800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    default:
258800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
259800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        break;
260800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
261800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
262800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* Mpeg4 specific parameters */
263800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Param->ProfileIDC = OMXMpeg4ProfileToMFCProfile(pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].eProfile);
264800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Param->LevelIDC   = OMXMpeg4LevelToMFCLevel(pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].eLevel);
265800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Param->FrameQp_B  = pVideoEnc->quantization.nQpB;
266800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Param->TimeIncreamentRes = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
267800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Param->VopTimeIncreament = 1;
268800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Param->SliceArgument = 0; /* MB number or byte number */
269800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Param->NumberBFrames = 0; /* 0(not used) ~ 2 */
270800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Param->DisableQpelME = 1;
27120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
27220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]: 0x%x", pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]);
273800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* rate control related parameters */
27420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]) {
27520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_Video_ControlRateVariable:
27620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode VBR");
277800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->EnableFRMRateControl = 0; /* 0: Disable, 1: Frame level RC */
278800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->EnableMBRateControl  = 0; /* 0: Disable, 1:MB level RC */
279800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->CBRPeriodRf          = 100;
28020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
28120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_Video_ControlRateConstant:
28220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode CBR");
283800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */
284800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->EnableMBRateControl  = 1; /* 0: Disable, 1:MB level RC */
285800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->CBRPeriodRf          = 10;
28620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
28720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_Video_ControlRateDisable:
288800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    default: /*Android default */
28920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode VBR");
290800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->EnableFRMRateControl = 0;
291800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->EnableMBRateControl  = 0;
292800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->CBRPeriodRf          = 100;
29320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
29420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
29520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
296800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Print_Mpeg4Enc_Param(pEncParam);
297800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang}
298800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
299800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic void Set_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
300800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{
301800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
302800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
303800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
304800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = NULL;
305800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
306800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncParam       *pEncParam    = NULL;
307800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncCommonParam *pCommonParam = NULL;
308800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncH263Param   *pH263Param   = NULL;
309800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
310800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
311800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Enc = pVideoEnc->hCodecHandle;
312800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
313800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
314800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
315800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pEncParam    = &pVideoEnc->encParam;
316800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam = &pEncParam->commonParam;
317800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pH263Param   = &pEncParam->codecParam.h263;
318800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pEncParam->eCompressionFormat = VIDEO_CODING_H263;
319800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "eCompressionFormat: %d", pEncParam->eCompressionFormat);
320800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
321800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* common parameters */
322800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->SourceWidth  = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
323800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
324800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->IDRPeriod    = pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1;
325800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->SliceMode    = 0;
326800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->RandomIntraMBRefresh = 0;
327800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->Bitrate      = pExynosOutputPort->portDefinition.format.video.nBitrate;
328800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->FrameQp      = pVideoEnc->quantization.nQpI;
329800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->FrameQp_P    = pVideoEnc->quantization.nQpP;
330800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->QSCodeMax    = 30;
331800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->QSCodeMin    = 10;
332800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->PadControlOn = 0; /* 0: Use boundary pixel, 1: Use the below setting value */
333800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->LumaPadVal   = 0;
334800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->CbPadVal     = 0;
335800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam->CrPadVal     = 0;
336800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
33720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) {
33820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_SEC_COLOR_FormatNV12LPhysicalAddress:
33920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_SEC_COLOR_FormatNV12LVirtualAddress:
34020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_COLOR_FormatYUV420SemiPlanar:
34120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_COLOR_FormatYUV420Planar:
342800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#ifdef USE_METADATABUFFERTYPE
34320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_COLOR_FormatAndroidOpaque:
34420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
345800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
34620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
34720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_SEC_COLOR_FormatNV12TPhysicalAddress:
34820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_SEC_COLOR_FormatNV12Tiled:
349800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
35020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
35120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_SEC_COLOR_FormatNV21LPhysicalAddress:
35220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_SEC_COLOR_FormatNV21Linear:
353800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
35420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
35520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
356800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
357800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        break;
358800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
359800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
360800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* H263 specific parameters */
361800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pH263Param->FrameRate            = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
362800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
363800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]: 0x%x", pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]);
364800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* rate control related parameters */
365800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    switch (pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]) {
366800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    case OMX_Video_ControlRateVariable:
367800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode VBR");
368800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->EnableFRMRateControl = 0; /* 0: Disable, 1: Frame level RC */
369800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->EnableMBRateControl  = 0; /* 0: Disable, 1:MB level RC */
370800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->CBRPeriodRf          = 100;
371800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        break;
372800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    case OMX_Video_ControlRateConstant:
373800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode CBR");
374800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */
375800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->EnableMBRateControl  = 1; /* 0: Disable, 1:MB level RC */
376800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->CBRPeriodRf          = 10;
377800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        break;
378800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    case OMX_Video_ControlRateDisable:
379800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    default: /*Android default */
380800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode VBR");
381800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->EnableFRMRateControl = 0;
382800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->EnableMBRateControl  = 0;
383800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pCommonParam->CBRPeriodRf          = 100;
38420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
38520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
38620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
387800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Print_H263Enc_Param(pEncParam);
38820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
38920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
390800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic void Change_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
39120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
392800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
39320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
394800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
395800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = NULL;
396800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
397800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncOps         *pEncOps      = NULL;
398800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncParam       *pEncParam    = NULL;
399800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncCommonParam *pCommonParam = NULL;
400800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncMpeg4Param  *pMpeg4Param  = NULL;
401800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
402800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    int setParam = 0;
40320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
40420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
405800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Enc = pVideoEnc->hCodecHandle;
406800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
40720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
408800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pEncOps = pVideoEnc->pEncOps;
409800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
410800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pEncParam    = &pVideoEnc->encParam;
411800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam = &pEncParam->commonParam;
412800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Param  = &pEncParam->codecParam.mpeg4;
41320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
41420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pVideoEnc->IntraRefreshVOP == OMX_TRUE) {
415800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        setParam = VIDEO_FRAME_I;
416800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pEncOps->Set_FrameType(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
41720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVideoEnc->IntraRefreshVOP = OMX_FALSE;
41820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
419800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pCommonParam->IDRPeriod != (int)pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1) {
420800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        setParam = pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1;
421800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pEncOps->Set_IDRPeriod(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
42220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
423800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pCommonParam->Bitrate != (int)pExynosOutputPort->portDefinition.format.video.nBitrate) {
424800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        setParam = pExynosOutputPort->portDefinition.format.video.nBitrate;
425800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pEncOps->Set_BitRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
42620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
42720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pMpeg4Param->TimeIncreamentRes != (int)((pExynosOutputPort->portDefinition.format.video.xFramerate) >> 16)) {
428800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        setParam = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
429800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pEncOps->Set_FrameRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
43020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
43120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
432800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Set_Mpeg4Enc_Param(pExynosComponent);
43320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
43420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
435800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic void Change_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
43620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
437800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
43820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
439800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
440800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = NULL;
44120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
442800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncOps         *pEncOps      = NULL;
443800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncParam       *pEncParam    = NULL;
444800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncCommonParam *pCommonParam = NULL;
445800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncH263Param   *pH263Param   = NULL;
44620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
447800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    int setParam = 0;
44820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
44920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
450800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Enc = pVideoEnc->hCodecHandle;
451800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
45220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
453800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pEncOps = pVideoEnc->pEncOps;
454800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
455800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pEncParam    = &pVideoEnc->encParam;
456800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pCommonParam = &pEncParam->commonParam;
457800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pH263Param   = &pEncParam->codecParam.h263;
45820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
45920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pVideoEnc->IntraRefreshVOP == OMX_TRUE) {
460800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        setParam = VIDEO_FRAME_I;
461800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pEncOps->Set_FrameType(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
46220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVideoEnc->IntraRefreshVOP = OMX_FALSE;
46320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
464800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pCommonParam->IDRPeriod != (int)pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1) {
465800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        setParam = pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1;
466800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pEncOps->Set_IDRPeriod(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
46720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
468800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pCommonParam->Bitrate != (int)pExynosOutputPort->portDefinition.format.video.nBitrate) {
469800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        setParam = pExynosOutputPort->portDefinition.format.video.nBitrate;
470800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pEncOps->Set_BitRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
47120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
47220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pH263Param->FrameRate != (int)((pExynosOutputPort->portDefinition.format.video.xFramerate) >> 16)) {
473800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        setParam = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
474800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pEncOps->Set_FrameRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
47520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
47620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
477800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Set_H263Enc_Param(pExynosComponent);
47820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
47920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
480800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_GetParameter(
48120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN    OMX_HANDLETYPE hComponent,
48220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN    OMX_INDEXTYPE  nParamIndex,
48320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_PTR        pComponentParameterStructure)
48420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
485800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
486800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
48720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
48820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
48920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
49020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
49120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
49220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
49320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
49420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
49520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
49620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
49720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
49820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
49920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
50020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
50120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
50220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
50320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
50420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
50520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
50620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
50720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
50820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
50920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
51020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
51120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nParamIndex) {
51220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoMpeg4:
51320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
514800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Component = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
515800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Component = NULL;
51620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = NULL;
51720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
518800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
51920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
52020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
52120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
52220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
523800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pDstMpeg4Component->nPortIndex >= ALL_PORT_NUM) {
52420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
52520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
52620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
52720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
52820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
529800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pSrcMpeg4Component = &pMpeg4Enc->mpeg4Component[pDstMpeg4Component->nPortIndex];
53020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
531800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Memcpy(pDstMpeg4Component, pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
53220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
53320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
53420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoH263:
53520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
536800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        OMX_VIDEO_PARAM_H263TYPE  *pDstH263Component = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
537800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        OMX_VIDEO_PARAM_H263TYPE  *pSrcH263Component = NULL;
53820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = NULL;
53920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
540800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
54120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
54220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
54320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
54420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
545800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pDstH263Component->nPortIndex >= ALL_PORT_NUM) {
54620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
54720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
54820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
54920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
55020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
551800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pSrcH263Component = &pMpeg4Enc->h263Component[pDstH263Component->nPortIndex];
55220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
553800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Memcpy(pDstH263Component, pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
55420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
55520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
55620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
55720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
55820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_S32 codecType;
55920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
56020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
56120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
56220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
56320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
56420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
56520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
56620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
56720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (codecType == CODEC_TYPE_MPEG4)
56820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE);
56920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
57020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE);
57120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
57220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
57320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoProfileLevelQuerySupported:
57420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
57520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
57620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_OMX_VIDEO_PROFILELEVEL    *pProfileLevel = NULL;
57720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32                           maxProfileLevelNum = 0;
57820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_S32                           codecType;
57920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
58020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
58120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
58220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
58320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
58420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
58520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
58620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
58720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
58820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
58920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
59020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
59120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (codecType == CODEC_TYPE_MPEG4) {
59220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pProfileLevel = supportedMPEG4ProfileLevels;
59320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            maxProfileLevelNum = sizeof(supportedMPEG4ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
59420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
59520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pProfileLevel = supportedH263ProfileLevels;
59620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            maxProfileLevelNum = sizeof(supportedH263ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
59720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
59820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
59920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) {
60020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNoMore;
60120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
60220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
60320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
60420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pProfileLevel += pDstProfileLevel->nProfileIndex;
60520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstProfileLevel->eProfile = pProfileLevel->profile;
60620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstProfileLevel->eLevel = pProfileLevel->level;
60720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
60820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
60920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoProfileLevelCurrent:
61020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
61120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
612800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        OMX_VIDEO_PARAM_MPEG4TYPE        *pSrcMpeg4Component = NULL;
613800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        OMX_VIDEO_PARAM_H263TYPE         *pSrcH263Component = NULL;
61420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_MPEG4ENC_HANDLE           *pMpeg4Enc = NULL;
61520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_S32                           codecType;
61620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
61720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
61820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
61920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
62020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
62120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
62220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
62320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
62420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
62520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
62620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
62720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
62820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        codecType = pMpeg4Enc->hMFCMpeg4Handle.codecType;
62920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (codecType == CODEC_TYPE_MPEG4) {
630800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pSrcMpeg4Component = &pMpeg4Enc->mpeg4Component[pDstProfileLevel->nPortIndex];
631800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pDstProfileLevel->eProfile = pSrcMpeg4Component->eProfile;
632800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pDstProfileLevel->eLevel = pSrcMpeg4Component->eLevel;
63320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
634800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pSrcH263Component = &pMpeg4Enc->h263Component[pDstProfileLevel->nPortIndex];
635800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pDstProfileLevel->eProfile = pSrcH263Component->eProfile;
636800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pDstProfileLevel->eLevel = pSrcH263Component->eLevel;
63720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
63820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
63920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
64020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoErrorCorrection:
64120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
64220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
64320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
64420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_MPEG4ENC_HANDLE              *pMpeg4Enc = NULL;
64520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
64620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
64720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
64820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
64920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
65020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
65120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) {
65220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
65320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
65420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
65520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
65620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
65720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcErrorCorrectionType = &pMpeg4Enc->errorCorrectionType[OUTPUT_PORT_INDEX];
65820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
65920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
66020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
66120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
66220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
66320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
66420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
66520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
66620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
66720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoEncodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
66820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
66920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
67020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
67120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
67220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
67320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
67420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
67520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
676800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_SetParameter(
67720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
67820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
67920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentParameterStructure)
68020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
681800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
682800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
68320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
68420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
68520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
68620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
68720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
68820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
68920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
69020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
69120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
69220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
69320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
69420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
69520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
69620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
69720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
69820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
69920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
70020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
70120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
70220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
70320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
70420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
70520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
70620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
70720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
70820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoMpeg4:
70920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
710800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Component = NULL;
711800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Component = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
71220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = NULL;
71320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
714800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
71520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
71620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
71720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
71820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
719800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pSrcMpeg4Component->nPortIndex >= ALL_PORT_NUM) {
72020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
72120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
72220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
72320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
72420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
725800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pDstMpeg4Component = &pMpeg4Enc->mpeg4Component[pSrcMpeg4Component->nPortIndex];
72620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
727800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Memcpy(pDstMpeg4Component, pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
72820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
72920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
73020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoH263:
73120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
732800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        OMX_VIDEO_PARAM_H263TYPE *pDstH263Component = NULL;
733800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        OMX_VIDEO_PARAM_H263TYPE *pSrcH263Component = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
73420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_MPEG4ENC_HANDLE   *pMpeg4Enc = NULL;
73520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
736800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
73720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
73820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
73920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
74020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
741800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pSrcH263Component->nPortIndex >= ALL_PORT_NUM) {
74220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
74320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
74420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
74520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
74620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
747800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pDstH263Component = &pMpeg4Enc->h263Component[pSrcH263Component->nPortIndex];
74820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
749800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Memcpy(pDstH263Component, pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
75020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
75120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
75220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
75320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
75420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
75520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
75620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
75720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
75820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
75920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
76020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
76120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
76220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateOperation;
76320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
76420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
76520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
76620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE)) {
76720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
76820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_MPEG4;
76920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE)) {
77020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
77120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_H263;
77220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
77320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadParameter;
77420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
77520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
77620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
77720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
77820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoProfileLevelCurrent:
77920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
78020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
781800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        OMX_VIDEO_PARAM_MPEG4TYPE        *pDstMpeg4Component = NULL;
782800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        OMX_VIDEO_PARAM_H263TYPE         *pDstH263Component = NULL;
78320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_MPEG4ENC_HANDLE           *pMpeg4Enc = NULL;
78420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_S32                           codecType;
78520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
78620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
78720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
78820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
78920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
79020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
79120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
79220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
79320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
79420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
79520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
79620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
79720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        codecType = pMpeg4Enc->hMFCMpeg4Handle.codecType;
79820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (codecType == CODEC_TYPE_MPEG4) {
79920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /*
80020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang             * To do: Check validity of profile & level parameters
80120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang             */
80220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
803800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pDstMpeg4Component = &pMpeg4Enc->mpeg4Component[pSrcProfileLevel->nPortIndex];
804800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pDstMpeg4Component->eProfile = pSrcProfileLevel->eProfile;
805800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pDstMpeg4Component->eLevel = pSrcProfileLevel->eLevel;
80620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
80720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /*
80820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang             * To do: Check validity of profile & level parameters
80920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang             */
81020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
811800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pDstH263Component = &pMpeg4Enc->h263Component[pSrcProfileLevel->nPortIndex];
812800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pDstH263Component->eProfile = pSrcProfileLevel->eProfile;
813800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pDstH263Component->eLevel = pSrcProfileLevel->eLevel;
81420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
81520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
81620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
81720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoErrorCorrection:
81820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
81920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
82020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
821800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        EXYNOS_MPEG4ENC_HANDLE              *pMpeg4Enc = NULL;
82220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
82320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
82420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
82520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
82620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
82720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
82820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) {
82920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
83020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
83120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
83220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
83320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
83420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType = &pMpeg4Enc->errorCorrectionType[OUTPUT_PORT_INDEX];
83520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
83620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
83720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
83820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
83920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
84020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
84120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
84220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
84320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
84420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoEncodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
84520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
84620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
84720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
84820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
84920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
85020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
85120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
85220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
853800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_GetConfig(
85420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
85520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
85620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentConfigStructure)
85720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
858800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
859800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
86020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
86120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
86220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
86320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
86420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentConfigStructure == NULL) {
86520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
86620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
86720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
86820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
86920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
87020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
87120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
87220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
87320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
87420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
87520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
87620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
87720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
87820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
87920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
88020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
88120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
88220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
88320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
88420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
88520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
88620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoEncodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
88720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
88820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
88920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
89020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
89120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
89220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
89320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
89420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
89520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
896800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_SetConfig(
89720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
89820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
89920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentConfigStructure)
90020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
901800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
902800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
90320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
904800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = NULL;
905800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc        = NULL;
90620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
90720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
90820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
90920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentConfigStructure == NULL) {
91020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
91120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
91220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
91320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
91420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
91520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
91620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
91720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
91820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
91920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
92020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
92120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
92220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
92320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
92420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
92520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
92620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
92720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
92820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
929800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
930800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
93120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
93220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
93320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexConfigVideoIntraPeriod:
93420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
93520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32 nPFrames = (*((OMX_U32 *)pComponentConfigStructure)) - 1;
93620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
93720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
93820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames = nPFrames;
93920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
94020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames = nPFrames;
94120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
94220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
94320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
94420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
94520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
94620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoEncodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
94720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
94820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
94920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
95020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
95120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret == OMX_ErrorNone)
95220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVideoEnc->configChange = OMX_TRUE;
95320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
95420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
95520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
95620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
95720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
95820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
959800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_GetExtensionIndex(
960800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_IN  OMX_HANDLETYPE  hComponent,
961800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_IN  OMX_STRING      cParameterName,
962800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_OUT OMX_INDEXTYPE  *pIndexType)
96320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
964800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
965800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
96620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
96720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
96820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
96920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
97020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
97120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
97220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
97320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
97420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
97520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
97620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
97720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
97820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
97920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
98020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
98120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
98220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
98320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
98420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
98520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
98620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((cParameterName == NULL) || (pIndexType == NULL)) {
98720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
98820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
98920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
99020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
99120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
99220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
99320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
99420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_CONFIG_VIDEO_INTRAPERIOD) == 0) {
99520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        *pIndexType = OMX_IndexConfigVideoIntraPeriod;
99620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
99720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
99820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_VideoEncodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
99920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
1000800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
100120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
100220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
100320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
100420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
100520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
100620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1007800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_ComponentRoleEnum(
100820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_HANDLETYPE hComponent,
100920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_U8        *cRole,
101020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_U32        nIndex)
101120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
1012800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE               ret              = OMX_ErrorNone;
1013800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_COMPONENTTYPE          *pOMXComponent    = NULL;
101420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
101520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32                     codecType;
101620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
101720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
101820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
101920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (cRole == NULL)) {
102020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
102120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
102220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
1023800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (nIndex != (MAX_COMPONENT_ROLE_NUM - 1)) { /* supports only one role */
102420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNoMore;
102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
102620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
102720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
102820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
102920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
103020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
103120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
103220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
103320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
103420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
103520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
103620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
103720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
103820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
103920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
104020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
104120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
104220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
104320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
104420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (codecType == CODEC_TYPE_MPEG4)
104520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE);
104620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    else
104720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE);
104820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
104920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
105020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
105120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
105220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
105320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
105420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1055800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic OMX_ERRORTYPE Exynos_Mpeg4Enc_EncodeThread(OMX_HANDLETYPE hComponent)
105620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
1057800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
1058800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_COMPONENTTYPE             *pOMXComponent    = (OMX_COMPONENTTYPE *)hComponent;
105920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1060800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1061800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc        = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
1062800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncOps             *pEncOps          = pVideoEnc->pEncOps;
1063800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncBufferOps       *pInbufOps        = pVideoEnc->pInbufOps;
1064800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncBufferOps       *pOutbufOps       = pVideoEnc->pOutbufOps;
106520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
106620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
106720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
106820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
106920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
107020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
107120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
107220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    while (pVideoEnc->NBEncThread.bExitEncodeThread == OMX_FALSE) {
107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreWait(pVideoEnc->NBEncThread.hEncFrameStart);
107520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
107620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pVideoEnc->NBEncThread.bExitEncodeThread == OMX_FALSE) {
1077800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            if (pVideoEnc->NBEncThread.oneFrameSize > 0) {
1078800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                if (pVideoEnc->bInputRun == OMX_FALSE) {
1079800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                    if (pInbufOps->Run(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle) != VIDEO_ERROR_NONE) {
1080800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer");
1081800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                        ret = OMX_ErrorInsufficientResources;
1082800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                        goto EXIT;
1083800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                    }
1084800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1085800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                    pVideoEnc->bInputRun = OMX_TRUE;
1086800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                }
1087800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1088800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                pVideoEnc->pOutbuf = pOutbufOps->Dequeue(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle);
1089800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                pInbufOps->Dequeue(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle);
1090800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            }
1091800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1092800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pMpeg4Enc->hMFCMpeg4Handle.returnCodec = VIDEO_TRUE;
109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_SemaphorePost(pVideoEnc->NBEncThread.hEncFrameEnd);
109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
109520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_ThreadExit(NULL);
110020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
110120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
110420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Init */
1105800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
1107800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1109800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1110800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc        = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1112800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncOps             *pEncOps          = NULL;
1113800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncBufferOps       *pInbufOps        = NULL;
1114800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncBufferOps       *pOutbufOps       = NULL;
1115800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1116800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_HANDLETYPE                 hMFCHandle       = NULL;
1117800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_S32                        returnCodec      = 0;
1118800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    int i;
1119800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1120800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncParam encParam;
1121800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoBuffer   bufferInfo;
1122800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoGeometry bufferConf;
1123800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1124800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    CSC_METHOD csc_method = CSC_METHOD_SW;
112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFC = OMX_FALSE;
112920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->bUseFlagEOF = OMX_FALSE;
113020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1132800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* alloc ops structure */
1133800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pEncOps    = (ExynosVideoEncOps *)Exynos_OSAL_Malloc(sizeof(*pEncOps));
1134800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pInbufOps  = (ExynosVideoEncBufferOps *)Exynos_OSAL_Malloc(sizeof(*pInbufOps));
1135800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOutbufOps = (ExynosVideoEncBufferOps *)Exynos_OSAL_Malloc(sizeof(*pOutbufOps));
1136800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if ((pEncOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
1137800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate encoder ops buffer");
1138800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = OMX_ErrorInsufficientResources;
1139800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1140800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pEncOps)
1141800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Free(pEncOps);
1142800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1143800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pInbufOps)
1144800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Free(pInbufOps);
1145800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1146800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pOutbufOps)
1147800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Free(pOutbufOps);
1148800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1149800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        goto EXIT;
115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1152800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoEnc->pEncOps = pEncOps;
1153800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoEnc->pInbufOps = pInbufOps;
1154800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoEnc->pOutbufOps = pOutbufOps;
1155800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1156800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* function pointer mapping */
1157800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pEncOps->nSize = sizeof(*pEncOps);
1158800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pInbufOps->nSize = sizeof(*pInbufOps);
1159800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOutbufOps->nSize = sizeof(*pOutbufOps);
1160800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1161800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_Video_Register_Encoder(pEncOps, pInbufOps, pOutbufOps);
1162800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1163800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* check mandatory functions for encoder ops */
1164800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if ((pEncOps->Init == NULL) || (pEncOps->Finalize == NULL) ||
1165800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        (pEncOps->Set_FrameTag == NULL) || (pEncOps->Get_FrameTag == NULL)) {
1166800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
116720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
116820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
116920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
117020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1171800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* check mandatory functions for buffer ops */
1172800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
1173800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
1174800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
1175800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
1176800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
1177800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
117820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
117920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
118020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
118120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1182800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* alloc context, open, querycap */
1183800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle = pVideoEnc->pEncOps->Init();
1184800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle == NULL) {
1185800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
118620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
118720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
118820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
1189800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1190800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
1191800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Set_Mpeg4Enc_Param(pExynosComponent);
1192800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    else
1193800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Set_H263Enc_Param(pExynosComponent);
1194800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1195800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    encParam = pVideoEnc->encParam;
1196800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pEncOps->Set_EncParam) {
1197800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if(pEncOps->Set_EncParam(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, &encParam) != VIDEO_ERROR_NONE) {
1198800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
1199800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            ret = OMX_ErrorInsufficientResources;
1200800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            goto EXIT;
1201800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        }
1202800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1203800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1204800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* set input buffer shareable */
1205800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if(pExynosInputPort->portDefinition.format.video.eColorFormat == OMX_SEC_COLOR_FormatNV12LVirtualAddress) {
1206800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pInbufOps->Set_Shareable) {
1207800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            if (pInbufOps->Set_Shareable(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle) != VIDEO_ERROR_NONE) {
1208800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set input buffer shareable");
1209800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                ret = OMX_ErrorInsufficientResources;
1210800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                goto EXIT;
1211800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            }
1212800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        }
1213800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1214800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1215800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
1216800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1217800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* input buffer info: only 3 config values needed */
1218800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    bufferConf.nFrameWidth  = pExynosInputPort->portDefinition.format.video.nFrameWidth;
1219800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    bufferConf.nFrameHeight = pExynosInputPort->portDefinition.format.video.nFrameHeight;
1220800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    bufferConf.eColorFormat = pVideoEnc->encParam.commonParam.FrameMap;
1221800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1222800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* set input buffer geometry */
1223800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pInbufOps->Set_Geometry) {
1224800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pInbufOps->Set_Geometry(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
1225800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
1226800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            ret = OMX_ErrorInsufficientResources;
1227800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            goto EXIT;
1228800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        }
1229800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1230800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1231800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* cacheable for input */
1232800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pInbufOps->Enable_Cacheable) {
1233800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pInbufOps->Enable_Cacheable(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle) != VIDEO_ERROR_NONE)
1234800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Failed to enable cacheable property for input buffer");
1235800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1236800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1237800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* setup input buffer */
1238800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pInbufOps->Setup(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, MFC_INPUT_BUFFER_NUM_MAX) != VIDEO_ERROR_NONE) {
1239800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
124020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
124120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
124220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
124320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1244800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1245800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang         pInbufOps->Get_BufferInfo(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, i, &bufferInfo);
1246800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1247800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang         pVideoEnc->MFCEncInputBuffer[i].YPhyAddr = NULL;
1248800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang         pVideoEnc->MFCEncInputBuffer[i].CPhyAddr = NULL;
1249800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang         pVideoEnc->MFCEncInputBuffer[i].YVirAddr = bufferInfo.planes[0].addr;
1250800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang         pVideoEnc->MFCEncInputBuffer[i].CVirAddr = bufferInfo.planes[1].addr;
1251800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang         pVideoEnc->MFCEncInputBuffer[i].YBufferSize = bufferInfo.planes[0].allocSize;
1252800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang         pVideoEnc->MFCEncInputBuffer[i].CBufferSize = bufferInfo.planes[1].allocSize;
1253800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang         pVideoEnc->MFCEncInputBuffer[i].YDataSize = bufferInfo.planes[0].dataSize;
1254800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang         pVideoEnc->MFCEncInputBuffer[i].CDataSize = bufferInfo.planes[1].dataSize;
1255800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
125620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1257800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoEnc->indexInputBuffer = 0;
125820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoEnc->bFirstFrame = OMX_TRUE;
1259800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoEnc->bInputRun = OMX_FALSE;
126020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoEnc->NBEncThread.bExitEncodeThread = OMX_FALSE;
126220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoEnc->NBEncThread.bEncoderRun = OMX_FALSE;
126320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_SemaphoreCreate(&(pVideoEnc->NBEncThread.hEncFrameStart));
126420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_SemaphoreCreate(&(pVideoEnc->NBEncThread.hEncFrameEnd));
126520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (OMX_ErrorNone == Exynos_OSAL_ThreadCreate(&pVideoEnc->NBEncThread.hNBEncodeThread,
1266800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                                                   Exynos_Mpeg4Enc_EncodeThread,
1267800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                                                   pOMXComponent)) {
1268800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pMpeg4Enc->hMFCMpeg4Handle.returnCodec = VIDEO_TRUE;
126920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
1270800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
127120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
127220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
127320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp = 0;
127420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1275800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoEnc->csc_handle = csc_init(csc_method);
1276800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
127720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
127820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
127920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
128120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
128220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Terminate */
1284800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
128520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
1286800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
128720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1288800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1289800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc        = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
1290800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncOps             *pEncOps          = pVideoEnc->pEncOps;
1291800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncBufferOps       *pInbufOps        = pVideoEnc->pInbufOps;
1292800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncBufferOps       *pOutbufOps       = pVideoEnc->pOutbufOps;
1293800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_HANDLETYPE                 hMFCHandle       = NULL;
129420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
129620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pVideoEnc->NBEncThread.hNBEncodeThread != NULL) {
129820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVideoEnc->NBEncThread.bExitEncodeThread = OMX_TRUE;
129920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphorePost(pVideoEnc->NBEncThread.hEncFrameStart);
130020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_ThreadTerminate(pVideoEnc->NBEncThread.hNBEncodeThread);
130120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVideoEnc->NBEncThread.hNBEncodeThread = NULL;
130220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
130320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
130420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if(pVideoEnc->NBEncThread.hEncFrameEnd != NULL) {
130520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pVideoEnc->NBEncThread.hEncFrameEnd);
130620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVideoEnc->NBEncThread.hEncFrameEnd = NULL;
130720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
130820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
130920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if(pVideoEnc->NBEncThread.hEncFrameStart != NULL) {
131020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pVideoEnc->NBEncThread.hEncFrameStart);
131120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVideoEnc->NBEncThread.hEncFrameStart = NULL;
131220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
131320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
131420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
131520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hMFCHandle != NULL) {
1316800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pInbufOps->Stop(hMFCHandle);
1317800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pOutbufOps->Stop(hMFCHandle);
1318800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pEncOps->Finalize(hMFCHandle);
1319800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1320800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Free(pInbufOps);
1321800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Free(pOutbufOps);
1322800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Free(pEncOps);
1323800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1324800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle = NULL;
1325800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1326800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1327800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pVideoEnc->csc_handle != NULL) {
1328800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        csc_deinit(pVideoEnc->csc_handle);
1329800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pVideoEnc->csc_handle = NULL;
133020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
133120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
133220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
133320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
133420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
133520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
133620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
133720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1338800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic OMX_ERRORTYPE Exynos_Mpeg4Enc_Configure(
1339800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_COMPONENTTYPE *pOMXComponent,
1340800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_DATA   *pInputData,
1341800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_DATA   *pOutputData)
134220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
1343800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
1344800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1345800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1346800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
1347800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1348800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1349800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncOps             *pEncOps           = pVideoEnc->pEncOps;
1350800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncBufferOps       *pInbufOps         = pVideoEnc->pInbufOps;
1351800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncBufferOps       *pOutbufOps        = pVideoEnc->pOutbufOps;
1352800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1353800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_S32 setConfVal = 0;
1354800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoGeometry bufferConf;
1355800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    int i;
1356800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1357800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
1358800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1359800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* set geometry for output (dst) */
1360800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pOutbufOps->Set_Geometry) {
1361800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        /* input buffer info: only 2 config values needed */
1362800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE / 2;
1363800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
1364800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            bufferConf.eCompressionFormat = VIDEO_CODING_MPEG4;
1365800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        else
1366800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            bufferConf.eCompressionFormat = VIDEO_CODING_H263;
1367800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pOutbufOps->Set_Geometry(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
1368800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
1369800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            ret = OMX_ErrorInsufficientResources;
1370800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            goto EXIT;
1371800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        }
1372800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1373800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1374800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* cacheable for output */
1375800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pOutbufOps->Enable_Cacheable) {
1376800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pOutbufOps->Enable_Cacheable(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle) != VIDEO_ERROR_NONE)
1377800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Failed to enable cacheable property for output buffer");
1378800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1379800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1380800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pOutbufOps->Setup(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, MFC_OUTPUT_BUFFER_NUM_MAX) != VIDEO_ERROR_NONE) {
1381800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
1382800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = OMX_ErrorInsufficientResources;
1383800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        goto EXIT;
1384800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1385800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1386800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pOutbufOps->Enqueue_All) {
1387800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pOutbufOps->Enqueue_All(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle) != VIDEO_ERROR_NONE) {
1388800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to flush all output buffer");
1389800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            ret = OMX_ErrorInsufficientResources;
1390800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            goto EXIT;
1391800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        }
1392800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1393800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1394800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* start header encoding */
1395800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pOutbufOps->Run(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle) != VIDEO_ERROR_NONE) {
1396800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer for header parsing");
1397800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = OMX_ErrorInsufficientResources;
1398800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        goto EXIT;
1399800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1400800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1401800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoEnc->pOutbuf = pOutbufOps->Dequeue(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle);
1402800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pVideoEnc->pOutbuf == NULL) {
1403800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to dequeue output buffer");
1404800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = OMX_ErrorInsufficientResources;
1405800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        goto EXIT;
1406800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    }
1407800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1408800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOutputData->dataBuffer= pVideoEnc->pOutbuf->planes[0].addr;
1409800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOutputData->allocSize = pVideoEnc->pOutbuf->planes[0].allocSize;
1410800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOutputData->dataLen = pVideoEnc->pOutbuf->planes[0].dataSize;
1411800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOutputData->usedDataLen = 0;
1412800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1413800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ret = OMX_ErrorNone;
1414800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1415800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFC = OMX_TRUE;
1416800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Enc->hMFCMpeg4Handle.returnCodec = VIDEO_TRUE;
1417800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1418800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangEXIT:
1419800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    return ret;
1420800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang}
1421800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1422800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang/* nonblock */
1423800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic OMX_ERRORTYPE Exynos_Mpeg4Enc_Encode(
1424800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_COMPONENTTYPE *pOMXComponent,
1425800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_DATA   *pInputData,
1426800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_DATA   *pOutputData)
1427800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{
1428800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
1429800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1430800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1431800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
1432800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1433800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1434800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT           *pExynosPort       = NULL;
1435800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncOps             *pEncOps           = pVideoEnc->pEncOps;
1436800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncBufferOps       *pInbufOps         = pVideoEnc->pInbufOps;
1437800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ExynosVideoEncBufferOps       *pOutbufOps        = pVideoEnc->pOutbufOps;
1438800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1439800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoEnc->NBEncThread.oneFrameSize = pInputData->dataLen;
1440800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_PTR ppBuf[3];
144120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
144220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
144320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
144420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFC == OMX_FALSE) {
1445800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = Exynos_Mpeg4Enc_Configure(pOMXComponent, pInputData, pOutputData);
1446800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (ret != OMX_ErrorNone) {
1447800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: failed to configure encoder", __FUNCTION__);
144820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorUndefined;
144920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
145020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
145120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
145220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pOutputData->timeStamp = 0;
145320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pOutputData->nFlags |= OMX_BUFFERFLAG_CODECCONFIG;
145420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
145520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
145620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFC = OMX_TRUE;
145720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
145820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInputDataEncodeYet;
145920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
146020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
146120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
146220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((pInputData->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) &&
146320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->bUseFlagEOF == OMX_FALSE))
146420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->bUseFlagEOF = OMX_TRUE;
146520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1466800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pVideoEnc->NBEncThread.oneFrameSize <= 0) {
146720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pOutputData->timeStamp = pInputData->timeStamp;
146820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pOutputData->nFlags = pInputData->nFlags;
146920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
147120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
147220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
147320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1475800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
147620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (((pInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
147720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->getAllDelayBuffer == OMX_TRUE)){
147820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        /* Dummy input data for get out encoded last frame */
1479800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVVirBuffer[0] = pVideoEnc->MFCEncInputBuffer[pVideoEnc->indexInputBuffer].YVirAddr;
1480800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVVirBuffer[1] = pVideoEnc->MFCEncInputBuffer[pVideoEnc->indexInputBuffer].CVirAddr;
148120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
148220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        switch (pExynosPort->portDefinition.format.video.eColorFormat) {
148320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_SEC_COLOR_FormatNV12TPhysicalAddress:
148420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_SEC_COLOR_FormatNV12LPhysicalAddress:
1485800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        case OMX_SEC_COLOR_FormatNV21LPhysicalAddress:
148620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#ifndef USE_METADATABUFFERTYPE
148720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /* USE_FIMC_FRAME_BUFFER */
1488800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Memcpy(&(pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVVirBuffer[0]), pInputData->dataBuffer, sizeof(OMX_PTR));
1489800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Memcpy(&(pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVVirBuffer[1]), pInputData->dataBuffer + sizeof(OMX_PTR), sizeof(OMX_PTR));
149020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#else
149120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_GetInfoFromMetaData(pInputData, ppBuf);
149220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1493800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Memcpy(&(pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVVirBuffer[0]), ppBuf[0], sizeof(OMX_PTR));
1494800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Memcpy(&(pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVVirBuffer[1]), ppBuf[1], sizeof(OMX_PTR));
149520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
149620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
149720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_SEC_COLOR_FormatNV12LVirtualAddress:
1498800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVVirBuffer[0] = *((void **)pInputData->dataBuffer);
1499800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVVirBuffer[1] = (char *)pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVVirBuffer[0] +
1500800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                                                          (ALIGN_TO_16B(pExynosPort->portDefinition.format.video.nFrameWidth) *
1501800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                                                           ALIGN_TO_16B(pExynosPort->portDefinition.format.video.nFrameHeight));
150220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
150320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        default:
1504800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVPhyBuffer[0] = pVideoEnc->MFCEncInputBuffer[pVideoEnc->indexInputBuffer].YPhyAddr;
1505800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVVirBuffer[0] = pVideoEnc->MFCEncInputBuffer[pVideoEnc->indexInputBuffer].YVirAddr;
1506800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVPhyBuffer[1] = pVideoEnc->MFCEncInputBuffer[pVideoEnc->indexInputBuffer].CPhyAddr;
1507800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVVirBuffer[1] = pVideoEnc->MFCEncInputBuffer[pVideoEnc->indexInputBuffer].CVirAddr;
150820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
150920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
151020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
151120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1512800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVDataSize[0] = ALIGN_TO_16B(pExynosPort->portDefinition.format.video.nFrameWidth) *
1513800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                                                    ALIGN_TO_16B(pExynosPort->portDefinition.format.video.nFrameHeight);
1514800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVDataSize[1] = pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVDataSize[0] / 2;
1515800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
151620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->timeStamp[pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp] = pInputData->timeStamp;
151720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->nFlags[pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp] = pInputData->nFlags;
151820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1519800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if ((pMpeg4Enc->hMFCMpeg4Handle.returnCodec == VIDEO_TRUE) &&
152020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pVideoEnc->bFirstFrame == OMX_FALSE)) {
152120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_S32 indexTimestamp = 0;
152220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
152320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        /* wait for mfc encode done */
152420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pVideoEnc->NBEncThread.bEncoderRun != OMX_FALSE) {
152520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_SemaphoreWait(pVideoEnc->NBEncThread.hEncFrameEnd);
152620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pVideoEnc->NBEncThread.bEncoderRun = OMX_FALSE;
152720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
152820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
152920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SleepMillisec(0);
1530800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
1531800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        indexTimestamp = pEncOps->Get_FrameTag(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle);
1532800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (indexTimestamp < 0 || indexTimestamp >= MAX_TIMESTAMP) {
153320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->timeStamp = pInputData->timeStamp;
153420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->nFlags = pInputData->nFlags;
153520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
153620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
153720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
153820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
153920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1540800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        if (pVideoEnc->pOutbuf != NULL) {
154120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /** Fill Output Buffer **/
1542800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pOutputData->dataBuffer  = pVideoEnc->pOutbuf->planes[0].addr;
1543800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pOutputData->allocSize   = pVideoEnc->pOutbuf->planes[0].allocSize;
1544800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pOutputData->dataLen     = pVideoEnc->pOutbuf->planes[0].dataSize;
154520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->usedDataLen = 0;
154620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
154720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
1548800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            if (pVideoEnc->pOutbuf->frameType == VIDEO_FRAME_I)
154920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pOutputData->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
155020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1551800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "MFC Encode OK!");
155220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
155320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNone;
155420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
1555800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: failed to get output buffer, ret:%d", __FUNCTION__, pMpeg4Enc->hMFCMpeg4Handle.returnCodec);
1556800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            ret = OMX_ErrorInsufficientResources;
155720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
155820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
155920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
156020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pExynosComponent->getAllDelayBuffer == OMX_TRUE) {
156120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorInputDataEncodeYet;
156220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
1563800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
156420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
156520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pInputData->nFlags = (pOutputData->nFlags & (~OMX_BUFFERFLAG_EOS));
156620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->getAllDelayBuffer = OMX_TRUE;
156720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorInputDataEncodeYet;
156820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
1569800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang
157020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
157120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->getAllDelayBuffer = OMX_FALSE;
157220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->dataLen = 0;
157320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->usedDataLen = 0;
157420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_BUFFERFLAG_EOS!!!");
157520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNone;
157620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
157720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
157820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
157920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pVideoEnc->configChange == OMX_TRUE) {
158020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
1581800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Change_Mpeg4Enc_Param(pExynosComponent);
158220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
1583800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            Change_H263Enc_Param(pExynosComponent);
158420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVideoEnc->configChange = OMX_FALSE;
158520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
158620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1587800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pEncOps->Set_FrameTag(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle,
1588800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang            pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp) != VIDEO_ERROR_NONE) {
1589800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set frame tag");
1590800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = OMX_ErrorInsufficientResources;
159120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
159220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
159320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1594800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pOutbufOps->Enqueue(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle,
1595800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                           (unsigned char **)&pVideoEnc->pOutbuf->planes[0].addr,
1596800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                           (unsigned int *)&pVideoEnc->pOutbuf->planes[0].dataSize,
1597800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                            1, NULL) != VIDEO_ERROR_NONE) {
1598800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue output buffer");
1599800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = OMX_ErrorInsufficientResources;
160020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
160120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
160220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1603800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if (pInbufOps->Enqueue(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle,
1604800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                          (unsigned char **)pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVVirBuffer,
1605800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                          (unsigned int *)pMpeg4Enc->hMFCMpeg4Handle.pMFCYUVDataSize,
1606800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang                          2, NULL) != VIDEO_ERROR_NONE) {
1607800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer");
1608800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = OMX_ErrorInsufficientResources;
1609800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        goto EXIT;
161020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
161120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVideoEnc->indexInputBuffer++;
161220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pVideoEnc->indexInputBuffer %= MFC_INPUT_BUFFER_NUM_MAX;
161320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
161420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1615800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    /* mfc encode start */
1616800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_SemaphorePost(pVideoEnc->NBEncThread.hEncFrameStart);
1617800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoEnc->NBEncThread.bEncoderRun = OMX_TRUE;
1618800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp++;
1619800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp %= MAX_TIMESTAMP;
1620800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pVideoEnc->bFirstFrame = OMX_FALSE;
1621800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    Exynos_OSAL_SleepMillisec(0);
162220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
162320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
162420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
162520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
162620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
162720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
162820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
162920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Encode */
1630800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_BufferProcess(
1631800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_COMPONENTTYPE *pOMXComponent,
1632800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_DATA   *pInputData,
1633800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_DATA   *pOutputData)
163420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
1635800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE               ret               = OMX_ErrorNone;
1636800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASECOMPONENT   *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1637800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE     *pMpeg4Enc         = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1638800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT        *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1639800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT        *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1640800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_BOOL                    endOfFrame        = OMX_FALSE;
1641800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_BOOL                    flagEOS           = OMX_FALSE;
164220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
164320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
164420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1645800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_ENABLED(pExynosOutputPort)) ||
1646800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        (!CHECK_PORT_POPULATED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
1647800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = OMX_ErrorNone;
164820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
164920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
165020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent)) {
1651800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        ret = OMX_ErrorNone;
165220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
165320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
165420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1655800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    ret = Exynos_Mpeg4Enc_Encode(pOMXComponent, pInputData, pOutputData);
165620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
165720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret == OMX_ErrorInputDataEncodeYet) {
165820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->usedDataLen = 0;
165920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->remainDataLen = pOutputData->dataLen;
166020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
166120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
166220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                                            pExynosComponent->callbackData,
166320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                                            OMX_EventError, ret, 0, NULL);
166420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
166520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
166620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pInputData->usedDataLen += pInputData->dataLen;
166720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pInputData->remainDataLen = pInputData->dataLen - pInputData->usedDataLen;
166820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pInputData->dataLen -= pInputData->usedDataLen;
166920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pInputData->usedDataLen = 0;
167020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1671800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang        pOutputData->remainDataLen = pOutputData->dataLen - pOutputData->usedDataLen;
167220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
167320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
167420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
167520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
167620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
167720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
167820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
167920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1680800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
1681800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_HANDLETYPE hComponent,
1682800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_STRING     componentName)
168320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
1684800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
1685800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
168620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
1687800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_BASEPORT           *pExynosPort      = NULL;
1688800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = NULL;
1689800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc        = NULL;
1690800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_S32                        codecType        = -1;
169120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int i = 0;
169220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
169320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
169420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
169520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (componentName == NULL)) {
169620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
169720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: parameters are null, ret: %X", __FUNCTION__, ret);
169820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
169920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
170020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG4_ENC, componentName) == 0) {
170120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        codecType = CODEC_TYPE_MPEG4;
170220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H263_ENC, componentName) == 0) {
170320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        codecType = CODEC_TYPE_H263;
170420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
170520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
170620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName(%s) error, ret: %X", __FUNCTION__, componentName, ret);
170720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
170820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
170920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
171020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
171120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_VideoEncodeComponentInit(pOMXComponent);
171220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
171320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_VideoDecodeComponentInit error, ret: %X", __FUNCTION__, ret);
171420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
171520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
171620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
171720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->codecType = HW_VIDEO_ENC_CODEC;
171820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
171920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
172020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->componentName == NULL) {
172120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
172220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
172320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName alloc error, ret: %X", __FUNCTION__, ret);
172420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
172520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
172620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
172720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
172820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMpeg4Enc = Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG4ENC_HANDLE));
172920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pMpeg4Enc == NULL) {
173020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
173120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
173220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: EXYNOS_MPEG4ENC_HANDLE alloc error, ret: %X", __FUNCTION__, ret);
173320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
173420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
173520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pMpeg4Enc, 0, sizeof(EXYNOS_MPEG4ENC_HANDLE));
173620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
173720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pVideoEnc->hCodecHandle = (OMX_HANDLETYPE)pMpeg4Enc;
173820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMpeg4Enc->hMFCMpeg4Handle.codecType = codecType;
173920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
174020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (codecType == CODEC_TYPE_MPEG4)
174120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MPEG4_ENC);
174220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    else
174320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H263_ENC);
174420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
174520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set componentVersion */
174620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
174720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
174820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
174920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
175020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set specVersion */
175120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
175220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
175320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
175420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
175520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
175620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Android CapabilityFlags */
175720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->capabilityFlags.iIsOMXComponentMultiThreaded                   = OMX_TRUE;
175820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->capabilityFlags.iOMXComponentSupportsExternalInputBufferAlloc  = OMX_TRUE;
175920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->capabilityFlags.iOMXComponentSupportsExternalOutputBufferAlloc = OMX_TRUE;
176020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->capabilityFlags.iOMXComponentSupportsMovableInputBuffers       = OMX_FALSE;
176120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->capabilityFlags.iOMXComponentSupportsPartialFrames             = OMX_FALSE;
176220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->capabilityFlags.iOMXComponentUsesNALStartCodes                 = OMX_TRUE;
176320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->capabilityFlags.iOMXComponentCanHandleIncompleteFrames         = OMX_TRUE;
176420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->capabilityFlags.iOMXComponentUsesFullAVCFrames                 = OMX_TRUE;
176520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
176620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Input port */
176720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
176820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
176920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
177020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nBitrate = 64000;
177120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.xFramerate= (15 << 16);
177220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
177320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.pNativeRender = 0;
177420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
177520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
177620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
177720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
177820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
177920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
178020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
178120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Output port */
178220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
178320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
178420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
178520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.nBitrate = 64000;
178620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.xFramerate= (15 << 16);
178720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (codecType == CODEC_TYPE_MPEG4) {
178820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
178920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
179020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/mpeg4");
179120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
179220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
179320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
179420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/h263");
179520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
179620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.pNativeRender = 0;
179720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
179820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
179920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
180020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
180120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
180220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (codecType == CODEC_TYPE_MPEG4) {
180320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        for(i = 0; i < ALL_PORT_NUM; i++) {
180420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            INIT_SET_SIZE_VERSION(&pMpeg4Enc->mpeg4Component[i], OMX_VIDEO_PARAM_MPEG4TYPE);
180520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->mpeg4Component[i].nPortIndex = i;
180620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->mpeg4Component[i].eProfile   = OMX_VIDEO_MPEG4ProfileSimple;
180720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->mpeg4Component[i].eLevel     = OMX_VIDEO_MPEG4Level4;
180820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
180920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->mpeg4Component[i].nPFrames = 10;
181020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->mpeg4Component[i].nBFrames = 0;          /* No support for B frames */
181120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->mpeg4Component[i].nMaxPacketSize = 256;  /* Default value */
181220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->mpeg4Component[i].nAllowedPictureTypes =  OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP;
181320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->mpeg4Component[i].bGov = OMX_FALSE;
181420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
181520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
181620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
181720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        for(i = 0; i < ALL_PORT_NUM; i++) {
181820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            INIT_SET_SIZE_VERSION(&pMpeg4Enc->h263Component[i], OMX_VIDEO_PARAM_H263TYPE);
181920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->h263Component[i].nPortIndex = i;
182020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->h263Component[i].eProfile   = OMX_VIDEO_H263ProfileBaseline;
182120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->h263Component[i].eLevel     = OMX_VIDEO_H263Level45;
182220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
182320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->h263Component[i].nPFrames = 20;
182420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->h263Component[i].nBFrames = 0;          /* No support for B frames */
182520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->h263Component[i].bPLUSPTYPEAllowed = OMX_FALSE;
182620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->h263Component[i].nAllowedPictureTypes = OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP;
182720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->h263Component[i].bForceRoundingTypeToZero = OMX_TRUE;
182820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->h263Component[i].nPictureHeaderRepetition = 0;
182920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMpeg4Enc->h263Component[i].nGOBHeaderInterval = 0;
183020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
183120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
183220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1833800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->GetParameter      = &Exynos_Mpeg4Enc_GetParameter;
1834800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->SetParameter      = &Exynos_Mpeg4Enc_SetParameter;
1835800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->GetConfig         = &Exynos_Mpeg4Enc_GetConfig;
1836800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->SetConfig         = &Exynos_Mpeg4Enc_SetConfig;
1837800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->GetExtensionIndex = &Exynos_Mpeg4Enc_GetExtensionIndex;
1838800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pOMXComponent->ComponentRoleEnum = &Exynos_Mpeg4Enc_ComponentRoleEnum;
183920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
184020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1841800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pExynosComponent->exynos_mfc_componentInit      = &Exynos_Mpeg4Enc_Init;
1842800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pExynosComponent->exynos_mfc_componentTerminate = &Exynos_Mpeg4Enc_Terminate;
1843800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    pExynosComponent->exynos_mfc_bufferProcess      = &Exynos_Mpeg4Enc_BufferProcess;
184420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->exynos_checkInputFrame        = NULL;
184520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
184620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->currentState = OMX_StateLoaded;
184720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
184820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
184920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
185020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
185120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
185220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
185320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
185420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
185520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
185620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
185720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
1858800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_ERRORTYPE               ret              = OMX_ErrorNone;
1859800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    OMX_COMPONENTTYPE          *pOMXComponent    = NULL;
186020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
1861800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang    EXYNOS_MPEG4ENC_HANDLE     *pMpeg4Enc        = NULL;
186220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
186320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
186420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
186520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
186620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
186720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
186820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
186920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
187020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
187120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
187220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pExynosComponent->componentName);
187320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = NULL;
187420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
187520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
187620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pMpeg4Enc != NULL) {
187720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pMpeg4Enc);
187820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMpeg4Enc = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
187920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
188020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
188120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
188220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
188320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
188420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
188520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
188620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
188720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
188820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
188920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
189020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
189120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
189220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
1893