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