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