Exynos_OMX_Vp8dec.c revision 569b6f9c0afe66023cc50fe41664240f67b7c6bf
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#if 0 60838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED; 60938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#else /* This is temporal code to fix broken thumbnail until 3D ddk supports tiled mode */ 61038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) 61138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12; 61238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang else 61338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED; 61438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif 6153e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim 61638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) { 61738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer"); 61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 61938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 62038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 62138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 62238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* input buffer enqueue for header parsing */ 6233e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize); 62494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, 62594d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) { 62638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing"); 62738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang// ret = OMX_ErrorInsufficientResources; 62838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit; 62938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 63038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 63138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 63238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* start header parsing */ 63338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) { 63438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing"); 63538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorCodecInit; 63638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 63938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* get geometry for output */ 64038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(&pVp8Dec->hMFCVp8Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry)); 64138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Get_Geometry(hMFCHandle, &pVp8Dec->hMFCVp8Handle.codecOutbufConf) != VIDEO_ERROR_NONE) { 64238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info"); 64338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 64438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 64538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 64638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 64738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* get dpb count */ 648bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim pVp8Dec->hMFCVp8Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle); 64938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->bThumbnailMode == OMX_FALSE) 650bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim pVp8Dec->hMFCVp8Handle.maxDPBNum += EXTRA_DPB_NUM; 651bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Vp8CodecSetup nOutbufs: %d", pVp8Dec->hMFCVp8Handle.maxDPBNum); 65238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 65338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_TRUE; 65438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 65538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 65638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) || 65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight)) { 65838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth; 65938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight; 66038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); 66138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); 66238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 66338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_UpdateFrameSize(pOMXComponent); 66438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE; 66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /** Send Port Settings changed call back **/ 66738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (*(pExynosComponent->pCallbacks->EventHandler)) 66838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pOMXComponent, 66938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 67038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventPortSettingsChanged, /* The command was completed */ 67138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_DirOutput, /* This is the port index */ 67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 0, 67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang NULL); 67438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 67538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 67638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) || 67738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight) || 678bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim (pExynosOutputPort->portDefinition.nBufferCountActual != pVp8Dec->hMFCVp8Handle.maxDPBNum)) { 67938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth; 68038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight; 68138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); 68238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); 68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 684bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim pExynosOutputPort->portDefinition.nBufferCountActual = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2; 685bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim pExynosOutputPort->portDefinition.nBufferCountMin = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2; 68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 68738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_UpdateFrameSize(pOMXComponent); 68838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE; 68938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 69038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /** Send Port Settings changed call back **/ 69138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (*(pExynosComponent->pCallbacks->EventHandler)) 69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pOMXComponent, 69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 69438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventPortSettingsChanged, /* The command was completed */ 69538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_DirOutput, /* This is the port index */ 69638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 0, 69738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang NULL); 69838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 69938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInputDataDecodeYet; 70238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecStop(pOMXComponent, INPUT_PORT_INDEX); 70338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 70438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 70538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 70638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 70738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 71038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent) 71138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 71238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 71338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 71438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 71538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 71938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 72038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 72138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 72238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 72357fbf5bae538500a8332718cec7a7446e02d4da4SeungBeom Kim 72438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i, nOutbufs; 72538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 72638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 72738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 72838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* get dpb count */ 729bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim nOutbufs = pVp8Dec->hMFCVp8Handle.maxDPBNum; 73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 731fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 732fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim /* should be done before prepare output buffer */ 733fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) { 734fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim ret = OMX_ErrorInsufficientResources; 735fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim goto EXIT; 736fa8948146ff5b51996e6e65f12d951601a65c34cSeungBeom Kim } 73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 73838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 73938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Set_Shareable(hMFCHandle); 74038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) { 74138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer"); 74238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 74338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 74438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 74538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 746ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE]; 747ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0}; 74894d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0}; 749ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim int plane; 750ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 751ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim nAllocLen[0] = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth, 752ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight); 753ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim nAllocLen[1] = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth, 754ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight >> 1); 755ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 75638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 75701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin /* Register output buffer */ 75838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < nOutbufs; i++) { 759ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER)); 760ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER)); 76101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin 76294d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) { 763ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] = 764ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], NORMAL_MEMORY); 765ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) { 766ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer"); 767ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim ret = OMX_ErrorInsufficientResources; 768ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim goto EXIT; 769ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 770ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] = 771ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, 772ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]); 773ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane]; 774ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 775ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]; 77601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane]; 777ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane]; 77801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin } 77901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin 78094d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) { 78138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer"); 78238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 78338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 78438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 785ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr, 78694d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL); 78738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 78838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 78901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin /* Register output buffer */ 79038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 79138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 79238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 793ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#ifdef USE_ANB 794ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) { 795ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) { 796ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) { 797ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane]; 798ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane]; 799ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim planes[plane].allocSize = nAllocLen[plane]; 800ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 801ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 802ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) { 803ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer"); 804ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim ret = OMX_ErrorInsufficientResources; 805ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim goto EXIT; 806ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 807569b6f9c0afe66023cc50fe41664240f67b7c6bfSeungBeom Kim pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf, 808569b6f9c0afe66023cc50fe41664240f67b7c6bfSeungBeom Kim (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL); 80938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 810ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } else { 811ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim ret = OMX_ErrorNotImplemented; 812ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim goto EXIT; 81338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 814ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#else 815ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim ret = OMX_ErrorNotImplemented; 816ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim goto EXIT; 817ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim#endif 81838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 819ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 82038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) { 82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer"); 82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 82438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 82538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 82738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecStop (pOMXComponent, OUTPUT_PORT_INDEX); 82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 82938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_TRUE; 83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 83138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 83238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 83338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 83438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 83538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 83638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 83838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 83938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetParameter( 84020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 84120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_INDEXTYPE nParamIndex, 84220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_INOUT OMX_PTR pComponentParameterStructure) 84320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 84538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 84620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 84720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 84820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 84920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 85020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL || pComponentParameterStructure == NULL) { 85120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 85220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 85320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 85420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 85520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 85620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 85720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 85820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 85920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 86020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 86120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 86220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 86320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 86420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 86520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid ) { 86620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 86720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 86820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 86920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 87020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nParamIndex) { 87120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamStandardComponentRole: 87220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 87320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure; 87420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); 87520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 87620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 87720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 87820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 87920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE); 88020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 88120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 88220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamVideoErrorCorrection: 88320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 88420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure; 88520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL; 88620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 88720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 88820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE)); 88920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 89020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 89120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 89220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 89320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) { 89420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 89520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 89620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 89720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 89820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 89920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pSrcErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX]; 90020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 90120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC; 90220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync; 90320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing; 90420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning; 90520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC; 90620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 90720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 90820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 90920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure); 91020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 91120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 91220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 91320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 91420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 91520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 91620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 91720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 91838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SetParameter( 91920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 92020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_INDEXTYPE nIndex, 92120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_PTR pComponentParameterStructure) 92220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 92338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 92438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 92520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 92620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 92720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 92820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 92920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL || pComponentParameterStructure == NULL) { 93020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 93120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 93220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 93320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 93420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 93520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 93620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 93720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 93820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 93920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 94020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 94120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 94220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 94320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 94420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid ) { 94520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 94620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 94720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 94820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 94920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 95020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamStandardComponentRole: 95120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 95220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure; 95320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 95420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); 95520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 95620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 95720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 95820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 95920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) { 96020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 96120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 96220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 96320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 96420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE)) { 96520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX; 96620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 96720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 96820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 96920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 97020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 97120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 97220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamVideoErrorCorrection: 97320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 97420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure; 97520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL; 97620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 97720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 97820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE)); 97920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 98020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 98120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 98220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 98320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) { 98420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 98520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 98620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 98720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 98820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 98920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX]; 99020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 99120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC; 99220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync; 99320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing; 99420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning; 99520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC; 99620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 99720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 99820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 99920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure); 100020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 100120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 100220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 100320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 100420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 100520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 100620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 100720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 100838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetConfig( 100920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent, 101020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_INDEXTYPE nIndex, 101120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PTR pComponentConfigStructure) 101220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 101320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 101420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 101520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 101620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 101720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 101820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1019440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (hComponent == NULL || pComponentConfigStructure == NULL) { 102020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 102120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 102220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 102320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 102420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 102620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 102720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 102820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 102920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 103020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 103120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 103220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 103320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 103420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 103520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 103620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 103720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 103820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 103920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 104020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure); 104120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 104220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 104320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 104420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 104520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 104620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 104720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 104820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 104920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 105038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SetConfig( 105120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent, 105220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_INDEXTYPE nIndex, 105320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PTR pComponentConfigStructure) 105420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 105520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 105620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 105720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 105820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 105920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 106020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1061440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (hComponent == NULL || pComponentConfigStructure == NULL) { 106220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 106320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 106420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 106520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 106620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 106720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 106820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 106920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 107020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 107120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 107220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 107520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 107620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 107720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 107820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 107920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 108020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 108120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 108220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure); 108320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 108420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 108520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 108620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 108720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 108820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 108920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 109020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 109120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 109238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetExtensionIndex( 109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_STRING cParameterName, 10953e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim OMX_OUT OMX_INDEXTYPE *pIndexType) 109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 110020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 110120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 110420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 110520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 110720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 110920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 111020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 111220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 111320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 111420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 111520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 111620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 111720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((cParameterName == NULL) || (pIndexType == NULL)) { 111820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 111920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 112020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 112120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 112220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 112320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 112420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) { 112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *pIndexType = OMX_IndexVendorThumbnailMode; 112920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 113020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType); 113220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 113320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 113420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 113520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 113620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 113720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 113820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 113920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 114038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_ComponentRoleEnum( 114120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent, 114220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U8 *cRole, 114320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 nIndex) 114420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 114520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 114620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 114720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 114820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 114920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((hComponent == NULL) || (cRole == NULL)) { 115220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 115320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 115420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 115520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) { 115620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE); 115720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 115820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 115920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNoMore; 116020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 116120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 116220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 116320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 116420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 116520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 116620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 116720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 116820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Init */ 116938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_Init(OMX_COMPONENTTYPE *pOMXComponent) 117020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 11713e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim OMX_ERRORTYPE ret = OMX_ErrorNone; 11723e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 11733e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 11743e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 11753e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 11763e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle; 11773e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim OMX_PTR hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 117838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 117938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = NULL; 118038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = NULL; 118138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = NULL; 118220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 118320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang CSC_METHOD csc_method = CSC_METHOD_SW; 1184ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim int i, plane; 1185800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 11863e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim FunctionIn(); 11873e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim 118838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_FALSE; 118938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_FALSE; 119038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->bUseFlagEOF = OMX_TRUE; 119138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->bSaveFlagEOS = OMX_FALSE; 119238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 119338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* H.264 Codec Open */ 119438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = VP8CodecOpen(pVp8Dec); 119538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 119620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 119720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 119820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 119938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 120038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 120138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 120238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 120338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 120438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID); 120538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); 120638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 12073e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 1208ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER)); 1209ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER)); 121038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]); 1211ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 1212ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) { 1213ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim /* Use ION Allocator */ 1214ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY); 1215ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]); 1216ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE; 1217ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0; 1218ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) { 1219ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer"); 1220ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim ret = OMX_ErrorInsufficientResources; 1221ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim goto EXIT; 1222ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 1223ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]); 1224ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 122538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 122638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]); 122720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 122838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 122938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 123038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 123138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 123238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 123320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 123420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 123538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 123638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID); 123738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); 123838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 123938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 124038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 124138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 124238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 124338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 124438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 124538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bSourceStart = OMX_FALSE; 124638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalCreate(&pVp8Dec->hSourceStartEvent); 124738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bDestinationStart = OMX_FALSE; 124838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalCreate(&pVp8Dec->hDestinationStartEvent); 124920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 125020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP); 125120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS); 125220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec->hMFCVp8Handle.indexTimestamp = 0; 125320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = 0; 125420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 125520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->getAllDelayBuffer = OMX_FALSE; 125620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 125738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#if 0//defined(USE_CSC_GSCALER) 125838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang csc_method = CSC_METHOD_HW; //in case of Use ION buffer. 1259800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#endif 126038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->csc_handle = csc_init(csc_method); 126138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->csc_handle == NULL) { 126238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 126338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 1264800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 126538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->csc_set_format = OMX_FALSE; 126620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 126720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 126820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 126920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 127020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 127120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 127220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 127320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Terminate */ 127438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent) 127520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 127638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 127738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 127838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 127938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 128038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 128138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 128238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PTR hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 128338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 128438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 128538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 128638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 128738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 1288ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim int i, plane; 128920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 129020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 129120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 129238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->csc_handle != NULL) { 129338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang csc_deinit(pVideoDec->csc_handle); 129438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->csc_handle = NULL; 129538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 129620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 129738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pVp8Dec->hDestinationStartEvent); 129838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hDestinationStartEvent = NULL; 129938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bDestinationStart = OMX_FALSE; 130038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pVp8Dec->hSourceStartEvent); 130138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hSourceStartEvent = NULL; 130238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bSourceStart = OMX_FALSE; 130338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 130438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 13053e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) { 130638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) { 1307ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) { 1308ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL) 1309ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]); 1310ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 1311ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 131238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]); 131338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecOutputBuffer[i] = NULL; 131438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 131538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 131620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 131738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ); 131838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID); 131938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 132038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 132138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 132238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 132338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 132420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 132520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 132638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 13273e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 132838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->pMFCDecInputBuffer[i] != NULL) { 1329ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) { 1330ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL) 1331ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]); 1332ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 1333ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 13343e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]); 13353e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i] = NULL; 13363e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim } 133738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 133820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 133938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ); 134038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID); 134138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 134238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 134338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 134438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 134538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 134620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 134738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecClose(pVp8Dec); 134820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 134920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 135020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 135120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 135220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 135320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 135420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 135538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData) 135620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 135738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 135838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 135938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 136038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 136138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 136238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 136338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 136438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 oneFrameSize = pSrcInputData->dataLen; 136538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 136638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 136738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 136838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE; 136938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i; 137020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 137120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 137220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 137338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc == OMX_FALSE) { 137438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = VP8CodecSrcSetup(pOMXComponent, pSrcInputData); 137520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 137620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 137738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_FALSE) { 137838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = VP8CodecDstSetup(pOMXComponent); 137938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 138038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 138138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((Check_VP8_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize) == OMX_TRUE) || 13823e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { 138338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->timeStamp; 138438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->nFlags; 138538ef2572d26fc760c584a1855a3d002f34eb0231Jiho 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); 138638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps->Set_FrameTag(hMFCHandle, pVp8Dec->hMFCVp8Handle.indexTimestamp); 138738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.indexTimestamp++; 138838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.indexTimestamp %= MAX_TIMESTAMP; 138938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 139038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* queue work for input buffer */ 139138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer); 139294d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, 139394d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader); 139438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecReturn != VIDEO_ERROR_NONE) { 139538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode; 139638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__); 139720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 139820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 139938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecStart(pOMXComponent, INPUT_PORT_INDEX); 140038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->bSourceStart == OMX_FALSE) { 140138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bSourceStart = OMX_TRUE; 140238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pVp8Dec->hSourceStartEvent); 140338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 140438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 140538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->bDestinationStart == OMX_FALSE) { 140638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bDestinationStart = OMX_TRUE; 140738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pVp8Dec->hDestinationStartEvent); 140838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 1409800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 1410800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 1411800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 141238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 141320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 141438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 141538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 141620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 141738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 141838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 141920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 142038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData) 142138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 142238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 142338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 142438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 142538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 142638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 142738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 142838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 142938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 143038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoBuffer *pVideoBuffer; 143120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 143238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 143320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 143438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoBuffer = pInbufOps->Dequeue(hMFCHandle); 143520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 143638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->dataLen = 0; 143738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->usedDataLen = 0; 143838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->remainDataLen = 0; 143938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->nFlags = 0; 144038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->timeStamp = 0; 144120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 144238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoBuffer == NULL) { 144338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL; 144438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->allocSize = 0; 144538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->pPrivate = NULL; 144638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->bufferHeader = NULL; 144738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 144838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr; 144901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd; 145038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize; 145138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 145238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 145338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i = 0; 1454ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) { 145538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (i >= MFC_INPUT_BUFFER_NUM_MAX) { 145638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer"); 14573e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode; 145838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 145938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 146038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang i++; 146138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 146238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0; 146338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i]; 146420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 146520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 146638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* For Share Buffer */ 146738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate; 146820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 146920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 147038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 147120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 147220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 147320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 147438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 147520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 147620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 1477800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 147838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData) 147920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 148038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 148138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 148238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 148338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 148438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 1485ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 148638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 148738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 148894d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,}; 148938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE; 149020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 149120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 149220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 149338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) { 149438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer"); 149538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 149620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 149720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 149820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1499ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__, 1500ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0], 1501ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]); 1502ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim 150394d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer, 150494d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader); 150594d259f528bc6ba81d0c3a57f27cc946a7742773SeungBeom Kim 150638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecReturn != VIDEO_ERROR_NONE) { 150738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__); 15083e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode; 150938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 151038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 151138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecStart(pOMXComponent, OUTPUT_PORT_INDEX); 151220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 151338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 151420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 151538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 151638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 151720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 151838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 151938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 152020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 152138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData) 152238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 152338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 152438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 152538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 152638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 152738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 152838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 152938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 153038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 153138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 153238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoBuffer *pVideoBuffer; 153338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN; 153438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoGeometry *bufferGeometry; 153538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL; 153638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_S32 indexTimestamp = 0; 1537ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim int plane; 153820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 153938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 154020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 154138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->bDestinationStart == OMX_FALSE) { 154238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 154338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 154438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 154520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 154638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (1) { 154738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) { 154838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 154938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 155038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 155138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang displayStatus = pVideoBuffer->displayStatus; 155238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus); 155338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 155438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) || 155538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) || 155638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) || 155738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) { 155838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoBuffer != NULL) { 155938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 156038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 156120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 156238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 156338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 156420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 156520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 156638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 156738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 156838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) 156938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 157038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 157138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.outputIndexTimestamp++; 157238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.outputIndexTimestamp %= MAX_TIMESTAMP; 157338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 1574ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstOutputData->allocSize = pDstOutputData->dataLen = 0; 1575ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) { 1576ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr; 1577ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd; 1578ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize; 1579ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim pDstOutputData->dataLen += pVideoBuffer->planes[plane].dataSize; 1580ef059a025332fc3b7d68e1b8bd1f7abe34cf37e9SeungBeom Kim } 158138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->usedDataLen = 0; 158238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->pPrivate = pVideoBuffer; 158338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* For Share Buffer */ 158438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate; 158538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 158638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo; 158738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferGeometry = &pVp8Dec->hMFCVp8Handle.codecOutbufConf; 158838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pBufferInfo->imageWidth = bufferGeometry->nFrameWidth; 158938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pBufferInfo->imageHeight = bufferGeometry->nFrameHeight; 159038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang switch (bufferGeometry->eColorFormat) { 159138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case VIDEO_COLORFORMAT_NV12: 159238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 159338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 159438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case VIDEO_COLORFORMAT_NV12_TILED: 159538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang default: 159638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled; 159738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 159838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 159938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 160038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle); 16013e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp); 160238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) { 160338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) && 160438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) { 160538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp]; 160638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp]; 16073e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp); 160838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 160938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = 0x00; 161038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = 0x00; 161120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 161220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 161338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* For timestamp correction. if mfc support frametype detect */ 161438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType); 161538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef NEED_TIMESTAMP_REORDER 161638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) { 161738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp]; 161838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp]; 161938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = indexTimestamp; 162038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 162138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp]; 162238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp]; 162320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 162438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#else 162538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp]; 162638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp]; 162738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif 162838ef2572d26fc760c584a1855a3d002f34eb0231Jiho 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); 162938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 163020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 163138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) || 163238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { 16333e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags); 163438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->remainDataLen = 0; 163538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 163638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2; 163738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 163838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 163938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 164038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 164138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 164238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 164338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 164438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 164538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 164638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 164738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData) 164838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 164938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 165038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 165138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 165238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 165320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 165438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 165520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 165638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) { 165720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 165838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 165920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 166038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) { 166138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 166238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 166320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 166420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 166538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_VP8Dec_SrcIn(pOMXComponent, pSrcInputData); 166638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) { 166738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 166838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 166938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, ret, 0, NULL); 167038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 167120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 167238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 167338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 167420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 167538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 167638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 1677800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 167838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData) 167938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 168038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 168138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 168238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 168338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 168420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 168538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 168620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 168738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) { 168838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 168938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 169038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 1691800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 169238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 169338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) { 169438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 169538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 169620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 169738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 169838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVp8Dec->bSourceStart == OMX_FALSE) && 169938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) { 170038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalWait(pVp8Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME); 170138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalReset(pVp8Dec->hSourceStartEvent); 170238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 170320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 170438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_VP8Dec_SrcOut(pOMXComponent, pSrcOutputData); 170538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((ret != OMX_ErrorNone) && 170638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosComponent->currentState == OMX_StateExecuting)) { 170738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 170838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 170938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, ret, 0, NULL); 171038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 171120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 171238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 171338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 171420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 171538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 171638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 171738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 171838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData) 171938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 172038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 172138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 172238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 172338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 172438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 172538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 172638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 172738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) { 172838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 172938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 173038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 173138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) { 173238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 173338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 173438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 173538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 173638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVp8Dec->bDestinationStart == OMX_FALSE) && 173738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) { 173838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalWait(pVp8Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME); 173938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalReset(pVp8Dec->hDestinationStartEvent); 174020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 174138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 174238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_TRUE) { 174338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_VP8Dec_DstIn(pOMXComponent, pDstInputData); 174438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 174538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 174638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 174738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, ret, 0, NULL); 174820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 174920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 175020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 175120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 175220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 175320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 175420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 175520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 175620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 175738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData) 175820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 175938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 176038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 176138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 176238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 176320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 176420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 176520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 176638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) { 176720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 176820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 176920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 177038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) { 177120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 177220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 177320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 177420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 177538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 177638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVp8Dec->bDestinationStart == OMX_FALSE) && 177738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) { 177838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalWait(pVp8Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME); 177938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalReset(pVp8Dec->hDestinationStartEvent); 178020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 178138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 178238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_VP8Dec_DstOut(pOMXComponent, pDstOutputData); 178338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((ret != OMX_ErrorNone) && 178438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosComponent->currentState == OMX_StateExecuting)) { 178538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 178638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 178738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, ret, 0, NULL); 178820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 178920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 179020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 179120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 179220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 179320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 179420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 179520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 179620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit( 179720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent, 179820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_STRING componentName) 179920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 180020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 180120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 180220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 180320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 180420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 180520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 180620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int i = 0; 180720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 180820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 180920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 181020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((hComponent == NULL) || (componentName == NULL)) { 181120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 181220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__); 181320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 181420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 181520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_VP8_DEC, componentName) != 0) { 181620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 181720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__); 181820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 181920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 182020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 182120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 182220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent); 182320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 182420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__); 182520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 182620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 182720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 182820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->codecType = HW_VIDEO_DEC_CODEC; 182920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 183020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE); 183120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->componentName == NULL) { 183220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent); 183320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 183420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 183520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 183620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 183720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE); 183820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 183920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_VP8DEC_HANDLE)); 184020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pVp8Dec == NULL) { 184120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent); 184220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 184320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 184420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 184520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 184620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pVp8Dec, 0, sizeof(EXYNOS_VP8DEC_HANDLE)); 184720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 184820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pVp8Dec; 184920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 185020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_VP8_DEC); 185120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 185220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Set componentVersion */ 185320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER; 185420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER; 185520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentVersion.s.nRevision = REVISION_NUMBER; 185620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentVersion.s.nStep = STEP_NUMBER; 185720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Set specVersion */ 185820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER; 185920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER; 186020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->specVersion.s.nRevision = REVISION_NUMBER; 186120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->specVersion.s.nStep = STEP_NUMBER; 186220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 186320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Input port */ 186420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 186520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH; 186620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT; 186720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/ 186820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nSliceHeight = 0; 186920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE; 187020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX; 187120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE); 187220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/x-vnd.on2.vp8"); 187320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.pNativeRender = 0; 187420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE; 187520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; 187620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.bEnabled = OMX_TRUE; 187738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->bufferProcessType = BUFFER_SHARE; 187838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portWayType = WAY2_PORT; 187920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 188020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Output port */ 188120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 188220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH; 188320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT; 188420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/ 188520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nSliceHeight = 0; 188620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE; 188720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 188820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE); 188920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video"); 189020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.pNativeRender = 0; 189120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE; 189220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar; 189320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.bEnabled = OMX_TRUE; 189438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE; 189538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portWayType = WAY2_PORT; 189638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 189738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent->GetParameter = &Exynos_VP8Dec_GetParameter; 189838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent->SetParameter = &Exynos_VP8Dec_SetParameter; 189938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent->GetConfig = &Exynos_VP8Dec_GetConfig; 190038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent->SetConfig = &Exynos_VP8Dec_SetConfig; 190138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent->GetExtensionIndex = &Exynos_VP8Dec_GetExtensionIndex; 190238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent->ComponentRoleEnum = &Exynos_VP8Dec_ComponentRoleEnum; 190320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->ComponentDeInit = &Exynos_OMX_ComponentDeinit; 190420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 190538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_codec_componentInit = &Exynos_VP8Dec_Init; 190638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_codec_componentTerminate = &Exynos_VP8Dec_Terminate; 190738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 190838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_srcInputProcess = &Exynos_VP8Dec_srcInputBufferProcess; 190938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_srcOutputProcess = &Exynos_VP8Dec_srcOutputBufferProcess; 191038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_dstInputProcess = &Exynos_VP8Dec_dstInputBufferProcess; 191138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_dstOutputProcess = &Exynos_VP8Dec_dstOutputBufferProcess; 191238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 19133e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim pVideoDec->exynos_codec_start = &VP8CodecStart; 19143e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim pVideoDec->exynos_codec_stop = &VP8CodecStop; 191538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_bufferProcessRun = &VP8CodecOutputBufferProcessRun; 191638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_enqueueAllBuffer = &VP8CodecEnQueueAllBuffer; 191738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 191838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_checkInputFrame = &Check_VP8_Frame; 191938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_getCodecInputPrivateData = &GetCodecInputPrivateData; 192038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData; 192138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 192238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open(); 192338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->hSharedMemory == NULL) { 19243e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 192538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pVp8Dec); 192638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL; 192738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent); 192838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 192938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 193038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 193120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 193220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StateLoaded; 193320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 193420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 193520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 193620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 193720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 193820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 193920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 194020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 194120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 194220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentDeinit( 194320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent) 194420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 194520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 194620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 194720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 194838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 194920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 195020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 195120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 195220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 195320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 195420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 195520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 195620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 195720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 195820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 195938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 196038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 196138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory); 196220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 196320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosComponent->componentName); 196420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->componentName = NULL; 196520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 196638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle; 196720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pVp8Dec != NULL) { 196820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pVp8Dec); 196938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec = pVideoDec->hCodecHandle = NULL; 197020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 197120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 197220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent); 197320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 197420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 197520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 197620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 197720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 197820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 197920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 198020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 198120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 198220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 198320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 1984