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_Vp8dec.c 2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief 2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author Satish Kumar Reddy (palli.satish@samsung.com) 2238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @author SeungBeom Kim (sbcrux.kim@samsung.com) 2338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version 2.0.0 2420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history 2538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 2012.02.20 : Create 2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h> 2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h> 3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h> 3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Macros.h" 3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Basecomponent.h" 3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Baseport.h" 3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Vdec.h" 3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_ETC.h" 3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Semaphore.h" 3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Thread.h" 3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "library_register.h" 4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Vp8dec.h" 4120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "ExynosVideoApi.h" 4238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_SharedMemory.h" 4338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Event.h" 4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#ifdef USE_ANB 4620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Android.h" 4720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif 4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 49800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang/* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */ 5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */ 5120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "csc.h" 5220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef EXYNOS_LOG_TAG 5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG "EXYNOS_VP8_DEC" 5520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF 5638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//#define EXYNOS_TRACE_ON 5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h" 5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define VP8_DEC_NUM_OF_EXTRA_BUFFERS 7 6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang//#define FULL_FRAME_SEARCH /* Full frame search not support*/ 6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 6338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, void *pVirtAddr, OMX_U32 *dataSize) 6438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 6538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 6638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 6738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 6838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 6938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 7038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 7138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, void *addr[], int size[]) 7238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 7338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 7438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoBuffer *pCodecBuffer; 7538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 7638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecBuffer == NULL) { 7738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 7838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 7938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 8038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 8138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pCodecBuffer = (ExynosVideoBuffer *)codecBuffer; 8238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 8338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (addr != NULL) { 8438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang addr[0] = pCodecBuffer->planes[0].addr; 8538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang addr[1] = pCodecBuffer->planes[1].addr; 8638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang addr[2] = pCodecBuffer->planes[2].addr; 8738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 8838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 8938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (size != NULL) { 9038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang size[0] = pCodecBuffer->planes[0].allocSize; 9138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang size[1] = pCodecBuffer->planes[1].allocSize; 9238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang size[2] = pCodecBuffer->planes[2].allocSize; 9338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 9438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 9538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 9638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 9738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 9838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 9938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic int Check_VP8_Frame( 10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U8 *pInputStream, 10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int buffSize, 10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 flag, 10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_BOOL bPreviousFrameEOF, 10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_BOOL *pbEndOfFrame) 10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Uncompressed data Chunk comprises a common 10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (for key frames and interframes) 3-byte frame tag that 10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang contains four fields 10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang - 1-bit frame type (0 - key frame, 1 - inter frame) 11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang - 3-bit version number (0 - 3 are defined as four different 11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang profiles with different decoding complexity) 11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang - 1-bit show_frame flag ( 0 - current frame not for display, 11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1 - current frame is for dispaly) 11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang - 19-bit field - size of the first data partition in bytes 11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Key Frames : frame tag followed by 7 bytes of uncompressed 11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang data 11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 3-bytes : Start code (byte 0: 0x9d,byte 1: 0x01,byte 2: 0x2a) 11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Next 4-bytes: Width & height, Horizontal and vertical scale information 12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16 bits : (2 bits Horizontal Scale << 14) | Width (14 bits) 12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16 bits : (2 bits Vertical Scale << 14) | Height (14 bits) 12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 12320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int width, height; 12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int horizSscale, vertScale; 12520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *pbEndOfFrame = OMX_TRUE; 12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /*Check for Key frame*/ 13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!(pInputStream[0] & 0x01)){ 13220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Key Frame Start code*/ 13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pInputStream[3] != 0x9d || pInputStream[4] != 0x01 || pInputStream[5]!=0x2a) { 13420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, " VP8 Key Frame Start Code not Found"); 13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *pbEndOfFrame = OMX_FALSE; 13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, " VP8 Found Key Frame Start Code"); 13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang width = (pInputStream[6] | (pInputStream[7] << 8)) & 0x3fff; 13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang horizSscale = pInputStream[7] >> 6; 14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang height = (pInputStream[8] | (pInputStream[9] << 8)) & 0x3fff; 14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang vertScale = pInputStream[9] >> 6; 14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "width = %d, height = %d, horizSscale = %d, vertScale = %d", width, height, horizSscale, vertScale); 14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return buffSize; 14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_BOOL Check_VP8_StartCode( 15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U8 *pInputStream, 15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 streamSize) 15220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 15320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "streamSize: %d",streamSize); 15420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (streamSize < 3) { 15520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return OMX_FALSE; 15620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 15720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!(pInputStream[0] & 0x01)){ 15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Key Frame Start code*/ 16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pInputStream[3] != 0x9d || pInputStream[4] != 0x01 || pInputStream[5]!=0x2a) { 16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, " VP8 Key Frame Start Code not Found"); 16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return OMX_FALSE; 16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, " VP8 Found Key Frame Start Code"); 16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return OMX_TRUE; 16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 17038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecOpen(EXYNOS_VP8DEC_HANDLE *pVp8Dec) 17138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 1723e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim OMX_ERRORTYPE ret = OMX_ErrorNone; 17338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = NULL; 17438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = NULL; 17538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = NULL; 17638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 17738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 17838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 17938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec == NULL) { 18038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 18138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__); 18238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 18338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 18438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 18538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* alloc ops structure */ 18638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps = (ExynosVideoDecOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps)); 18738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps)); 18838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps)); 18938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 19038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pDecOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) { 19138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate decoder ops buffer"); 19238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 19338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 19438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 19538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 19638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.pDecOps = pDecOps; 19738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.pInbufOps = pInbufOps; 19838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.pOutbufOps = pOutbufOps; 19938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 20038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* function pointer mapping */ 20138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps->nSize = sizeof(ExynosVideoDecOps); 20238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps->nSize = sizeof(ExynosVideoDecBufferOps); 20338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->nSize = sizeof(ExynosVideoDecBufferOps); 20438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 20538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_Video_Register_Decoder(pDecOps, pInbufOps, pOutbufOps); 2063e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim 20738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* check mandatory functions for decoder ops */ 20838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pDecOps->Init == NULL) || (pDecOps->Finalize == NULL) || 20938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pDecOps->Get_ActualBufferCount == NULL) || (pDecOps->Set_FrameTag == NULL) || 21038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pDecOps->Get_FrameTag == NULL)) { 21138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied"); 21238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 21338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 21438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 21538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 21638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* check mandatory functions for buffer ops */ 21738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) || 21838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) || 21938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) || 22038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) || 22138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) { 22238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied"); 22338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 22438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 22538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 22638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 22738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* alloc context, open, querycap */ 228c94beaeb6990ddf010f7934c201f68e2d66dff62SeungBeom Kim pVp8Dec->hMFCVp8Handle.hMFCHandle = pVp8Dec->hMFCVp8Handle.pDecOps->Init(V4L2_MEMORY_DMABUF); 22938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->hMFCVp8Handle.hMFCHandle == NULL) { 23038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer"); 23138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 23238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 23338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 23438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 23538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 23638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 23738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 238440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (ret != OMX_ErrorNone) { 239440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (pDecOps != NULL) { 240440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim Exynos_OSAL_Free(pDecOps); 241440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim pVp8Dec->hMFCVp8Handle.pDecOps = NULL; 242440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim } 243440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (pInbufOps != NULL) { 244440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim Exynos_OSAL_Free(pInbufOps); 245440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim pVp8Dec->hMFCVp8Handle.pInbufOps = NULL; 246440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim } 247440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (pOutbufOps != NULL) { 248440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim Exynos_OSAL_Free(pOutbufOps); 249440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim pVp8Dec->hMFCVp8Handle.pOutbufOps = NULL; 250440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim } 251440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim } 252440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim 25338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 25438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 25538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 25638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 25738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 25838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecClose(EXYNOS_VP8DEC_HANDLE *pVp8Dec) 25938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 2603e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim OMX_ERRORTYPE ret = OMX_ErrorNone; 26138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = NULL; 26238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = NULL; 26338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = NULL; 26438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = NULL; 26538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 2663e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim FunctionIn(); 2673e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim 26838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec == NULL) { 26938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 27038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 27138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 27238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 27338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 27438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 27538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 27638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 27738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 27838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (hMFCHandle != NULL) { 27938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps->Finalize(hMFCHandle); 2803e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim pVp8Dec->hMFCVp8Handle.hMFCHandle = NULL; 28138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 28238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps != NULL) { 28338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pOutbufOps); 2843e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim pVp8Dec->hMFCVp8Handle.pOutbufOps = NULL; 28538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 28638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pInbufOps != NULL) { 28738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pInbufOps); 2883e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim pVp8Dec->hMFCVp8Handle.pInbufOps = NULL; 28938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 29038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDecOps != NULL) { 29138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pDecOps); 2923e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim pVp8Dec->hMFCVp8Handle.pDecOps = NULL; 29338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 29438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 29538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 29638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 29738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 29838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 29938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 30038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 30138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 30238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 30338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex) 30438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 30538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 30638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = NULL; 30738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = NULL; 30838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = NULL; 30938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = NULL; 31038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 31138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 31238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 3133e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim FunctionIn(); 3143e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim 31538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent == NULL) { 31638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 31738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 31838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 31938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 32038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle; 32138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec == NULL) { 32238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 32338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 32438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 3253e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim 32638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle; 32738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec == NULL) { 32838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 32938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 33038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 33138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 33238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 33338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 33438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 33538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 33638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 33738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPortIndex == INPUT_PORT_INDEX) 33838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps->Run(hMFCHandle); 33938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang else if (nPortIndex == OUTPUT_PORT_INDEX) 34038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Run(hMFCHandle); 34138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 34238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 34338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 34438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 34538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 34638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 34738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 34838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 34938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 35038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex) 35138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 35238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 35338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = NULL; 35438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = NULL; 35538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = NULL; 35638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = NULL; 35738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 35838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 35938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 3603e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim FunctionIn(); 3613e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim 36238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent == NULL) { 36338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 36438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 36538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 36638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 36738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle; 36838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec == NULL) { 36938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 37038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 37138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 37238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle; 37338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec == NULL) { 37438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 37538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 37638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 37738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 37838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 37938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 38038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 38138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 38238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 383440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL)) 38438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps->Stop(hMFCHandle); 385440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL)) 38638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Stop(hMFCHandle); 38738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 38838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 38938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 39038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 39138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 39238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 39338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 39438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 39538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 39638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex) 39738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 39838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 39938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = NULL; 40038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = NULL; 40138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = NULL; 40238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = NULL; 40338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 40438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 40538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 4063e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim FunctionIn(); 4073e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim 40838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent == NULL) { 40938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 41038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 41138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 41238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 41338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle; 41438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec == NULL) { 41538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 41638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 41738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 41838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle; 41938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec == NULL) { 42038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 42138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 42238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 42338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 42438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 42538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 42638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 42738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 42838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 42938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPortIndex == INPUT_PORT_INDEX) { 43038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->bSourceStart == OMX_FALSE) { 43138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pVp8Dec->hSourceStartEvent); 43238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 43338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 43438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 43538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 43638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPortIndex == OUTPUT_PORT_INDEX) { 43738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->bDestinationStart == OMX_FALSE) { 43838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pVp8Dec->hDestinationStartEvent); 43938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 44038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 44138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 44238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 44338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 44438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 44538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 44638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 44738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 44838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 44938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 45038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 45138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex) 45238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 45338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 45438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 45538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 45638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 45738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 45838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 45938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 46038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i, nOutbufs; 46138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 46238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 46338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 46438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 46538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 4663e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim FunctionIn(); 46738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 46838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((nPortIndex == INPUT_PORT_INDEX) && 46938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pVp8Dec->bSourceStart == OMX_TRUE)) { 47038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX); 47138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 4723e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 47338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]); 474ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]); 47538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 47638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]); 47738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 47838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 47938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps->Clear_Queue(hMFCHandle); 48038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if ((nPortIndex == OUTPUT_PORT_INDEX) && 48138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pVp8Dec->bDestinationStart == OMX_TRUE)) { 48294d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0}; 48338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoBuffer *pBuffer = NULL; 48438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 48538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX); 48638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 48738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang nOutbufs = pDecOps->Get_ActualBufferCount(hMFCHandle); 48838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang nOutbufs += EXTRA_DPB_NUM; 48938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < nOutbufs; i++) { 49038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer); 49138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer); 49238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 49338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Clear_Queue(hMFCHandle); 49438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 49538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 49638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 49738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 49838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 49938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 50038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 50138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 50238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 50338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 50438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 50538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData) 50638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 50738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 50838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 50938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 51038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 51238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 51338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 51438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 oneFrameSize = pSrcInputData->dataLen; 51538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 51638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 51738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 51838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 51938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoGeometry bufferConf; 52038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 inputBufferNumber = 0; 52138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i; 52238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 52338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 52438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 52538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) { 52654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim OMX_BUFFERHEADERTYPE *OMXBuffer = NULL; 52754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent); 52854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim if (OMXBuffer == NULL) { 52938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 53038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 53138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 53238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 53354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim OMXBuffer->nTimeStamp = pSrcInputData->timeStamp; 53454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim OMXBuffer->nFlags = pSrcInputData->nFlags; 53554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer); 53638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 53738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 53838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 53938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 54038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 54138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->bThumbnailMode == OMX_TRUE) 54238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps->Set_DisplayDelay(hMFCHandle, 0); 54338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 54438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* input buffer info */ 54538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf)); 54638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferConf.eCompressionFormat = VIDEO_CODING_VP8; 5471ed2fc89aa809989164905497b680fa10e74a134Dima Zavin pInbufOps->Set_Shareable(hMFCHandle); 54838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 54994d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth 55094d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2; 55138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM; 55238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 55338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE; 55438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX; 55538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 55638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 55738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* should be done before prepare input buffer */ 55838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) { 55938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 56038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 56138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 56238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 56338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* set input buffer geometry */ 56438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) { 56538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer"); 56638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 56738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 56838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 56938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 57038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* setup input buffer */ 57138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) { 57238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer"); 57338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 57438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 57538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 57638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 57738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 57838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Register input buffer */ 57938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 58001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin ExynosVideoPlane plane; 581ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim plane.addr = pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]; 582ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize[0]; 583ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim plane.fd = pVideoDec->pMFCDecInputBuffer[i]->fd[0]; 58494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) { 58538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer"); 58638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 58738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 58838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 58938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 59138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Register input buffer */ 59238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) { 59301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin ExynosVideoPlane plane; 59401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer; 59501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen; 59601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0]; 59794d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) { 59838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer"); 59938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 60038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 60138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 60238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 60338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 60438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 60538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* set output geometry */ 60638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf)); 60738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED; 60838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) { 60938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer"); 61038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 61138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 61238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 61338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 61438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* input buffer enqueue for header parsing */ 6153e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize); 61694d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, 61794d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) { 61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing"); 61938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang// ret = OMX_ErrorInsufficientResources; 62038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit; 62138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 62238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 62338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 62438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* start header parsing */ 62538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) { 62638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing"); 62738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorCodecInit; 62838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 62938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 63038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 63138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* get geometry for output */ 63238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(&pVp8Dec->hMFCVp8Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry)); 63338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Get_Geometry(hMFCHandle, &pVp8Dec->hMFCVp8Handle.codecOutbufConf) != VIDEO_ERROR_NONE) { 63438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info"); 63538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 63638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 63938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* get dpb count */ 640bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim pVp8Dec->hMFCVp8Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle); 64138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->bThumbnailMode == OMX_FALSE) 642bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim pVp8Dec->hMFCVp8Handle.maxDPBNum += EXTRA_DPB_NUM; 643bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Vp8CodecSetup nOutbufs: %d", pVp8Dec->hMFCVp8Handle.maxDPBNum); 64438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 64538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_TRUE; 64638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 64738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 64838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) || 64938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight)) { 65038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth; 65138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight; 65238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); 65338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); 65438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 65538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_UpdateFrameSize(pOMXComponent); 65638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE; 65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 65838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /** Send Port Settings changed call back **/ 65938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (*(pExynosComponent->pCallbacks->EventHandler)) 66038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pOMXComponent, 66138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 66238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventPortSettingsChanged, /* The command was completed */ 66338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_DirOutput, /* This is the port index */ 66438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 0, 66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang NULL); 66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 66738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 66838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) || 66938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight) || 670bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim (pExynosOutputPort->portDefinition.nBufferCountActual != pVp8Dec->hMFCVp8Handle.maxDPBNum)) { 67138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth; 67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight; 67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); 67438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); 67538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 676bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim pExynosOutputPort->portDefinition.nBufferCountActual = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2; 677bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim pExynosOutputPort->portDefinition.nBufferCountMin = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2; 67838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 67938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_UpdateFrameSize(pOMXComponent); 68038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE; 68138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 68238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /** Send Port Settings changed call back **/ 68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (*(pExynosComponent->pCallbacks->EventHandler)) 68438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pOMXComponent, 68538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventPortSettingsChanged, /* The command was completed */ 68738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_DirOutput, /* This is the port index */ 68838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 0, 68938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang NULL); 69038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 69138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInputDataDecodeYet; 69438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecStop(pOMXComponent, INPUT_PORT_INDEX); 69538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 69638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 69738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 69838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 69938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 70238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent) 70338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 70438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 70538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 70638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 70738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 71038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 71138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 71238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 71338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 71438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 71557fbf5bae538500a8332718cec7a7446e02d4da4SeungBeom Kim 71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i, nOutbufs; 71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 71938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 72038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* get dpb count */ 721bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim nOutbufs = pVp8Dec->hMFCVp8Handle.maxDPBNum; 72238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 723fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 724fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim /* should be done before prepare output buffer */ 725fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) { 726fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim ret = OMX_ErrorInsufficientResources; 727fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim goto EXIT; 728fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim } 72938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 73138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Set_Shareable(hMFCHandle); 73238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) { 73338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer"); 73438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 73538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 73638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 738ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE]; 739ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0}; 74094d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0}; 741ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim int plane; 742ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 743ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim nAllocLen[0] = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth, 744ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight); 745ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim nAllocLen[1] = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth, 746ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight >> 1); 747ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 74838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 74901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin /* Register output buffer */ 75038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < nOutbufs; i++) { 751ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER)); 752ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER)); 75301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin 75494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) { 755ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] = 756ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], NORMAL_MEMORY); 757ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) { 758ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer"); 759ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim ret = OMX_ErrorInsufficientResources; 760ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim goto EXIT; 761ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 762ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] = 763ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, 764ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]); 765ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane]; 766ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 767ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]; 76801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane]; 769ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane]; 77001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin } 77101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin 77294d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) { 77338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer"); 77438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 77538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 77638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 777ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr, 77894d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL); 77938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 78038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 78101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin /* Register output buffer */ 78238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 78338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 78438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 785ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#ifdef USE_ANB 786ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) { 787ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) { 788ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) { 789ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane]; 790ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane]; 791ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim planes[plane].allocSize = nAllocLen[plane]; 792ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 793ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 794ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) { 795ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer"); 796ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim ret = OMX_ErrorInsufficientResources; 797ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim goto EXIT; 798ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 799569b6f9c0afe66023cc50fe41664240f67b7c6bfSeungBeom Kim pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf, 800569b6f9c0afe66023cc50fe41664240f67b7c6bfSeungBeom Kim (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL); 80138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 802ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } else { 803ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim ret = OMX_ErrorNotImplemented; 804ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim goto EXIT; 80538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 806ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#else 807ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim ret = OMX_ErrorNotImplemented; 808ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim goto EXIT; 809ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#endif 81038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 811ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 81238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) { 81338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer"); 81438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 81538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 81638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 81738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 81838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 81938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecStop (pOMXComponent, OUTPUT_PORT_INDEX); 82038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_TRUE; 82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 82438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 82538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 82738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 82938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 83138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetParameter( 83220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 83320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_INDEXTYPE nParamIndex, 83420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_INOUT OMX_PTR pComponentParameterStructure) 83520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 83638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 83820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 83920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 84020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 84120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 84220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL || pComponentParameterStructure == NULL) { 84320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 84420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 84520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 84620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 84720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 84820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 84920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 85020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 85120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 85220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 85320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 85420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 85520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 85620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 85720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid ) { 85820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 85920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 86020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 86120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 86220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nParamIndex) { 86320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamStandardComponentRole: 86420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 86520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure; 86620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); 86720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 86820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 86920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 87020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 87120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE); 87220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 87320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 87420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamVideoErrorCorrection: 87520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 87620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure; 87720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL; 87820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 87920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 88020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE)); 88120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 88220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 88320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 88420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 88520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) { 88620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 88720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 88820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 88920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 89020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 89120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pSrcErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX]; 89220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 89320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC; 89420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync; 89520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing; 89620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning; 89720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC; 89820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 89920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 90020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 90120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure); 90220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 90320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 90420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 90520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 90620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 90720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 90820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 90920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 91038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SetParameter( 91120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 91220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_INDEXTYPE nIndex, 91320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_PTR pComponentParameterStructure) 91420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 91538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 91638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 91720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 91820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 91920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 92020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 92120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL || pComponentParameterStructure == NULL) { 92220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 92320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 92420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 92520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 92620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 92720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 92820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 92920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 93020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 93120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 93220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 93320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 93420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 93520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 93620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid ) { 93720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 93820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 93920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 94020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 94120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 94220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamStandardComponentRole: 94320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 94420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure; 94520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 94620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); 94720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 94820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 94920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 95020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 95120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) { 95220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 95320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 95420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 95520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 95620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE)) { 95720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX; 95820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 95920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 96020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 96120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 96220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 96320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 96420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamVideoErrorCorrection: 96520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 96620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure; 96720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL; 96820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 96920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 97020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE)); 97120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 97220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 97320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 97420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 97520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) { 97620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 97720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 97820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 97920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 98020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 98120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX]; 98220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 98320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC; 98420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync; 98520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing; 98620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning; 98720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC; 98820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 98920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 99020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 99120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure); 99220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 99320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 99420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 99520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 99620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 99720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 99820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 99920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 100038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetConfig( 100120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent, 100220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_INDEXTYPE nIndex, 100320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PTR pComponentConfigStructure) 100420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 100520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 100620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 100720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 100820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 100920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 101020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1011440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (hComponent == NULL || pComponentConfigStructure == NULL) { 101220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 101320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 101420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 101520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 101620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 101720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 101820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 101920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 102020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 102120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 102220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 102320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 102420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 102620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 102720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 102820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 102920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 103020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 103120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 103220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure); 103320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 103420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 103520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 103620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 103720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 103820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 103920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 104020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 104120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 104238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SetConfig( 104320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent, 104420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_INDEXTYPE nIndex, 104520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PTR pComponentConfigStructure) 104620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 104720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 104820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 104920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 105020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 105120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 105220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1053440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (hComponent == NULL || pComponentConfigStructure == NULL) { 105420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 105520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 105620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 105720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 105820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 105920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 106020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 106120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 106220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 106320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 106420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 106520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 106620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 106720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 106820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 106920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 107020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 107120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 107220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure); 107520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 107620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 107720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 107820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 107920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 108020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 108120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 108220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 108320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 108438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetExtensionIndex( 108520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 108620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_STRING cParameterName, 10873e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim OMX_OUT OMX_INDEXTYPE *pIndexType) 108820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 108920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 109020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 109120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 109220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 109520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 110020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 110120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 110420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 110520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 110720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 110920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((cParameterName == NULL) || (pIndexType == NULL)) { 111020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 111220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 111320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 111420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 111520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 111620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 111720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 111820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) { 111920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 112020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *pIndexType = OMX_IndexVendorThumbnailMode; 112120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 112220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 112320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType); 112420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 112920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 113020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 113238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_ComponentRoleEnum( 113320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent, 113420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U8 *cRole, 113520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 nIndex) 113620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 113720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 113820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 113920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 114020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 114120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 114220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 114320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((hComponent == NULL) || (cRole == NULL)) { 114420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 114520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 114620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 114720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) { 114820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE); 114920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNoMore; 115220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 115320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 115420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 115520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 115620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 115720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 115820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 115920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 116020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Init */ 116138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_Init(OMX_COMPONENTTYPE *pOMXComponent) 116220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 11633e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim OMX_ERRORTYPE ret = OMX_ErrorNone; 11643e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 11653e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 11663e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 11673e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 11683e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle; 11693e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim OMX_PTR hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 117038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 117138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = NULL; 117238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = NULL; 117338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = NULL; 117420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 117520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang CSC_METHOD csc_method = CSC_METHOD_SW; 1176ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim int i, plane; 1177800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 11783e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim FunctionIn(); 11793e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim 118038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_FALSE; 118138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_FALSE; 118238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->bUseFlagEOF = OMX_TRUE; 118338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->bSaveFlagEOS = OMX_FALSE; 118438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 118538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* H.264 Codec Open */ 118638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = VP8CodecOpen(pVp8Dec); 118738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 118820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 118920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 119020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 119138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 119238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 119338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 119438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 119538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 119638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID); 119738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); 119838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 11993e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 1200ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER)); 1201ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER)); 120238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]); 1203ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 1204ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) { 1205ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim /* Use ION Allocator */ 1206ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY); 1207ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]); 1208ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE; 1209ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0; 1210ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) { 1211ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer"); 1212ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim ret = OMX_ErrorInsufficientResources; 1213ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim goto EXIT; 1214ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 1215ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]); 1216ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 121738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 121838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]); 121920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 122038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 122138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 122238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 122338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 122438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 122520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 122620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 122738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 122838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID); 122938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); 123038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 123138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 123238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 123338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 123438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 123538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 123638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 123738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bSourceStart = OMX_FALSE; 123838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalCreate(&pVp8Dec->hSourceStartEvent); 123938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bDestinationStart = OMX_FALSE; 124038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalCreate(&pVp8Dec->hDestinationStartEvent); 124120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 124220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP); 124320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS); 124420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec->hMFCVp8Handle.indexTimestamp = 0; 124520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = 0; 124620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 124720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->getAllDelayBuffer = OMX_FALSE; 124820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 124938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#if 0//defined(USE_CSC_GSCALER) 125038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang csc_method = CSC_METHOD_HW; //in case of Use ION buffer. 1251800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#endif 125238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->csc_handle = csc_init(csc_method); 125338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->csc_handle == NULL) { 125438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 125538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 1256800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 125738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->csc_set_format = OMX_FALSE; 125820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 125920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 126020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 126120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 126220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 126320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 126420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 126520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Terminate */ 126638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent) 126720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 126838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 126938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 127038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 127138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 127238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 127338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 127438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PTR hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 127538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 127638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 127738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 127838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 127938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 1280ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim int i, plane; 128120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 128220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 128320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 128438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->csc_handle != NULL) { 128538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang csc_deinit(pVideoDec->csc_handle); 128638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->csc_handle = NULL; 128738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 128820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 128938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pVp8Dec->hDestinationStartEvent); 129038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hDestinationStartEvent = NULL; 129138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bDestinationStart = OMX_FALSE; 129238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pVp8Dec->hSourceStartEvent); 129338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hSourceStartEvent = NULL; 129438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bSourceStart = OMX_FALSE; 129538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 129638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 12973e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) { 129838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) { 1299ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) { 1300ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL) 1301ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]); 1302ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 1303ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 130438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]); 130538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecOutputBuffer[i] = NULL; 130638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 130738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 130820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 130938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ); 131038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID); 131138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 131238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 131338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 131438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 131538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 131620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 131720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 131838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 13193e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 132038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->pMFCDecInputBuffer[i] != NULL) { 1321ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) { 1322ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL) 1323ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]); 1324ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 1325ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 13263e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]); 13273e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i] = NULL; 13283e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim } 132938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 133020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 133138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ); 133238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID); 133338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 133438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 133538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 133638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 133738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 133820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 133938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecClose(pVp8Dec); 134020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 134120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 134220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 134320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 134420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 134520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 134620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 134738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData) 134820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 134938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 135038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 135138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 135238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 135338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 135438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 135538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 135638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 oneFrameSize = pSrcInputData->dataLen; 135738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 135838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 135938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 136038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE; 136138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i; 136220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 136320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 136420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 136538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc == OMX_FALSE) { 136638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = VP8CodecSrcSetup(pOMXComponent, pSrcInputData); 136720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 136820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 136938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_FALSE) { 137038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = VP8CodecDstSetup(pOMXComponent); 137138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 137238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 137338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((Check_VP8_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize) == OMX_TRUE) || 13743e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { 137538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->timeStamp; 137638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->nFlags; 137738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pVp8Dec->hMFCVp8Handle.indexTimestamp, pSrcInputData->nFlags); 137838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps->Set_FrameTag(hMFCHandle, pVp8Dec->hMFCVp8Handle.indexTimestamp); 137938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.indexTimestamp++; 138038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.indexTimestamp %= MAX_TIMESTAMP; 138138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 138238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* queue work for input buffer */ 138338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer); 138494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, 138594d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader); 138638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecReturn != VIDEO_ERROR_NONE) { 138738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode; 138838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__); 138920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 139020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 139138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecStart(pOMXComponent, INPUT_PORT_INDEX); 139238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->bSourceStart == OMX_FALSE) { 139338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bSourceStart = OMX_TRUE; 139438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pVp8Dec->hSourceStartEvent); 139538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 139638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 139738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->bDestinationStart == OMX_FALSE) { 139838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bDestinationStart = OMX_TRUE; 139938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pVp8Dec->hDestinationStartEvent); 140038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 1401800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 1402800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 1403800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 140438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 140520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 140638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 140738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 140820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 140938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 141038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 141120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 141238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData) 141338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 141438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 141538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 141638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 141738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 141838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 141938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 142038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 142138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 142238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoBuffer *pVideoBuffer; 142320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 142438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 142520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 142638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoBuffer = pInbufOps->Dequeue(hMFCHandle); 142720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 142838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->dataLen = 0; 142938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->usedDataLen = 0; 143038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->remainDataLen = 0; 143138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->nFlags = 0; 143238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->timeStamp = 0; 143320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 143438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoBuffer == NULL) { 143538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL; 143638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->allocSize = 0; 143738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->pPrivate = NULL; 143838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->bufferHeader = NULL; 143938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 144038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr; 144101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd; 144238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize; 144338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 144438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 144538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i = 0; 1446ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) { 144738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (i >= MFC_INPUT_BUFFER_NUM_MAX) { 144838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer"); 14493e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode; 145038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 145138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 145238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang i++; 145338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 145438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0; 145538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i]; 145620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 145720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 145838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* For Share Buffer */ 145938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate; 146020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 146120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 146238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 146320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 146420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 146520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 146638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 146720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 146820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 1469800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 147038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData) 147120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 147238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 147338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 147438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 147538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 147638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 1477ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 147838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 147938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 148094d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,}; 148138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE; 148220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 148320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 148420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 148538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) { 148638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer"); 148738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 148820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 148920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 149020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1491ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__, 1492ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0], 1493ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]); 1494ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 149594d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer, 149694d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader); 149794d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim 149838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecReturn != VIDEO_ERROR_NONE) { 149938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__); 15003e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode; 150138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 150238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 150338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecStart(pOMXComponent, OUTPUT_PORT_INDEX); 150420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 150538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 150620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 150738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 150838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 150920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 151038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 151138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 151220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 151338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData) 151438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 151538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 151638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 151738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 151838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 151938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 152038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 152138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 152238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 152338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 152438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoBuffer *pVideoBuffer; 152538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN; 152638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoGeometry *bufferGeometry; 152738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL; 152838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_S32 indexTimestamp = 0; 1529ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim int plane; 153020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 153138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 153220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 153338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->bDestinationStart == OMX_FALSE) { 153438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 153538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 153638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 153720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 153838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (1) { 153938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) { 154038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 154138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 154238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 154338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang displayStatus = pVideoBuffer->displayStatus; 154438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus); 154538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 154638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) || 154738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) || 154838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) || 154938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) { 155038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoBuffer != NULL) { 155138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 155238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 155320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 155438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 155538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 155620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 155720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 155838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 155938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 156038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) 156138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 156238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 156338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.outputIndexTimestamp++; 156438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.outputIndexTimestamp %= MAX_TIMESTAMP; 156538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 1566ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstOutputData->allocSize = pDstOutputData->dataLen = 0; 1567ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) { 1568ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr; 1569ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd; 1570ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize; 1571ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstOutputData->dataLen += pVideoBuffer->planes[plane].dataSize; 1572ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 157338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->usedDataLen = 0; 157438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->pPrivate = pVideoBuffer; 157538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* For Share Buffer */ 157638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate; 157738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 157838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo; 157938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferGeometry = &pVp8Dec->hMFCVp8Handle.codecOutbufConf; 158038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pBufferInfo->imageWidth = bufferGeometry->nFrameWidth; 158138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pBufferInfo->imageHeight = bufferGeometry->nFrameHeight; 158238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang switch (bufferGeometry->eColorFormat) { 158338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case VIDEO_COLORFORMAT_NV12: 158438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 158538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 158638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case VIDEO_COLORFORMAT_NV12_TILED: 158738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang default: 158838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled; 158938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 159038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 159138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 159238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle); 15933e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp); 159438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) { 159538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) && 159638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) { 159738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp]; 159838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp]; 15993e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp); 160038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 160138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = 0x00; 160238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = 0x00; 160320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 160420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 160538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* For timestamp correction. if mfc support frametype detect */ 160638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType); 160738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef NEED_TIMESTAMP_REORDER 160838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) { 160938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp]; 161038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp]; 161138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = indexTimestamp; 161238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 161338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp]; 161438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp]; 161520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 161638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#else 161738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp]; 161838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp]; 161938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif 162038ef2572d26fc760c584a1855a3d002f34eb0231Jiho 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); 162138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 162220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 162338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) || 162438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { 16253e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags); 162638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->remainDataLen = 0; 162738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 162838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2; 162938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 163038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 163138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 163238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 163338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 163438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 163538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 163638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 163738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 163838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 163938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData) 164038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 164138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 164238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 164338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 164438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 164520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 164638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 164720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 164838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) { 164920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 165038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 165120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 165238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) { 165338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 165438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 165520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 165620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 165738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_VP8Dec_SrcIn(pOMXComponent, pSrcInputData); 165838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) { 165938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 166038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 166138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, ret, 0, NULL); 166238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 166320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 166438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 166538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 166620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 166738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 166838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 1669800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 167038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData) 167138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 167238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 167338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 167438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 167538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 167620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 167738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 167820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 167938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) { 168038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 168138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 168238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 1683800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 168438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 168538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) { 168638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 168738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 168820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 168938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 169038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVp8Dec->bSourceStart == OMX_FALSE) && 169138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) { 169238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalWait(pVp8Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME); 169338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalReset(pVp8Dec->hSourceStartEvent); 169438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 169520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 169638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_VP8Dec_SrcOut(pOMXComponent, pSrcOutputData); 169738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((ret != OMX_ErrorNone) && 169838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosComponent->currentState == OMX_StateExecuting)) { 169938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 170038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 170138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, ret, 0, NULL); 170238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 170320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 170438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 170538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 170620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 170738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 170838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 170938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 171038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData) 171138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 171238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 171338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 171438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 171538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 171638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 171738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 171838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 171938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) { 172038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 172138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 172238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 172338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) { 172438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 172538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 172638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 172738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 172838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVp8Dec->bDestinationStart == OMX_FALSE) && 172938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) { 173038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalWait(pVp8Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME); 173138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalReset(pVp8Dec->hDestinationStartEvent); 173220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 173338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 173438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_TRUE) { 173538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_VP8Dec_DstIn(pOMXComponent, pDstInputData); 173638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 173738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 173838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 173938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, ret, 0, NULL); 174020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 174120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 174220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 174320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 174420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 174520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 174620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 174720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 174820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 174938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData) 175020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 175138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 175238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 175338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 175438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 175520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 175620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 175720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 175838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) { 175920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 176020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 176120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 176238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) { 176320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 176420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 176520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 176620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 176738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 176838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVp8Dec->bDestinationStart == OMX_FALSE) && 176938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) { 177038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalWait(pVp8Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME); 177138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalReset(pVp8Dec->hDestinationStartEvent); 177220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 177338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 177438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_VP8Dec_DstOut(pOMXComponent, pDstOutputData); 177538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((ret != OMX_ErrorNone) && 177638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosComponent->currentState == OMX_StateExecuting)) { 177738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 177838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 177938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, ret, 0, NULL); 178020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 178120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 178220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 178320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 178420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 178520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 178620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 178720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 178820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit( 178920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent, 179020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_STRING componentName) 179120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 179220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 179320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 179420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 179520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 179620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 179720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 179820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int i = 0; 179920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 180020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 180120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 180220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((hComponent == NULL) || (componentName == NULL)) { 180320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 180420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__); 180520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 180620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 180720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_VP8_DEC, componentName) != 0) { 180820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 180920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__); 181020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 181120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 181220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 181320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 181420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent); 181520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 181620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__); 181720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 181820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 181920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 182020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->codecType = HW_VIDEO_DEC_CODEC; 182120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 182220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE); 182320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->componentName == NULL) { 182420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent); 182520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 182620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 182720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 182820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 182920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE); 183020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 183120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_VP8DEC_HANDLE)); 183220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pVp8Dec == NULL) { 183320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent); 183420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 183520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 183620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 183720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 183820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pVp8Dec, 0, sizeof(EXYNOS_VP8DEC_HANDLE)); 183920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 184020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pVp8Dec; 184120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 184220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_VP8_DEC); 184320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 184420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Set componentVersion */ 184520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER; 184620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER; 184720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentVersion.s.nRevision = REVISION_NUMBER; 184820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentVersion.s.nStep = STEP_NUMBER; 184920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Set specVersion */ 185020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER; 185120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER; 185220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->specVersion.s.nRevision = REVISION_NUMBER; 185320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->specVersion.s.nStep = STEP_NUMBER; 185420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 185520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Input port */ 185620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 185720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH; 185820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT; 185920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/ 186020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nSliceHeight = 0; 186120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE; 186220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX; 186320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE); 186420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/x-vnd.on2.vp8"); 186520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.pNativeRender = 0; 186620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE; 186720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; 186820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.bEnabled = OMX_TRUE; 186938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->bufferProcessType = BUFFER_SHARE; 187038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portWayType = WAY2_PORT; 187120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 187220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Output port */ 187320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 187420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH; 187520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT; 187620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/ 187720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nSliceHeight = 0; 187820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE; 187920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 188020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE); 188120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video"); 188220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.pNativeRender = 0; 188320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE; 188420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar; 188520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.bEnabled = OMX_TRUE; 188638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE; 188738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portWayType = WAY2_PORT; 188838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 188938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent->GetParameter = &Exynos_VP8Dec_GetParameter; 189038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent->SetParameter = &Exynos_VP8Dec_SetParameter; 189138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent->GetConfig = &Exynos_VP8Dec_GetConfig; 189238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent->SetConfig = &Exynos_VP8Dec_SetConfig; 189338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent->GetExtensionIndex = &Exynos_VP8Dec_GetExtensionIndex; 189438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent->ComponentRoleEnum = &Exynos_VP8Dec_ComponentRoleEnum; 189520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->ComponentDeInit = &Exynos_OMX_ComponentDeinit; 189620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 189738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_codec_componentInit = &Exynos_VP8Dec_Init; 189838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_codec_componentTerminate = &Exynos_VP8Dec_Terminate; 189938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 190038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_srcInputProcess = &Exynos_VP8Dec_srcInputBufferProcess; 190138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_srcOutputProcess = &Exynos_VP8Dec_srcOutputBufferProcess; 190238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_dstInputProcess = &Exynos_VP8Dec_dstInputBufferProcess; 190338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_dstOutputProcess = &Exynos_VP8Dec_dstOutputBufferProcess; 190438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 19053e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim pVideoDec->exynos_codec_start = &VP8CodecStart; 19063e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim pVideoDec->exynos_codec_stop = &VP8CodecStop; 190738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_bufferProcessRun = &VP8CodecOutputBufferProcessRun; 190838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_enqueueAllBuffer = &VP8CodecEnQueueAllBuffer; 190938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 191038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_checkInputFrame = &Check_VP8_Frame; 191138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_getCodecInputPrivateData = &GetCodecInputPrivateData; 191238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData; 191338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 191438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open(); 191538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->hSharedMemory == NULL) { 19163e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 191738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pVp8Dec); 191838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL; 191938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent); 192038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 192138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 192238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 192320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 192420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StateLoaded; 192520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 192620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 192720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 192820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 192920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 193020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 193120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 193220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 193320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 193420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentDeinit( 193520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent) 193620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 193720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 193820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 193920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 194038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 194120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 194220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 194320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 194420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 194520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 194620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 194720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 194820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 194920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 195020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 195138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 195238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 195338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory); 195420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 195520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosComponent->componentName); 195620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentName = NULL; 195720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 195838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle; 195920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pVp8Dec != NULL) { 196020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pVp8Dec); 196138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec = pVideoDec->hCodecHandle = NULL; 196220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 196320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 196420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent); 196520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 196620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 196720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 196820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 196920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 197020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 197120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 197220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 197320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 197420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 197520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 1976