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