120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* 220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD 420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Licensed under the Apache License, Version 2.0 (the "License"); 620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * you may not use this file except in compliance with the License. 720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * You may obtain a copy of the License at 820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * http://www.apache.org/licenses/LICENSE-2.0 1020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 1120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Unless required by applicable law or agreed to in writing, software 1220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * distributed under the License is distributed on an "AS IS" BASIS, 1320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * See the License for the specific language governing permissions and 1520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * limitations under the License. 1620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 1720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* 1920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @file Exynos_OMX_Mpeg4enc.c 2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief 2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author Yunji Kim (yunji.kim@samsung.com) 2238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version 2.0.0 2320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history 2438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 2012.02.20 : Create 2520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h> 2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h> 2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h> 3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Macros.h" 3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Basecomponent.h" 3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Baseport.h" 3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Venc.h" 3538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_ETC.h" 3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Semaphore.h" 3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Thread.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" 4238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_SharedMemory.h" 4338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Event.h" 4438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 4538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang/* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */ 4638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang/* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */ 47800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include "csc.h" 4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef EXYNOS_LOG_TAG 5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG "EXYNOS_MPEG4_ENC" 5120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF 5238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//#define EXYNOS_TRACE_ON 5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h" 5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MPEG4 Encoder Supported Levels & profiles */ 5620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXYNOS_OMX_VIDEO_PROFILELEVEL supportedMPEG4ProfileLevels[] ={ 5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0}, 5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0b}, 5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1}, 6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level2}, 6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3}, 6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4}, 6320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4a}, 6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5}, 6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0}, 6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0b}, 6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level1}, 6820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level2}, 6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level3}, 7020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4}, 7120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4a}, 7220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level5}}; 7320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* H.263 Encoder Supported Levels & profiles */ 7520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXYNOS_OMX_VIDEO_PROFILELEVEL supportedH263ProfileLevels[] = { 7620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level10}, 7720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level20}, 7820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level30}, 7920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level40}, 8020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level45}, 8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level50}, 8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level60}, 8320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level70}}; 8420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 85800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic OMX_U32 OMXMpeg4ProfileToMFCProfile(OMX_VIDEO_MPEG4PROFILETYPE profile) 8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 ret; 8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (profile) { 9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_VIDEO_MPEG4ProfileSimple: 9120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = 0; 9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 9320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_VIDEO_MPEG4ProfileAdvancedSimple: 9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = 1; 9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 9620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = 0; 9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang }; 9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 102800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 103800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic OMX_U32 OMXMpeg4LevelToMFCLevel(OMX_VIDEO_MPEG4LEVELTYPE level) 10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 ret; 10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (level) { 10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_VIDEO_MPEG4Level0: 10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = 0; 11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_VIDEO_MPEG4Level0b: 112800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ret = 1; 11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_VIDEO_MPEG4Level1: 115800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ret = 2; 11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_VIDEO_MPEG4Level2: 118800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ret = 3; 11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_VIDEO_MPEG4Level3: 121800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ret = 4; 12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 12320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_VIDEO_MPEG4Level4: 12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_VIDEO_MPEG4Level4a: 125800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ret = 6; 12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_VIDEO_MPEG4Level5: 128800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ret = 7; 12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 13020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = 0; 13220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang }; 13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 137800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic void Print_Mpeg4Enc_Param(ExynosVideoEncParam *pEncParam) 13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 139800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncCommonParam *pCommonParam = &pEncParam->commonParam; 140800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncMpeg4Param *pMpeg4Param = &pEncParam->codecParam.mpeg4; 141800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 142800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang /* common parameters */ 143800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceWidth : %d", pCommonParam->SourceWidth); 144800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceHeight : %d", pCommonParam->SourceHeight); 145800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "IDRPeriod : %d", pCommonParam->IDRPeriod); 146800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceMode : %d", pCommonParam->SliceMode); 147800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "RandomIntraMBRefresh : %d", pCommonParam->RandomIntraMBRefresh); 148800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Bitrate : %d", pCommonParam->Bitrate); 149800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp : %d", pCommonParam->FrameQp); 150800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_P : %d", pCommonParam->FrameQp_P); 151800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMax : %d", pCommonParam->QSCodeMax); 152800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMin : %d", pCommonParam->QSCodeMin); 153800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PadControlOn : %d", pCommonParam->PadControlOn); 154800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LumaPadVal : %d", pCommonParam->LumaPadVal); 155800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CbPadVal : %d", pCommonParam->CbPadVal); 156800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CrPadVal : %d", pCommonParam->CrPadVal); 157800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameMap : %d", pCommonParam->FrameMap); 158800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 159800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang /* Mpeg4 specific parameters */ 160800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "ProfileIDC : %d", pMpeg4Param->ProfileIDC); 161800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LevelIDC : %d", pMpeg4Param->LevelIDC); 162800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_B : %d", pMpeg4Param->FrameQp_B); 163800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "TimeIncreamentRes : %d", pMpeg4Param->TimeIncreamentRes); 164800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "VopTimeIncreament : %d", pMpeg4Param->VopTimeIncreament); 165800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceArgument : %d", pMpeg4Param->SliceArgument); 166800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NumberBFrames : %d", pMpeg4Param->NumberBFrames); 167800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "DisableQpelME : %d", pMpeg4Param->DisableQpelME); 168800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 169800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang /* rate control related parameters */ 170800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableFRMRateControl : %d", pCommonParam->EnableFRMRateControl); 171800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableMBRateControl : %d", pCommonParam->EnableMBRateControl); 172800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CBRPeriodRf : %d", pCommonParam->CBRPeriodRf); 17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 175800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic void Print_H263Enc_Param(ExynosVideoEncParam *pEncParam) 17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 177800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncCommonParam *pCommonParam = &pEncParam->commonParam; 178800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncH263Param *pH263Param = &pEncParam->codecParam.h263; 179800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 180800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang /* common parameters */ 181800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceWidth : %d", pCommonParam->SourceWidth); 182800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceHeight : %d", pCommonParam->SourceHeight); 183800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "IDRPeriod : %d", pCommonParam->IDRPeriod); 184800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceMode : %d", pCommonParam->SliceMode); 185800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "RandomIntraMBRefresh : %d", pCommonParam->RandomIntraMBRefresh); 186800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Bitrate : %d", pCommonParam->Bitrate); 187800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp : %d", pCommonParam->FrameQp); 188800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_P : %d", pCommonParam->FrameQp_P); 189800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMax : %d", pCommonParam->QSCodeMax); 190800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMin : %d", pCommonParam->QSCodeMin); 191800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PadControlOn : %d", pCommonParam->PadControlOn); 192800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LumaPadVal : %d", pCommonParam->LumaPadVal); 193800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CbPadVal : %d", pCommonParam->CbPadVal); 194800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CrPadVal : %d", pCommonParam->CrPadVal); 195800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameMap : %d", pCommonParam->FrameMap); 196800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 197800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang /* H263 specific parameters */ 198800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameRate : %d", pH263Param->FrameRate); 199800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 200800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang /* rate control related parameters */ 201800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableFRMRateControl : %d", pCommonParam->EnableFRMRateControl); 202800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableMBRateControl : %d", pCommonParam->EnableMBRateControl); 203800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CBRPeriodRf : %d", pCommonParam->CBRPeriodRf); 20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 20520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 206800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic void Set_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) 20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 208800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = NULL; 20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = NULL; 210800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; 211800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 21238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MFC_MPEG4ENC_HANDLE *pMFCMpeg4Handle; 213800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 214800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncParam *pEncParam = NULL; 215800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncCommonParam *pCommonParam = NULL; 216800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncMpeg4Param *pMpeg4Param = NULL; 21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 21820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 219800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Enc = pVideoEnc->hCodecHandle; 22038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMFCMpeg4Handle = &pMpeg4Enc->hMFCMpeg4Handle; 221800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 22220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 22320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 22438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncParam = &pMFCMpeg4Handle->encParam; 225800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam = &pEncParam->commonParam; 226800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Param = &pEncParam->codecParam.mpeg4; 227800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pEncParam->eCompressionFormat = VIDEO_CODING_MPEG4; 228800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "eCompressionFormat: %d", pEncParam->eCompressionFormat); 229800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 230800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang /* common parameters */ 231800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->SourceWidth = pExynosOutputPort->portDefinition.format.video.nFrameWidth; 232800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight; 233800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->IDRPeriod = pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1; 234800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->SliceMode = 0; 235800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->RandomIntraMBRefresh = 0; 236800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->Bitrate = pExynosOutputPort->portDefinition.format.video.nBitrate; 237800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->FrameQp = pVideoEnc->quantization.nQpI; 238800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->FrameQp_P = pVideoEnc->quantization.nQpP; 239800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->QSCodeMax = 30; 240800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->QSCodeMin = 10; 241800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->PadControlOn = 0; /* 0: Use boundary pixel, 1: Use the below setting value */ 242800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->LumaPadVal = 0; 243800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->CbPadVal = 0; 244800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->CrPadVal = 0; 245800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 24633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 24733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV21Linear) 24833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12; 24933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV12Tiled) 25033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED; 25133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } else { 25233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) { 25333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim case OMX_COLOR_FormatYUV420SemiPlanar: 25433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_CSC_InputData */ 255800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#ifdef USE_METADATABUFFERTYPE 25633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim case OMX_COLOR_FormatAndroidOpaque: 257800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#endif 25833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12; 25933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim break; 26033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim case OMX_SEC_COLOR_FormatNV21Linear: 26133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21; 26233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim break; 26333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim case OMX_SEC_COLOR_FormatNV12Tiled: 26433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim default: 26533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED; 26633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim break; 26733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 268800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 269800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 270800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang /* Mpeg4 specific parameters */ 271800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Param->ProfileIDC = OMXMpeg4ProfileToMFCProfile(pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].eProfile); 272800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Param->LevelIDC = OMXMpeg4LevelToMFCLevel(pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].eLevel); 273800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Param->FrameQp_B = pVideoEnc->quantization.nQpB; 274800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Param->TimeIncreamentRes = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16; 275800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Param->VopTimeIncreament = 1; 276800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Param->SliceArgument = 0; /* MB number or byte number */ 277800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Param->NumberBFrames = 0; /* 0(not used) ~ 2 */ 278800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Param->DisableQpelME = 1; 27920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 28020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]: 0x%x", pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]); 281800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang /* rate control related parameters */ 28220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]) { 283d4819ad193068e01877a06cd0ff0f7967b7357f4SeungBeom Kim case OMX_Video_ControlRateDisable: 284d4819ad193068e01877a06cd0ff0f7967b7357f4SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode DBR"); 285800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->EnableFRMRateControl = 0; /* 0: Disable, 1: Frame level RC */ 286800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->EnableMBRateControl = 0; /* 0: Disable, 1:MB level RC */ 287800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->CBRPeriodRf = 100; 28820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 28920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_Video_ControlRateConstant: 29020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode CBR"); 291800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */ 292800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->EnableMBRateControl = 1; /* 0: Disable, 1:MB level RC */ 293d4819ad193068e01877a06cd0ff0f7967b7357f4SeungBeom Kim pCommonParam->CBRPeriodRf = 9; 29420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 295d4819ad193068e01877a06cd0ff0f7967b7357f4SeungBeom Kim case OMX_Video_ControlRateVariable: 296800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang default: /*Android default */ 29720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode VBR"); 298d4819ad193068e01877a06cd0ff0f7967b7357f4SeungBeom Kim pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */ 299d4819ad193068e01877a06cd0ff0f7967b7357f4SeungBeom Kim pCommonParam->EnableMBRateControl = 1; /* 0: Disable, 1:MB level RC */ 300800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->CBRPeriodRf = 100; 30120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 30220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 30320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 304800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Print_Mpeg4Enc_Param(pEncParam); 305800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang} 306800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 307800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic void Set_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) 308800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{ 309800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = NULL; 310800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = NULL; 311800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; 312800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 31338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MFC_MPEG4ENC_HANDLE *pMFCMpeg4Handle; 314800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 315800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncParam *pEncParam = NULL; 316800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncCommonParam *pCommonParam = NULL; 317800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncH263Param *pH263Param = NULL; 318800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 319800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 320800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Enc = pVideoEnc->hCodecHandle; 32138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMFCMpeg4Handle = &pMpeg4Enc->hMFCMpeg4Handle; 322800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 323800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 324800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 32538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncParam = &pMFCMpeg4Handle->encParam; 326800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam = &pEncParam->commonParam; 327800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pH263Param = &pEncParam->codecParam.h263; 328800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pEncParam->eCompressionFormat = VIDEO_CODING_H263; 329800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "eCompressionFormat: %d", pEncParam->eCompressionFormat); 330800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 331800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang /* common parameters */ 332800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->SourceWidth = pExynosOutputPort->portDefinition.format.video.nFrameWidth; 333800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight; 334800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->IDRPeriod = pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1; 335800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->SliceMode = 0; 336800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->RandomIntraMBRefresh = 0; 337800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->Bitrate = pExynosOutputPort->portDefinition.format.video.nBitrate; 338800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->FrameQp = pVideoEnc->quantization.nQpI; 339800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->FrameQp_P = pVideoEnc->quantization.nQpP; 340800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->QSCodeMax = 30; 341800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->QSCodeMin = 10; 342800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->PadControlOn = 0; /* 0: Use boundary pixel, 1: Use the below setting value */ 343800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->LumaPadVal = 0; 344800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->CbPadVal = 0; 345800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->CrPadVal = 0; 346800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 34733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 34833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV21Linear) 34933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12; 35033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV12Tiled) 35133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED; 35233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } else { 35333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) { 35433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim case OMX_COLOR_FormatYUV420SemiPlanar: 35533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_CSC_InputData */ 356800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#ifdef USE_METADATABUFFERTYPE 35733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim case OMX_COLOR_FormatAndroidOpaque: 35820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif 35933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12; 36033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim break; 36133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim case OMX_SEC_COLOR_FormatNV21Linear: 36233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21; 36333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim break; 36433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim case OMX_SEC_COLOR_FormatNV12Tiled: 36533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim default: 36633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED; 36733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim break; 36833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 369800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 370800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 371800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang /* H263 specific parameters */ 372800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pH263Param->FrameRate = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16; 373800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 374800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]: 0x%x", pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]); 375800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang /* rate control related parameters */ 376800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang switch (pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]) { 377d4819ad193068e01877a06cd0ff0f7967b7357f4SeungBeom Kim case OMX_Video_ControlRateDisable: 378d4819ad193068e01877a06cd0ff0f7967b7357f4SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode DBR"); 379800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->EnableFRMRateControl = 0; /* 0: Disable, 1: Frame level RC */ 380800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->EnableMBRateControl = 0; /* 0: Disable, 1:MB level RC */ 381800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->CBRPeriodRf = 100; 382800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang break; 383800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang case OMX_Video_ControlRateConstant: 384800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode CBR"); 385800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */ 386800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->EnableMBRateControl = 1; /* 0: Disable, 1:MB level RC */ 387d4819ad193068e01877a06cd0ff0f7967b7357f4SeungBeom Kim pCommonParam->CBRPeriodRf = 9; 388800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang break; 389d4819ad193068e01877a06cd0ff0f7967b7357f4SeungBeom Kim case OMX_Video_ControlRateVariable: 390800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang default: /*Android default */ 391800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode VBR"); 392d4819ad193068e01877a06cd0ff0f7967b7357f4SeungBeom Kim pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */ 393d4819ad193068e01877a06cd0ff0f7967b7357f4SeungBeom Kim pCommonParam->EnableMBRateControl = 1; /* 0: Disable, 1:MB level RC */ 394800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam->CBRPeriodRf = 100; 39520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 39620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 39720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 398800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Print_H263Enc_Param(pEncParam); 39920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 40020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 401800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic void Change_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) 40220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 403800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = NULL; 40420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = NULL; 405800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; 406800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 40738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MFC_MPEG4ENC_HANDLE *pMFCMpeg4Handle; 408800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 409800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncOps *pEncOps = NULL; 410800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncParam *pEncParam = NULL; 411800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncCommonParam *pCommonParam = NULL; 412800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncMpeg4Param *pMpeg4Param = NULL; 413800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 414800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang int setParam = 0; 41520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 41620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 417800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Enc = pVideoEnc->hCodecHandle; 41838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMFCMpeg4Handle = &pMpeg4Enc->hMFCMpeg4Handle; 419800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 42020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 42138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncOps = pMFCMpeg4Handle->pEncOps; 422800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 42338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncParam = &pMFCMpeg4Handle->encParam; 424800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam = &pEncParam->commonParam; 425800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Param = &pEncParam->codecParam.mpeg4; 42620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 42720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pVideoEnc->IntraRefreshVOP == OMX_TRUE) { 428800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang setParam = VIDEO_FRAME_I; 429800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pEncOps->Set_FrameType(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam); 43020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc->IntraRefreshVOP = OMX_FALSE; 43120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 432800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang if (pCommonParam->IDRPeriod != (int)pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1) { 433800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang setParam = pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1; 434800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pEncOps->Set_IDRPeriod(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam); 43520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 436800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang if (pCommonParam->Bitrate != (int)pExynosOutputPort->portDefinition.format.video.nBitrate) { 437800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang setParam = pExynosOutputPort->portDefinition.format.video.nBitrate; 438800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pEncOps->Set_BitRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam); 43920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 44020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pMpeg4Param->TimeIncreamentRes != (int)((pExynosOutputPort->portDefinition.format.video.xFramerate) >> 16)) { 441800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang setParam = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16; 442800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pEncOps->Set_FrameRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam); 44320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 44420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 445800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Set_Mpeg4Enc_Param(pExynosComponent); 44620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 44720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 448800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic void Change_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) 44920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 450800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = NULL; 45120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = NULL; 452800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; 453800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 45438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MFC_MPEG4ENC_HANDLE *pMFCMpeg4Handle; 45520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 456800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncOps *pEncOps = NULL; 457800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncParam *pEncParam = NULL; 458800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncCommonParam *pCommonParam = NULL; 459800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ExynosVideoEncH263Param *pH263Param = NULL; 46020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 461800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang int setParam = 0; 46220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 46320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 464800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Enc = pVideoEnc->hCodecHandle; 46538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMFCMpeg4Handle = &pMpeg4Enc->hMFCMpeg4Handle; 466800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 46720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 46838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncOps = pMFCMpeg4Handle->pEncOps; 469800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 47038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncParam = &pMFCMpeg4Handle->encParam; 471800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pCommonParam = &pEncParam->commonParam; 472800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pH263Param = &pEncParam->codecParam.h263; 47320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 47420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pVideoEnc->IntraRefreshVOP == OMX_TRUE) { 475800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang setParam = VIDEO_FRAME_I; 476800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pEncOps->Set_FrameType(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam); 47720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc->IntraRefreshVOP = OMX_FALSE; 47820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 479800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang if (pCommonParam->IDRPeriod != (int)pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1) { 480800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang setParam = pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1; 481800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pEncOps->Set_IDRPeriod(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam); 48220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 483800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang if (pCommonParam->Bitrate != (int)pExynosOutputPort->portDefinition.format.video.nBitrate) { 484800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang setParam = pExynosOutputPort->portDefinition.format.video.nBitrate; 485800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pEncOps->Set_BitRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam); 48620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 48720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pH263Param->FrameRate != (int)((pExynosOutputPort->portDefinition.format.video.xFramerate) >> 16)) { 488800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang setParam = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16; 489800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pEncOps->Set_FrameRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam); 49020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 49120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 492800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Set_H263Enc_Param(pExynosComponent); 49320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 49420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 49538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, OMX_PTR addr[], OMX_U32 size[]) 49620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 49738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 49820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 49938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 50038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 50138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 50220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 50338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, OMX_PTR *pVirtAddr, OMX_U32 *dataSize) 50438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 50538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 50638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoBuffer *pCodecBuffer; 50738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 50838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecBuffer == NULL) { 50938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 51020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 51120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 51220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 51338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pCodecBuffer = (ExynosVideoBuffer *)codecBuffer; 51420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 51538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVirtAddr != NULL) 51638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *pVirtAddr = pCodecBuffer->planes[0].addr; 51720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 51838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (dataSize != NULL) 51938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *dataSize = pCodecBuffer->planes[0].allocSize; 52020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 52138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pCodecBuffer = (ExynosVideoBuffer *)codecBuffer; 52220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 52338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 52438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 52538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 52620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 52738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecOpen(EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc) 52838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 52938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 53020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 53138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = NULL; 53238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pInbufOps = NULL; 53338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = NULL; 53420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 53538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 53620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 53738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pMpeg4Enc == NULL) { 53838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 53938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__); 54038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 54120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 54220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 54338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* alloc ops structure */ 54438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncOps = (ExynosVideoEncOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncOps)); 54538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = (ExynosVideoEncBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncBufferOps)); 54638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = (ExynosVideoEncBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncBufferOps)); 54720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 54838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pEncOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) { 54938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate encoder ops buffer"); 55038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 55138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 55220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 55320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 55438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.pEncOps = pEncOps; 55538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.pInbufOps = pInbufOps; 55638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps = pOutbufOps; 55720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 55838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* function pointer mapping */ 55938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncOps->nSize = sizeof(ExynosVideoEncOps); 56038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps->nSize = sizeof(ExynosVideoEncBufferOps); 56138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->nSize = sizeof(ExynosVideoEncBufferOps); 56220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 56338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_Video_Register_Encoder(pEncOps, pInbufOps, pOutbufOps); 56420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 56538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* check mandatory functions for encoder ops */ 56638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pEncOps->Init == NULL) || (pEncOps->Finalize == NULL) || 56738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pEncOps->Set_FrameTag == NULL) || (pEncOps->Get_FrameTag == NULL)) { 56838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied"); 56938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 57038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 57138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 57220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 57338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* check mandatory functions for buffer ops */ 57438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) || 57538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) || 57638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) || 57738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) || 57838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) { 57938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied"); 58038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 58138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 58220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 58320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 58438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* alloc context, open, querycap */ 585c94beaeb6990ddf010f7934c201f68e2d66dff62SeungBeom Kim pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.pEncOps->Init(V4L2_MEMORY_DMABUF); 58638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle == NULL) { 58738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer"); 58838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 58938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 59120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 59238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 59320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 59438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 595440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (ret != OMX_ErrorNone) { 596440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (pEncOps != NULL) { 597440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim Exynos_OSAL_Free(pEncOps); 598440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim pMpeg4Enc->hMFCMpeg4Handle.pEncOps = NULL; 599440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim } 600440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (pInbufOps != NULL) { 601440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim Exynos_OSAL_Free(pInbufOps); 602440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim pMpeg4Enc->hMFCMpeg4Handle.pInbufOps = NULL; 603440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim } 604440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (pOutbufOps != NULL) { 605440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim Exynos_OSAL_Free(pOutbufOps); 606440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps = NULL; 607440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim } 608440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim } 609440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim 61038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 61120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 61238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 61338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 61420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 61538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecClose(EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc) 61638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 61738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = NULL; 61938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = NULL; 62038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pInbufOps = NULL; 62138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = NULL; 62220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 6233e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim FunctionIn(); 6243e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim 62538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pMpeg4Enc == NULL) { 62638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 62738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 62838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 62920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 63038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle; 63138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 63238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps; 63338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; 63438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 63538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (hMFCHandle != NULL) { 63638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncOps->Finalize(hMFCHandle); 63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle = NULL; 63820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 63938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps != NULL) { 64038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pOutbufOps); 64138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps = NULL; 64238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 64338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pInbufOps != NULL) { 64438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pInbufOps); 64538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps = NULL; 64638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 64738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pEncOps != NULL) { 64838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pEncOps); 64938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps = NULL; 65020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 65138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 65238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 65338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 65420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 65520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 65620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 65720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 65820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 65920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 66038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex) 66120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 66238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 66338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = NULL; 66438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = NULL; 66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pInbufOps = NULL; 66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = NULL; 66738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; 66838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 66920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 67020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 67120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent == NULL) { 67320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 67420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 67520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 67638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 67738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle; 67838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoEnc == NULL) { 67920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 68020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 68120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 68220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle; 68438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pMpeg4Enc == NULL) { 68538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 68620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 68720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 68820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 68938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle; 69038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 69138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps; 69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; 69320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 69438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPortIndex == INPUT_PORT_INDEX) 69538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps->Run(hMFCHandle); 69638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang else if (nPortIndex == OUTPUT_PORT_INDEX) 69738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Run(hMFCHandle); 69838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 69938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 70238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 70338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 70438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 70538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 70638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 70738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex) 70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 71038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = NULL; 71138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = NULL; 71238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pInbufOps = NULL; 71338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = NULL; 71438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; 71538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 71938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent == NULL) { 72038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 72138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 72238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 72338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 72438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle; 72538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoEnc == NULL) { 72638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 72738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 72838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 72938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle; 73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pMpeg4Enc == NULL) { 73138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 73238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 73338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 73438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 73538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle; 73638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps; 73838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; 73938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 74038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL)) 74138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps->Stop(hMFCHandle); 74238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL)) 74338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Stop(hMFCHandle); 74438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 74538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 74638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 74738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 74838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 74938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 75038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 75138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 75238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 75338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex) 75438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 75538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 75638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = NULL; 75738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = NULL; 75838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pInbufOps = NULL; 75938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = NULL; 76038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; 76138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 76238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 76338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 76438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 76538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent == NULL) { 76638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 76738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 76838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 76938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 77038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle; 77138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoEnc == NULL) { 77238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 77338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 77438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 77538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle; 77638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pMpeg4Enc == NULL) { 77738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 77838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 77938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 78038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 78138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle; 78238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 78338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps; 78438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; 78538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 78638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPortIndex == INPUT_PORT_INDEX) { 78738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pMpeg4Enc->bSourceStart == OMX_FALSE) { 78838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pMpeg4Enc->hSourceStartEvent); 78938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 79038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 79138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 79238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 79338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPortIndex == OUTPUT_PORT_INDEX) { 79438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pMpeg4Enc->bDestinationStart == OMX_FALSE) { 79538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pMpeg4Enc->hDestinationStartEvent); 79638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 79738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 79838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 79938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 80038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 80138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 80238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 80338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 80438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 80538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 80638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 80738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 80838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex) 80938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 81038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 81138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 81238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 81338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 81438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle; 81538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 81638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 81738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i, nOutbufs; 81838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 81938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 82038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps; 82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; 82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 82438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 82538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((nPortIndex == INPUT_PORT_INDEX) && 82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pMpeg4Enc->bSourceStart == OMX_TRUE)) { 82738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX); 82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 82938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]); 83191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]); 83291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]); 83338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 83438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]); 83538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 83638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps->Clear_Queue(hMFCHandle); 83838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if ((nPortIndex == OUTPUT_PORT_INDEX) && 83938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pMpeg4Enc->bDestinationStart == OMX_TRUE)) { 84038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 dataLen[2] = {0, 0}; 84138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoBuffer *pBuffer = NULL; 84238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 8433e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX); 84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 84538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) { 84638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer); 84738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer); 84838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncOutputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncOutputBuffer[i]); 84991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]); 85091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]); 85138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 85238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Clear_Queue(hMFCHandle); 85338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 85438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 85538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 85638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 85738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 85838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 85938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 86038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 86138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 86238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 86338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 86438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData) 86538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 86638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 86738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 86838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 86938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 87038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MFC_MPEG4ENC_HANDLE *pMFCMpeg4Handle = &pMpeg4Enc->hMFCMpeg4Handle; 87138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pMFCMpeg4Handle->hMFCHandle; 87238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 87338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 87438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 oneFrameSize = pSrcInputData->dataLen; 87538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 87638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 87738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps; 87838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; 879833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ExynosVideoEncParam *pEncParam = NULL; 880833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 881833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ExynosVideoGeometry bufferConf; 882833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim OMX_U32 inputBufferNumber = 0; 883833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim int i, nOutbufs; 88438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 88538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 88638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 88738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) { 88854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim OMX_BUFFERHEADERTYPE *OMXBuffer = NULL; 88954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent); 89054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim if (OMXBuffer == NULL) { 89138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 89238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 89338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 89438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 89554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim OMXBuffer->nTimeStamp = pSrcInputData->timeStamp; 89654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim OMXBuffer->nFlags = pSrcInputData->nFlags; 89754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer); 89838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 89938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 90038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 90138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 90238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 903833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4) 904833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Set_Mpeg4Enc_Param(pExynosComponent); 905833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim else 906833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Set_H263Enc_Param(pExynosComponent); 90738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 908833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pEncParam = &pMFCMpeg4Handle->encParam; 909833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pEncOps->Set_EncParam) { 910833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if(pEncOps->Set_EncParam(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, pEncParam) != VIDEO_ERROR_NONE) { 911833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer"); 912833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorInsufficientResources; 913833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim goto EXIT; 914833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 91538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 91638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 917833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* input buffer info: only 3 config values needed */ 918833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf)); 91933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim bufferConf.eColorFormat = pEncParam->commonParam.FrameMap;//VIDEO_COLORFORMAT_NV12; 920833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim bufferConf.nFrameWidth = pExynosInputPort->portDefinition.format.video.nFrameWidth; 921833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim bufferConf.nFrameHeight = pExynosInputPort->portDefinition.format.video.nFrameHeight; 922833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pInbufOps->Set_Shareable(hMFCHandle); 923833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 9245b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim inputBufferNumber = MAX_INPUTBUFFER_NUM_DYNAMIC; 925833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 926833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX; 927833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 92838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 929fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 930fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim /* should be done before prepare input buffer */ 931fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) { 932fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim ret = OMX_ErrorInsufficientResources; 933fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim goto EXIT; 934fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim } 93538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 936833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 937833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* set input buffer geometry */ 938833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pInbufOps->Set_Geometry) { 939833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pInbufOps->Set_Geometry(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) { 940833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer"); 941833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorInsufficientResources; 942833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim goto EXIT; 943833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 944833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 945833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 946833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* setup input buffer */ 947833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pInbufOps->Setup(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) { 948833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer"); 949833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorInsufficientResources; 95038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 95138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 95238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 95391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim ExynosVideoPlane planes[MFC_INPUT_BUFFER_PLANE]; 95491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim int plane; 95591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 956833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 957833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* Register input buffer */ 958833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 95991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) { 96091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim planes[plane].addr = pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane]; 96191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim planes[plane].allocSize = pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[plane]; 96291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim planes[plane].fd = pVideoEnc->pMFCEncInputBuffer[i]->fd[plane]; 96391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } 96491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (pInbufOps->Register(hMFCHandle, planes, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) { 965833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer"); 966833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorInsufficientResources; 967833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim goto EXIT; 968833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 969833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 970833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 971833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pExynosInputPort->bStoreMetaData == OMX_TRUE) { 97291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim /*************/ 97391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim /* TBD */ 97491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim /*************/ 97591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim /* Does not require any actions. */ 97691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } else { 97791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim ret = OMX_ErrorNotImplemented; 97891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim goto EXIT; 979833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 980833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 98138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 98238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_TRUE; 98338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 98438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 98538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 98638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 98738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 98838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 98938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 99038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 99138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent) 99238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 99338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 99438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 99538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 99638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 99738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MFC_MPEG4ENC_HANDLE *pMFCMpeg4Handle = &pMpeg4Enc->hMFCMpeg4Handle; 99838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pMFCMpeg4Handle->hMFCHandle; 999833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 1000833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 100138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 100238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 100338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps; 100438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; 1005833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ExynosVideoGeometry bufferConf; 1006833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim int i, nOutbufs; 100738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 100838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 100938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 1010833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim int OutBufferSize = pExynosOutputPort->portDefinition.format.video.nFrameWidth * pExynosOutputPort->portDefinition.format.video.nFrameHeight * 3 / 2; 1011833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* set geometry for output (dst) */ 1012833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pOutbufOps->Set_Geometry) { 1013833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* only 2 config values needed */ 1014833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4) 1015833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim bufferConf.eCompressionFormat = VIDEO_CODING_MPEG4; 1016833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim else 10171245032e056f079c67b942176d70c5c86b427f62SeungBeom Kim bufferConf.eCompressionFormat = VIDEO_CODING_H263; 1018833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim bufferConf.nSizeImage = OutBufferSize; 1019833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 1020833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pOutbufOps->Set_Geometry(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) { 1021833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer"); 1022833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorInsufficientResources; 1023833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim goto EXIT; 1024833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1025833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1026833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 1027833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* should be done before prepare output buffer */ 1028833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pOutbufOps->Enable_Cacheable) { 1029833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) { 1030833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorInsufficientResources; 1031833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim goto EXIT; 1032833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1033833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1034833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 1035833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pOutbufOps->Set_Shareable) { 1036833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pOutbufOps->Set_Shareable(hMFCHandle); 1037833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1038833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim int SetupBufferNumber = 0; 1039833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) 1040833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim SetupBufferNumber = MFC_OUTPUT_BUFFER_NUM_MAX; 1041833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim else 1042833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim SetupBufferNumber = pExynosOutputPort->portDefinition.nBufferCountActual; 10435b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SetupBufferNumber:%d", SetupBufferNumber); 1044833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 1045833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pOutbufOps->Setup(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, SetupBufferNumber) != VIDEO_ERROR_NONE) { 1046833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer"); 1047833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorInsufficientResources; 1048833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim goto EXIT; 1049833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1050833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 1051833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0}; 1052833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 1053833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* Register input buffer */ 1054833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) { 105591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim ExynosVideoPlane plane; 105691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pVideoEnc->pMFCEncOutputBuffer[i] = (CODEC_ENC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER)); 105791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] = 1058833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, OutBufferSize, NORMAL_MEMORY); 105991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] == NULL) { 1060833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer"); 1061833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorInsufficientResources; 1062833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim goto EXIT; 1063833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 106491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pVideoEnc->pMFCEncOutputBuffer[i]->fd[0] = 106591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0]); 106691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize[0] = OutBufferSize; 106791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 106891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim plane.addr = pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0]; 106991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim plane.fd = pVideoEnc->pMFCEncOutputBuffer[i]->fd[0]; 107091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim plane.allocSize = pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize[0]; 107191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 107291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (pOutbufOps->Register(hMFCHandle, &plane, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) { 1073833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer"); 1074833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorInsufficientResources; 1075833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim goto EXIT; 1076833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 107791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr, 107891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL); 1079833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1080833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } else if ((pExynosOutputPort->bufferProcessType & BUFFER_SHARE) == BUFFER_SHARE) { 1081833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* Register input buffer */ 1082833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /*************/ 1083833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* TBD */ 1084833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /*************/ 108591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim ExynosVideoPlane plane; 1086833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim for (i = 0; i < pExynosOutputPort->portDefinition.nBufferCountActual; i++) { 108791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim plane.addr = pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer; 108891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim plane.fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[0]; 108991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim plane.allocSize = OutBufferSize; 109091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (pOutbufOps->Register(hMFCHandle, &plane, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) { 1091833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer"); 1092833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorInsufficientResources; 1093833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim goto EXIT; 1094833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 109591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)&pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, 109691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL); 1097833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1098833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1099833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 110038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* start header encoding */ 110138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Run) { 1102833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) { 1103833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer"); 110438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 110538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 110638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 110738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 110838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 1109833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 1110833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim OMX_BUFFERHEADERTYPE *OMXBuffer = NULL; 1111833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ExynosVideoBuffer *pVideoBuffer = NULL; 111238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 1113833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent); 1114833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (OMXBuffer == OMX_ErrorNone) { 1115833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorUndefined; 1116833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim goto EXIT; 1117833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1118833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 1119833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) { 1120833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pOutbufOps->Dequeue", __FUNCTION__, __LINE__); 1121833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorUndefined; 1122833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim goto EXIT; 1123833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1124833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 1125833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "dst:0x%x, src:0x%x, dataSize:%d", 1126833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim OMXBuffer->pBuffer, 1127833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pVideoBuffer->planes[0].addr, 1128833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pVideoBuffer->planes[0].dataSize); 112991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim Exynos_OSAL_Memcpy(OMXBuffer->pBuffer, pVideoBuffer->planes[0].addr, pVideoBuffer->planes[0].dataSize); 1130833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim OMXBuffer->nFilledLen = pVideoBuffer->planes[0].dataSize; 1131833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim OMXBuffer->nOffset = 0; 1132833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim OMXBuffer->nTimeStamp = 0; 1133833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim OMXBuffer->nFlags |= OMX_BUFFERFLAG_CODECCONFIG; 1134833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim OMXBuffer->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME; 1135833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer); 113638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 1137833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pVideoEnc->bFirstOutput = OMX_TRUE; 1138833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_ErrorNone; 1139833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 1140833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Mpeg4CodecStop(pOMXComponent, OUTPUT_PORT_INDEX); 1141833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1142833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_TRUE; 114338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 114438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 114538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 114638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 114738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 114838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 114938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 115038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 115138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 115238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_GetParameter( 115338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 115438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_INDEXTYPE nParamIndex, 115538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_INOUT OMX_PTR pComponentParameterStructure) 115638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 115738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 115838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 115938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 116038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 116138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 116238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 116338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (hComponent == NULL || pComponentParameterStructure == NULL) { 116438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 116538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 116638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 116738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 116838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 116938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 117038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 117138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 117238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 117338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 117438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 117538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 117638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 117738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 117838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid ) { 117938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInvalidState; 118038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 118138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 118238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 118338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang switch (nParamIndex) { 118438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamVideoMpeg4: 118538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 118638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Component = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure; 118738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Component = NULL; 118838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 118938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 119038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pDstMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE)); 119138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 119238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 119338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 119438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 119538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDstMpeg4Component->nPortIndex >= ALL_PORT_NUM) { 119638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 119738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 119838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 119938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 120038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 120138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcMpeg4Component = &pMpeg4Enc->mpeg4Component[pDstMpeg4Component->nPortIndex]; 120238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 120338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memcpy(pDstMpeg4Component, pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE)); 120438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 120538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 120638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamVideoH263: 120738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 120838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_H263TYPE *pDstH263Component = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure; 120938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_H263TYPE *pSrcH263Component = NULL; 121038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 121138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 121238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pDstH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE)); 121338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 121438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 121538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 121638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 121738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDstH263Component->nPortIndex >= ALL_PORT_NUM) { 121838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 121938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 122038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 122138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 122238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 122338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcH263Component = &pMpeg4Enc->h263Component[pDstH263Component->nPortIndex]; 122438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 122538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memcpy(pDstH263Component, pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE)); 122638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 122738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 122838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamStandardComponentRole: 122938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 123038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_S32 codecType; 123138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure; 123238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); 123338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 123438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 123538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 123638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 123738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType; 123838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecType == CODEC_TYPE_MPEG4) 123938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE); 124038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang else 124138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE); 124238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 124338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 124438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamVideoProfileLevelQuerySupported: 124538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 124638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure; 124738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEO_PROFILELEVEL *pProfileLevel = NULL; 124838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 maxProfileLevelNum = 0; 124938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_S32 codecType; 125038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 125138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE)); 125238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 125338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 125438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 125538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 125638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) { 125738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 125838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 125938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 126038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 126138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType; 126238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecType == CODEC_TYPE_MPEG4) { 126338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pProfileLevel = supportedMPEG4ProfileLevels; 126438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang maxProfileLevelNum = sizeof(supportedMPEG4ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL); 126538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 126638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pProfileLevel = supportedH263ProfileLevels; 126738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang maxProfileLevelNum = sizeof(supportedH263ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL); 126838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 126938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 127038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) { 127138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNoMore; 127238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 127338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 127438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 127538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pProfileLevel += pDstProfileLevel->nProfileIndex; 127638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstProfileLevel->eProfile = pProfileLevel->profile; 127738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstProfileLevel->eLevel = pProfileLevel->level; 127838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 127938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 128038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamVideoProfileLevelCurrent: 128138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 128238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure; 128338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Component = NULL; 128438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_H263TYPE *pSrcH263Component = NULL; 128538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 128638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_S32 codecType; 128738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 128838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE)); 128938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 129038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 129138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 129238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 129338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) { 129438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 129538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 129638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 129738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 129838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 129938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang codecType = pMpeg4Enc->hMFCMpeg4Handle.codecType; 130038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecType == CODEC_TYPE_MPEG4) { 130138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcMpeg4Component = &pMpeg4Enc->mpeg4Component[pDstProfileLevel->nPortIndex]; 130238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstProfileLevel->eProfile = pSrcMpeg4Component->eProfile; 130338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstProfileLevel->eLevel = pSrcMpeg4Component->eLevel; 130438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 130538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcH263Component = &pMpeg4Enc->h263Component[pDstProfileLevel->nPortIndex]; 130638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstProfileLevel->eProfile = pSrcH263Component->eProfile; 130738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstProfileLevel->eLevel = pSrcH263Component->eLevel; 130838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 130938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 131038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 131138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamVideoErrorCorrection: 131238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 131338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure; 131438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL; 131538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 131638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 131738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE)); 131838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 131938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 132038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 132138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 132238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDstErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) { 132338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 132438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 132538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 132638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 132738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 132838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcErrorCorrectionType = &pMpeg4Enc->errorCorrectionType[OUTPUT_PORT_INDEX]; 132938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 133038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC; 133138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync; 133238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing; 133338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning; 133438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC; 133538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 133638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 133738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang default: 133838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_VideoEncodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure); 133938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 134038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 134138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 134238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 134338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 134438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 134538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 134638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 134738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_SetParameter( 134838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 134938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_INDEXTYPE nIndex, 135038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_PTR pComponentParameterStructure) 135138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 135238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 135338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 135438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 135538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 135638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 135738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 135838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (hComponent == NULL || pComponentParameterStructure == NULL) { 135938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 136038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 136138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 136238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 136338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 136438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 136538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 136638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 136738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 136838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 136938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 137038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 137138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 137238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 137338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid ) { 137438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInvalidState; 137538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 137638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 137738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 137838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang switch (nIndex) { 137938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamVideoMpeg4: 138038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 138138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Component = NULL; 138238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Component = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure; 138338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 138438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 138538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE)); 138638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 138720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 138820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 138920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1390800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang if (pSrcMpeg4Component->nPortIndex >= ALL_PORT_NUM) { 139120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 139220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 139320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 139420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 139520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 1396800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pDstMpeg4Component = &pMpeg4Enc->mpeg4Component[pSrcMpeg4Component->nPortIndex]; 139720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1398800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Memcpy(pDstMpeg4Component, pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE)); 139920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 140020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 140120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamVideoH263: 140220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 1403800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_VIDEO_PARAM_H263TYPE *pDstH263Component = NULL; 1404800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_VIDEO_PARAM_H263TYPE *pSrcH263Component = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure; 140520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 140620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1407800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ret = Exynos_OMX_Check_SizeVersion(pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE)); 140820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 140920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 141020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 141120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1412800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang if (pSrcH263Component->nPortIndex >= ALL_PORT_NUM) { 141320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 141420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 141520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 141620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 141720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 1418800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pDstH263Component = &pMpeg4Enc->h263Component[pSrcH263Component->nPortIndex]; 141920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1420800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Memcpy(pDstH263Component, pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE)); 142120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 142220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 142320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamStandardComponentRole: 142420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 142520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure; 142620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 142720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); 142820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 142920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 143020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 143120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 143220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) { 143320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 143420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 143520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 143620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 143720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE)) { 143820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4; 143920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_MPEG4; 144020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE)) { 144120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263; 144220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_H263; 144320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 144420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 144520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 144620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 144720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 144820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 144920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamVideoProfileLevelCurrent: 145020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 145120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure; 1452800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Component = NULL; 1453800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_VIDEO_PARAM_H263TYPE *pDstH263Component = NULL; 145420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 145520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_S32 codecType; 145620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 145720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE)); 14583e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim if (ret != OMX_ErrorNone) 145920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 146020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 146120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) { 146220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 146320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 146420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 146520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 146620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 146720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang codecType = pMpeg4Enc->hMFCMpeg4Handle.codecType; 146820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (codecType == CODEC_TYPE_MPEG4) { 146920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* 147020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * To do: Check validity of profile & level parameters 147120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 147220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1473800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pDstMpeg4Component = &pMpeg4Enc->mpeg4Component[pSrcProfileLevel->nPortIndex]; 1474800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pDstMpeg4Component->eProfile = pSrcProfileLevel->eProfile; 1475800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pDstMpeg4Component->eLevel = pSrcProfileLevel->eLevel; 147620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 147720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* 147820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * To do: Check validity of profile & level parameters 147920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 148020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1481800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pDstH263Component = &pMpeg4Enc->h263Component[pSrcProfileLevel->nPortIndex]; 1482800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pDstH263Component->eProfile = pSrcProfileLevel->eProfile; 1483800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pDstH263Component->eLevel = pSrcProfileLevel->eLevel; 148420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 148520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 148620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 148720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamVideoErrorCorrection: 148820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 148920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure; 149020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL; 1491800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 149220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 149320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE)); 149420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 149520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 149620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 149720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 149820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pSrcErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) { 149920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 150020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 150120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 150220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 150320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 150420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType = &pMpeg4Enc->errorCorrectionType[OUTPUT_PORT_INDEX]; 150520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 150620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC; 150720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync; 150820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing; 150920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning; 151020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC; 151120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 151220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 151320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 151420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoEncodeSetParameter(hComponent, nIndex, pComponentParameterStructure); 151520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 151620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 151720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 151820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 151920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 152020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 152120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 152220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1523800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_GetConfig( 152420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 152520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_INDEXTYPE nIndex, 152620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_PTR pComponentConfigStructure) 152720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 1528800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 1529800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 153020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 153120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 153220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 153320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 153420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL || pComponentConfigStructure == NULL) { 153520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 153620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 153720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 153820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 153920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 154020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 154120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 154220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 154320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 154420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 154520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 154620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 154720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 154820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 154920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 155020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 155120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 155220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 155320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 155420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 155520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoEncodeGetConfig(hComponent, nIndex, pComponentConfigStructure); 155620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 155720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 155820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 155920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 156020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 156120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 156220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 156320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 156420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1565800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_SetConfig( 156620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 156720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_INDEXTYPE nIndex, 156820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_PTR pComponentConfigStructure) 156920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 1570800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 1571800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 157220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 1573800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; 1574800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 157520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 157620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 157720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 157820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL || pComponentConfigStructure == NULL) { 157920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 158020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 158120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 158220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 158320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 158420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 158520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 158620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 158720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 158820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 158920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 159020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 159120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 159220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 159320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 159420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 159520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 159620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1597800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 1598800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle; 159920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 160020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 160120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexConfigVideoIntraPeriod: 160220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 160320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 nPFrames = (*((OMX_U32 *)pComponentConfigStructure)) - 1; 160420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 160520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4) 160620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames = nPFrames; 160720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 160820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames = nPFrames; 160920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 161020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 161120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 161220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 161320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 161420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoEncodeSetConfig(hComponent, nIndex, pComponentConfigStructure); 161520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 161620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 161720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 161820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 161920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret == OMX_ErrorNone) 162020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc->configChange = OMX_TRUE; 162120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 162220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 162320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 162420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 162520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 162620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1627800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_GetExtensionIndex( 1628800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_IN OMX_HANDLETYPE hComponent, 1629800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_IN OMX_STRING cParameterName, 1630800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_OUT OMX_INDEXTYPE *pIndexType) 163120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 1632800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 1633800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 163420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 163520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 163620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 163720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 163820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 163920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 164020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 164120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 164220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 164320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 164420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 164520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 164620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 164720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 164820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 164920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 165020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 165120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 165220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((cParameterName == NULL) || (pIndexType == NULL)) { 165320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 165420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 165520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 165620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 165720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 165820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 165920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 166020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_CONFIG_VIDEO_INTRAPERIOD) == 0) { 166120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *pIndexType = OMX_IndexConfigVideoIntraPeriod; 166220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 166320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 166420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoEncodeGetExtensionIndex(hComponent, cParameterName, pIndexType); 166520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 1666800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 166720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 166820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 166920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 167020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 167120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 167220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1673800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_ComponentRoleEnum( 167420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 167520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_OUT OMX_U8 *cRole, 167620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_U32 nIndex) 167720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 1678800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 1679800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 168020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 168120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_S32 codecType; 168220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 168320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 168420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 168520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((hComponent == NULL) || (cRole == NULL)) { 168620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 168720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 168820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 1689800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang if (nIndex != (MAX_COMPONENT_ROLE_NUM - 1)) { /* supports only one role */ 169020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNoMore; 169120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 169220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 169320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 169420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 169520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 169620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 169720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 169820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 169920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 170020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 170120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 170220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 170320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 170420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid ) { 170520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 170620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 170720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 170820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 170920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType; 171020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (codecType == CODEC_TYPE_MPEG4) 171120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE); 171220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 171320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE); 171420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 171520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 171620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 171720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 171820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 171920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 172020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 172138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang/* MFC Init */ 172238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_Init(OMX_COMPONENTTYPE *pOMXComponent) 172320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 172438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 172520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 172638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 172738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 172838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 172938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;; 173038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MFC_MPEG4ENC_HANDLE *pMFCMpeg4Handle = &pMpeg4Enc->hMFCMpeg4Handle; 173138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PTR hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle; 173238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COLOR_FORMATTYPE eColorFormat; 173338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 173438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = NULL; 173538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pInbufOps = NULL; 173638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = NULL; 173720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 173838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang CSC_METHOD csc_method = CSC_METHOD_SW; 173938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i = 0; 174020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 174138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 1742800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 174338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_FALSE; 174438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_FALSE; 174538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->bUseFlagEOF = OMX_TRUE; 174638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->bSaveFlagEOS = OMX_FALSE; 1747800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 174838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang eColorFormat = pExynosInputPort->portDefinition.format.video.eColorFormat; 174938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosInputPort->bStoreMetaData == OMX_TRUE) { 175038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) { 175138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->bufferProcessType = BUFFER_COPY; 17523e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim } else { 175338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->bufferProcessType = BUFFER_SHARE; 175420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 1755833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } else { 1756833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pExynosInputPort->bufferProcessType = BUFFER_COPY; 175720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 175820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 175938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Mpeg4/H.263 Codec Open */ 176038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Mpeg4CodecOpen(pMpeg4Enc); 176138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 176238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 176338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 176420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 176538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 176638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps; 176738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; 1768800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 176933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if ((pExynosInputPort->bStoreMetaData != OMX_TRUE) && 177033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim (eColorFormat != OMX_COLOR_FormatAndroidOpaque)) { 177133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 177233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID); 177333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); 177433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 177533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 177633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER)); 177733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /* Use ION Allocator */ 177833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /*Alloc Y-Buffer */ 177933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_YBUFFER_SIZE, NORMAL_MEMORY); 178033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->fd[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]); 178133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE; 178233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /*Alloc C-Buffer */ 178333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_CBUFFER_SIZE, NORMAL_MEMORY); 178433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->fd[1] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]); 178533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE; 178633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 178733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0; 178833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 178933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if ((pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] == NULL) || 179033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] == NULL)) { 179133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer"); 179233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim ret = OMX_ErrorInsufficientResources; 179333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim goto EXIT; 179433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 179533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 179633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /* MFC input buffers are 1 plane. */ 179733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[2] = NULL; 179833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->fd[2] = -1; 179933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[2] = 0; 180033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 180133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]); 180233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]); 180333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]); 180433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 180533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]); 180638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 180733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 180833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /*************/ 180933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /* TBD */ 181033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /*************/ 181133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /* Does not require any actions. */ 181238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 181338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 1814800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 181538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 1816833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID); 1817833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); 181838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 181938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 182038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 182138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 1822833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* Does not require any actions. */ 1823800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 182420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 182538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->bSourceStart = OMX_FALSE; 182638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalCreate(&pMpeg4Enc->hSourceStartEvent); 182738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->bDestinationStart = OMX_FALSE; 182838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalCreate(&pMpeg4Enc->hDestinationStartEvent); 1829800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 183020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP); 183120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS); 183220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp = 0; 183338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp = 0; 183420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 183538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->getAllDelayBuffer = OMX_FALSE; 183638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 183738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#if 0//defined(USE_CSC_GSCALER) 18383e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim csc_method = CSC_METHOD_HW; //in case of Use ION buffer. 183938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif 1840800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pVideoEnc->csc_handle = csc_init(csc_method); 184138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoEnc->csc_handle == NULL) { 184238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 184338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 184438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 184538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->csc_set_format = OMX_FALSE; 1846800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 184720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 184820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 184920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 185020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 185120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 185220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 185320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Terminate */ 1854800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent) 185520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 1856800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 185720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 185838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle); 185938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 186038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 186138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 186238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PTR hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle; 186338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 186438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 186538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps; 186638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; 186738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 186891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim int i = 0, plane = 0; 186920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 187020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 187120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 187238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoEnc->csc_handle != NULL) { 187338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang csc_deinit(pVideoEnc->csc_handle); 187438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->csc_handle = NULL; 187520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 187620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 187738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pMpeg4Enc->hDestinationStartEvent); 187838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hDestinationStartEvent = NULL; 187938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->bDestinationStart = OMX_FALSE; 188038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pMpeg4Enc->hSourceStartEvent); 188138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hSourceStartEvent = NULL; 188238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->bSourceStart = OMX_FALSE; 188338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 1884833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 1885833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) { 1886833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pVideoEnc->pMFCEncOutputBuffer[i] != NULL) { 188791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] != NULL) 188891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0]); 1889833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Free(pVideoEnc->pMFCEncOutputBuffer[i]); 1890833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pVideoEnc->pMFCEncOutputBuffer[i] = NULL; 1891833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1892833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1893833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 1894833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ); 1895833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID); 1896833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 1897833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /*************/ 1898833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* TBD */ 1899833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /*************/ 1900833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim /* Does not require any actions. */ 1901833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1902833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 190338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 190438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 190538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoEnc->pMFCEncInputBuffer[i] != NULL) { 190691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) { 190791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane] != NULL) 190891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane]); 190991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } 191038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pVideoEnc->pMFCEncInputBuffer[i]); 191138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->pMFCEncInputBuffer[i] = NULL; 191238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 191338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 191438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 191538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ); 191638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID); 191738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 191838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 191938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 192038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 192138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 192220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 192338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Mpeg4CodecClose(pMpeg4Enc); 192420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 192520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 192620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 192720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 192820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 192920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 193020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 193138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData) 193220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 193338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 193438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 193538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 193638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 193738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle; 193838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 193938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 194038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 oneFrameSize = pSrcInputData->dataLen; 194138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 194238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps; 194338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; 194438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE; 1945800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang int i; 1946800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 194738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 1948800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 194938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc == OMX_FALSE) { 195038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Mpeg4CodecSrcSetup(pOMXComponent, pSrcInputData); 1951833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) 1952833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim goto EXIT; 1953833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 1954833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_FALSE) { 1955833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = Mpeg4CodecDstSetup(pOMXComponent); 1956800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 1957800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 195838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pSrcInputData->dataLen >= 0) || 195938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { 19605b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0}; 1961833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim OMX_U32 pMFCYUVDataSize[MFC_INPUT_BUFFER_PLANE] = {NULL, NULL}; 196291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim ExynosVideoPlane planes[MFC_INPUT_BUFFER_PLANE]; 196391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim int plane; 196438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 196538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->timeStamp[pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->timeStamp; 196638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->nFlags[pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->nFlags; 196738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp, pSrcInputData->nFlags); 196838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pEncOps->Set_FrameTag(hMFCHandle, pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp); 196938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp++; 197038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp %= MAX_TIMESTAMP; 197138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 197238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* queue work for input buffer */ 1973b8d6caa56f49db9de297a80004571c6830cef90aJames Dong Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Exynos_Mpeg4Enc_SrcIn(): oneFrameSize: %d, bufferHeader: 0x%x", oneFrameSize, pSrcInputData->bufferHeader); 197491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pMFCYUVDataSize[0] = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight; 197591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pMFCYUVDataSize[1] = pMFCYUVDataSize[0] / 2; 1976833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 197791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim#ifdef USE_METADATABUFFERTYPE 19785b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim nAllocLen[0] = ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameWidth) * 19795b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameHeight); 19805b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim nAllocLen[1] = ALIGN(nAllocLen[0]/2,256); 1981833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 19825b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim if ((pExynosInputPort->bStoreMetaData == OMX_TRUE) && 19835b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) { 19845b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim codecReturn = pInbufOps->ExtensionEnqueue(hMFCHandle, 19855b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer, 19865b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.fd, 19875b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim (unsigned int *)nAllocLen, (unsigned int *)pMFCYUVDataSize, 19885b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader); 19895b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim } else { 199091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer, 199191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader); 199291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } 19935b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim#else 19945b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer, 19955b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader); 199691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim#endif 199738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecReturn != VIDEO_ERROR_NONE) { 199838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pInbufOps->Enqueue", __FUNCTION__, __LINE__); 199938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode; 200038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 200138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 2002833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Mpeg4CodecStart(pOMXComponent, INPUT_PORT_INDEX); 2003833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pMpeg4Enc->bSourceStart == OMX_FALSE) { 2004833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pMpeg4Enc->bSourceStart = OMX_TRUE; 2005833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_SignalSet(pMpeg4Enc->hSourceStartEvent); 2006833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_SleepMillisec(0); 2007833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 2008833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pMpeg4Enc->bDestinationStart == OMX_FALSE) { 2009833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pMpeg4Enc->bDestinationStart = OMX_TRUE; 2010833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_SignalSet(pMpeg4Enc->hDestinationStartEvent); 2011833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_SleepMillisec(0); 2012833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim } 2013800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 2014800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 2015800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ret = OMX_ErrorNone; 2016800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 2017800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangEXIT: 201838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 201938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 2020800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang return ret; 2021800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang} 2022800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 202338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData) 2024800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{ 202538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 202638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 202738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 202838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 202938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle; 203038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 203138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 203238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps; 203338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoBuffer *pVideoBuffer; 20345b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim ExynosVideoBuffer videoBuffer; 203520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 203620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 203720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 20385b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim if ((pExynosInputPort->bStoreMetaData == OMX_TRUE) && 20395b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) { 20405b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim if (pInbufOps->ExtensionDequeue(hMFCHandle, &videoBuffer) == VIDEO_ERROR_NONE) 20415b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim pVideoBuffer = &videoBuffer; 20425b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim else 20435b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim pVideoBuffer = NULL; 20445b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim } else { 20455b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim pVideoBuffer = pInbufOps->Dequeue(hMFCHandle); 20465b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim } 204738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 204838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->dataLen = 0; 204938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->usedDataLen = 0; 205038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->remainDataLen = 0; 205138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->nFlags = 0; 205238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->timeStamp = 0; 205338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 205438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoBuffer == NULL) { 205538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL; 205638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->allocSize = 0; 205738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->pPrivate = NULL; 205838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->bufferHeader = NULL; 205938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 206091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim int plane = 0; 206191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) { 206291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr; 206391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pSrcOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd; 206491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } 2065833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize + 206638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoBuffer->planes[1].allocSize + 206738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoBuffer->planes[2].allocSize; 206838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 206938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 207038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i = 0; 207191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim while (pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[0] != pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]) { 207238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (i >= MFC_INPUT_BUFFER_NUM_MAX) { 207338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - Lost buffer", __FUNCTION__, __LINE__); 207438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode; 207538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 207638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 207738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang i++; 207838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 207991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0; 208038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->pPrivate = pVideoEnc->pMFCEncInputBuffer[i]; 208120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 208220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 208338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* For Share Buffer */ 208438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate; 208538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 208638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 208738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 208838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 208938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 209038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 209138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 209238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 209338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 209438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 209538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData) 209638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 209738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 209838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 209938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 210038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 210138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle; 210238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 210338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; 210438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 dataLen = 0; 210538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE; 210638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 210738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 210838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 210938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDstInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) { 211038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer"); 211138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 211238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 211338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 211420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 211591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)&pDstInputData->buffer.singlePlaneBuffer.dataBuffer, 2116833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim (unsigned int *)&dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader); 211720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 211838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecReturn != VIDEO_ERROR_NONE) { 211938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pOutbufOps->Enqueue", __FUNCTION__, __LINE__); 212038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode; 212120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 212220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 2123833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Mpeg4CodecStart(pOMXComponent, OUTPUT_PORT_INDEX); 212420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 212538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 212638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 212738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 212838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 212938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 213038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 213138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 213238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 213338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData) 213438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 213538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 213638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 213738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 213838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 213938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle; 214038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncOps *pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps; 214138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; 214238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoBuffer *pVideoBuffer; 214338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN; 214438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoGeometry bufferGeometry; 214538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_S32 indexTimestamp = 0; 214620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 214738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 214820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 214938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pMpeg4Enc->bDestinationStart == OMX_FALSE) { 215020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 215120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 215220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 215320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 215438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) { 215538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 215638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 215738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 2158800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 215938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp++; 216038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp %= MAX_TIMESTAMP; 216120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 216238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr; 216391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pDstOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd; 216438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->allocSize = pVideoBuffer->planes[0].allocSize; 216538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->dataLen = pVideoBuffer->planes[0].dataSize; 216638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->remainDataLen = pVideoBuffer->planes[0].dataSize; 216738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->usedDataLen = 0; 216838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->pPrivate = pVideoBuffer; 216938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* For Share Buffer */ 217038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate; 217138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 217238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoEnc->bFirstOutput == OMX_FALSE) { 217338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U8 *p = NULL; 217438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 217538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = 0; 217638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags |= OMX_BUFFERFLAG_CODECCONFIG; 217738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME; 2178833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pVideoEnc->bFirstOutput = OMX_TRUE; 217938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 218038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang indexTimestamp = pEncOps->Get_FrameTag(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle); 218138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) { 218238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp]; 218338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp]; 218438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 218538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp]; 218638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp]; 218720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 218838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 218938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME; 219038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoBuffer->frameType == VIDEO_FRAME_I) 219138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags |= OMX_BUFFERFLAG_SYNCFRAME; 219220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 219320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 219438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) || 219538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { 219691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%x displayStatus:%d, nFlags0x%x", pExynosComponent, displayStatus, pDstOutputData->nFlags); 219738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->remainDataLen = 0; 219838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 2199800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 220038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 220120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 220238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 220338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 220420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 220538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 220638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 220720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 220838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData) 220938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 221038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 221138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 221238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 221338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 2214800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 221538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 221620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 221738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) { 221838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 221938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 222038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 222138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) { 222238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 222338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 222438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 222520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 222638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_Mpeg4Enc_SrcIn(pOMXComponent, pSrcInputData); 222738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 222838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - SrcIn -> event is thrown to client", __FUNCTION__, __LINE__); 222938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 223038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 223138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, ret, 0, NULL); 223238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 223320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 223438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 223538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 223620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 223738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 223838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 223920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 224038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData) 224138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 224238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 224338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 224438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 224538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 2246800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 224738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 224838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 224938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) { 225038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 225138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 225238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 2253800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 225438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 225538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) { 225620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 225738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 225820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 225920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 226038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pMpeg4Enc->bSourceStart == OMX_FALSE) && 226138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) { 226238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalWait(pMpeg4Enc->hSourceStartEvent, DEF_MAX_WAIT_TIME); 226338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalReset(pMpeg4Enc->hSourceStartEvent); 226420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 226520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 226638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_Mpeg4Enc_SrcOut(pOMXComponent, pSrcOutputData); 226738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) { 226838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - SrcOut -> event is thrown to client", __FUNCTION__, __LINE__); 226938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 227038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 227138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, ret, 0, NULL); 227220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 227320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 227438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 227538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 227638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 227738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 227838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 227938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 228038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData) 228138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 228238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 228338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 228438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 228538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 228638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 228738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 228838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 228938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) { 229038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 229120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 229220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 229338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) { 229438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 2295800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 229620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 229738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 229838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pMpeg4Enc->bDestinationStart == OMX_FALSE) && 229938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) { 230038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalWait(pMpeg4Enc->hDestinationStartEvent, DEF_MAX_WAIT_TIME); 230138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalReset(pMpeg4Enc->hDestinationStartEvent); 230238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 230338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 230438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_TRUE) { 230538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_Mpeg4Enc_DstIn(pOMXComponent, pDstInputData); 230638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 230738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - DstIn -> event is thrown to client", __FUNCTION__, __LINE__); 230838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 230938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 231038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, ret, 0, NULL); 231138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 231238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 231320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 231420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 231520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 231620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 231720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 231820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 231920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 232038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Mpeg4Enc_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData) 232120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 232238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 232338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 232438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 232538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 232620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 232720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 232820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 232938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) { 2330800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ret = OMX_ErrorNone; 233120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 233220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 233338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) { 2334800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ret = OMX_ErrorNone; 233520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 233620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 233720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 233838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 233938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pMpeg4Enc->bDestinationStart == OMX_FALSE) && 234038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) { 234138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalWait(pMpeg4Enc->hDestinationStartEvent, DEF_MAX_WAIT_TIME); 234238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalReset(pMpeg4Enc->hDestinationStartEvent); 234320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 234438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 234538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_Mpeg4Enc_DstOut(pOMXComponent, pDstOutputData); 234638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) { 234738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - DstOut -> event is thrown to client", __FUNCTION__, __LINE__); 234838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 234938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 235038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, ret, 0, NULL); 235120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 235220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 235320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 235420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 235520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 235620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 235720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 235820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 23593e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom KimOSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName) 236020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 2361800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 2362800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 236320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 2364800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 2365800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; 2366800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 2367800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_S32 codecType = -1; 236820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int i = 0; 236920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 237020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 237120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 237220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((hComponent == NULL) || (componentName == NULL)) { 237320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 237420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: parameters are null, ret: %X", __FUNCTION__, ret); 237520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 237620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 237720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG4_ENC, componentName) == 0) { 237820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang codecType = CODEC_TYPE_MPEG4; 237920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H263_ENC, componentName) == 0) { 238020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang codecType = CODEC_TYPE_H263; 238120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 238220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 238320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName(%s) error, ret: %X", __FUNCTION__, componentName, ret); 238420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 238520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 238620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 238720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 238820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoEncodeComponentInit(pOMXComponent); 238920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 239020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_VideoDecodeComponentInit error, ret: %X", __FUNCTION__, ret); 239120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 239220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 239320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 239420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->codecType = HW_VIDEO_ENC_CODEC; 239520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 239620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE); 239720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->componentName == NULL) { 239820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent); 239920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 240020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName alloc error, ret: %X", __FUNCTION__, ret); 240120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 240220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 240320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE); 240420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 240520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc = Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG4ENC_HANDLE)); 240620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pMpeg4Enc == NULL) { 240720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent); 240820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 240920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: EXYNOS_MPEG4ENC_HANDLE alloc error, ret: %X", __FUNCTION__, ret); 241020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 241120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 241220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pMpeg4Enc, 0, sizeof(EXYNOS_MPEG4ENC_HANDLE)); 241320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 241420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc->hCodecHandle = (OMX_HANDLETYPE)pMpeg4Enc; 241520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->hMFCMpeg4Handle.codecType = codecType; 241620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 241720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (codecType == CODEC_TYPE_MPEG4) 241820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MPEG4_ENC); 241920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 242020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H263_ENC); 242120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 242220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Set componentVersion */ 242320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER; 242420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER; 242520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentVersion.s.nRevision = REVISION_NUMBER; 242620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentVersion.s.nStep = STEP_NUMBER; 242720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Set specVersion */ 242820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER; 242920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER; 243020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->specVersion.s.nRevision = REVISION_NUMBER; 243120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->specVersion.s.nStep = STEP_NUMBER; 243220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 243320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Input port */ 243420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 243520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH; 243620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT; 243720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nBitrate = 64000; 243820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.xFramerate= (15 << 16); 243938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE; 244020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 244120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.pNativeRender = 0; 244220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE; 244320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE); 244420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video"); 244520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 244620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.bEnabled = OMX_TRUE; 244738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->bufferProcessType = BUFFER_COPY; 244838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portWayType = WAY2_PORT; 244920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 245020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Output port */ 245120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 245220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH; 245320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT; 245420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nBitrate = 64000; 245520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.xFramerate= (15 << 16); 245638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE; 245720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (codecType == CODEC_TYPE_MPEG4) { 245820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4; 245920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE); 246020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/mpeg4"); 246120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 246220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263; 246320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE); 246420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/h263"); 246520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 246620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.pNativeRender = 0; 246720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE; 246820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; 246920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.bEnabled = OMX_TRUE; 2470833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pExynosPort->bufferProcessType = BUFFER_SHARE; 247138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portWayType = WAY2_PORT; 247220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 247320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (codecType == CODEC_TYPE_MPEG4) { 247420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for(i = 0; i < ALL_PORT_NUM; i++) { 247520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang INIT_SET_SIZE_VERSION(&pMpeg4Enc->mpeg4Component[i], OMX_VIDEO_PARAM_MPEG4TYPE); 247620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->mpeg4Component[i].nPortIndex = i; 247720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->mpeg4Component[i].eProfile = OMX_VIDEO_MPEG4ProfileSimple; 247820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->mpeg4Component[i].eLevel = OMX_VIDEO_MPEG4Level4; 247920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 248020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->mpeg4Component[i].nPFrames = 10; 248120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->mpeg4Component[i].nBFrames = 0; /* No support for B frames */ 248220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->mpeg4Component[i].nMaxPacketSize = 256; /* Default value */ 248320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->mpeg4Component[i].nAllowedPictureTypes = OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 248420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->mpeg4Component[i].bGov = OMX_FALSE; 248520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 248620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 248720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 248820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for(i = 0; i < ALL_PORT_NUM; i++) { 248920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang INIT_SET_SIZE_VERSION(&pMpeg4Enc->h263Component[i], OMX_VIDEO_PARAM_H263TYPE); 249020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->h263Component[i].nPortIndex = i; 249120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->h263Component[i].eProfile = OMX_VIDEO_H263ProfileBaseline; 249220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->h263Component[i].eLevel = OMX_VIDEO_H263Level45; 249320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 249420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->h263Component[i].nPFrames = 20; 249520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->h263Component[i].nBFrames = 0; /* No support for B frames */ 249620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->h263Component[i].bPLUSPTYPEAllowed = OMX_FALSE; 249720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->h263Component[i].nAllowedPictureTypes = OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 249820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->h263Component[i].bForceRoundingTypeToZero = OMX_TRUE; 249920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->h263Component[i].nPictureHeaderRepetition = 0; 250020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc->h263Component[i].nGOBHeaderInterval = 0; 250120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 250220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 250320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 2504800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pOMXComponent->GetParameter = &Exynos_Mpeg4Enc_GetParameter; 2505800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pOMXComponent->SetParameter = &Exynos_Mpeg4Enc_SetParameter; 2506800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pOMXComponent->GetConfig = &Exynos_Mpeg4Enc_GetConfig; 2507800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pOMXComponent->SetConfig = &Exynos_Mpeg4Enc_SetConfig; 2508800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pOMXComponent->GetExtensionIndex = &Exynos_Mpeg4Enc_GetExtensionIndex; 2509800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pOMXComponent->ComponentRoleEnum = &Exynos_Mpeg4Enc_ComponentRoleEnum; 251020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->ComponentDeInit = &Exynos_OMX_ComponentDeinit; 251120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 251238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_codec_componentInit = &Exynos_Mpeg4Enc_Init; 251338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_codec_componentTerminate = &Exynos_Mpeg4Enc_Terminate; 251438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 251538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_srcInputProcess = &Exynos_Mpeg4Enc_srcInputBufferProcess; 251638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_srcOutputProcess = &Exynos_Mpeg4Enc_srcOutputBufferProcess; 251738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_dstInputProcess = &Exynos_Mpeg4Enc_dstInputBufferProcess; 251838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_dstOutputProcess = &Exynos_Mpeg4Enc_dstOutputBufferProcess; 251938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 252038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_start = &Mpeg4CodecStart; 252138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_stop = &Mpeg4CodecStop; 252238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_bufferProcessRun = &Mpeg4CodecOutputBufferProcessRun; 252338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_enqueueAllBuffer = &Mpeg4CodecEnQueueAllBuffer; 252438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 252538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_checkInputFrame = NULL; 252638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_getCodecInputPrivateData = &GetCodecInputPrivateData; 252738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData; 252838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 252938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->hSharedMemory = Exynos_OSAL_SharedMemory_Open(); 253038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoEnc->hSharedMemory == NULL) { 253138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pMpeg4Enc); 253238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pMpeg4Enc = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL; 253338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent); 253438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 253538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 253638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 253720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 253820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StateLoaded; 253920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 254020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 254120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 254220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 254320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 254420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 254520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 254620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 254720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 254820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent) 254920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 2550800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 2551800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 255220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 255338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; 2554800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc = NULL; 255520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 255620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 255720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 255820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 255920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 256020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 256120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 256220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 256320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 256438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 256538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 256638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SharedMemory_Close(pVideoEnc->hSharedMemory); 256720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 256820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosComponent->componentName); 256920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentName = NULL; 257020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 257120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 257220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pMpeg4Enc != NULL) { 257320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pMpeg4Enc); 257420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pMpeg4Enc = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL; 257520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 257620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 257720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent); 257820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 257920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 258020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 258120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 258220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 258320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 258420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 258520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 258620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 258720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 258820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 2589