Exynos_OMX_Vp8dec.c revision 440252358aa79ef5e411b8f57c3359376e650e51
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]); 47438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr); 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)) { 48238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 dataLen[2] = {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)) { 52638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATA *pDstOutputData = &pExynosOutputPort->processData; 52738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OutputBufferGetQueue(pExynosComponent); 52838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 52938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 53038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 53138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 53238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->timeStamp = pSrcInputData->timeStamp; 53338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->nFlags = pSrcInputData->nFlags; 53438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 53538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData); 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) { 54938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2; 55038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM; 55138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 55238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE; 55338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX; 55438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 55538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 55638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* should be done before prepare input buffer */ 55738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) { 55838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 55938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 56038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 56138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 56238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* set input buffer geometry */ 56338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) { 56438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer"); 56538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 56638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 56738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 56838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 56938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* setup input buffer */ 57038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) { 57138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer"); 57238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 57338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 57438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 57538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 57638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 57738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Register input buffer */ 57838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 57901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin ExynosVideoPlane plane; 58001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin plane.addr = pVideoDec->pMFCDecInputBuffer[i]->VirAddr; 58101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize; 58201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin plane.fd = 0; 58301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin if (pInbufOps->Register(hMFCHandle, &plane, 1) != VIDEO_ERROR_NONE) { 58438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer"); 58538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 58638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 58738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 58838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 58938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Register input buffer */ 59138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) { 59201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin ExynosVideoPlane plane; 59301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer; 59401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen; 59501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0]; 59601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin 59701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin Exynos_OSAL_Log(EXYNOS_LOG_TRACE, 59801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin "%s: registering buf %d (hdr=%p) (addr=%p alloc_sz=%ld fd=%d)\n", __func__, 59901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin i, &pExynosInputPort->extendBufferHeader[i], plane.addr, plane.allocSize, 60001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin plane.fd); 60101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin if (pInbufOps->Register(hMFCHandle, &plane, 1) != VIDEO_ERROR_NONE) { 60238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer"); 60338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 60438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 60538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 60638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 60738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 60838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 60938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* set output geometry */ 61038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf)); 61138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#if 0 61238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED; 61338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#else /* This is temporal code to fix broken thumbnail until 3D ddk supports tiled mode */ 61438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) 61538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12; 61638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang else 61738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED; 61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif 6193e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim 62038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) { 62138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer"); 62238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 62338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 62438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 62538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 62638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* input buffer enqueue for header parsing */ 6273e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize); 62838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, (unsigned int *)&oneFrameSize, 1, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) { 62938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing"); 63038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang// ret = OMX_ErrorInsufficientResources; 63138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit; 63238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 63338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 63438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 63538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* start header parsing */ 63638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) { 63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing"); 63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorCodecInit; 63938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 64038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 64138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 64238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* get geometry for output */ 64338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(&pVp8Dec->hMFCVp8Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry)); 64438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Get_Geometry(hMFCHandle, &pVp8Dec->hMFCVp8Handle.codecOutbufConf) != VIDEO_ERROR_NONE) { 64538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info"); 64638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 64738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 64838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 64938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 65038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* get dpb count */ 651bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim pVp8Dec->hMFCVp8Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle); 65238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->bThumbnailMode == OMX_FALSE) 653bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim pVp8Dec->hMFCVp8Handle.maxDPBNum += EXTRA_DPB_NUM; 654bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Vp8CodecSetup nOutbufs: %d", pVp8Dec->hMFCVp8Handle.maxDPBNum); 65538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 65638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_TRUE; 65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 65838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 65938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) || 66038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight)) { 66138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth; 66238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight; 66338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); 66438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); 66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_UpdateFrameSize(pOMXComponent); 66738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE; 66838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 66938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /** Send Port Settings changed call back **/ 67038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (*(pExynosComponent->pCallbacks->EventHandler)) 67138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pOMXComponent, 67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventPortSettingsChanged, /* The command was completed */ 67438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_DirOutput, /* This is the port index */ 67538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 0, 67638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang NULL); 67738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 67838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 67938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) || 68038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight) || 681bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim (pExynosOutputPort->portDefinition.nBufferCountActual != pVp8Dec->hMFCVp8Handle.maxDPBNum)) { 68238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth; 68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight; 68438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); 68538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); 68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 687bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim pExynosOutputPort->portDefinition.nBufferCountActual = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2; 688bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim pExynosOutputPort->portDefinition.nBufferCountMin = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2; 68938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 69038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_UpdateFrameSize(pOMXComponent); 69138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE; 69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /** Send Port Settings changed call back **/ 69438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (*(pExynosComponent->pCallbacks->EventHandler)) 69538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pOMXComponent, 69638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 69738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventPortSettingsChanged, /* The command was completed */ 69838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_DirOutput, /* This is the port index */ 69938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 0, 70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang NULL); 70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 70238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 70338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 70438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInputDataDecodeYet; 70538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecStop(pOMXComponent, INPUT_PORT_INDEX); 70638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 70738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 71038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 71138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 71238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 71338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE VP8CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent) 71438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 71538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 71938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 72038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 72138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 72238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 72338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 72438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 72538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 72657fbf5bae538500a8332718cec7a7446e02d4da4SeungBeom Kim 72738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i, nOutbufs; 72838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 72938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 73138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* get dpb count */ 732bef6209319d736ba1006de1699a04b5ad89e2454SeungBeom Kim nOutbufs = pVp8Dec->hMFCVp8Handle.maxDPBNum; 73338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 73438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* should be done before prepare output buffer */ 73538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) { 73638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 73838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 73938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 74038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Set_Shareable(hMFCHandle); 74138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) { 74238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer"); 74338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 74438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 74538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 74638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 74738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int YBufferSize = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth, pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight); 74838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int CBufferSize = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth, pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight >> 1); 74938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 dataLen[2] = {0, 0}; 75038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 75101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin /* Register output buffer */ 75238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < nOutbufs; i++) { 75301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin ExynosVideoPlane planes[2]; 75401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin int plane; 75501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin 75638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_OUTPUT_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_OUTPUT_BUFFER)); 75738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] = 75838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, YBufferSize, NORMAL_MEMORY); 75938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] = 76038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, CBufferSize, NORMAL_MEMORY); 76138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[0] = YBufferSize; 76238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[1] = CBufferSize; 76338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 76401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pVideoDec->pMFCDecOutputBuffer[i]->fd[0] = 76501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, 76601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]); 76701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pVideoDec->pMFCDecOutputBuffer[i]->fd[1] = 76801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, 76901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]); 77001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin 77138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] == NULL) || 77238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] == NULL)) { 77338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer"); 77438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 77538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 77638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 77701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin 77801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin for (plane = 0; plane < 2; plane++) { 77901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[plane]; 78001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane]; 78101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane]; 78201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin } 78301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin 78401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin if (pOutbufOps->Register(hMFCHandle, planes, 2) != VIDEO_ERROR_NONE) { 78538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer"); 78638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 78738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 78838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 78938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->VirAddr, (unsigned int *)dataLen, 2, NULL); 79038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 79138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 79201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin /* Register output buffer */ 79338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 79438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 79538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 79638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang// OMX_U32 width = pExynosOutputPort->portDefinition.format.video.nFrameWidth; 79738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang// OMX_U32 height = pExynosOutputPort->portDefinition.format.video.nFrameHeight; 79838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang// OMX_U32 stride; 79938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) { 80001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin EXYNOS_OMX_BUFFERHEADERTYPE *buffer = &pExynosOutputPort->extendBufferHeader[i]; 80101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin ExynosVideoPlane planes[2]; 80201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin 80301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin /* luma */ 80401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin planes[0].addr = buffer->pYUVBuf[0]; 80501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin planes[0].fd = buffer->buf_fd[0]; 80601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin planes[0].allocSize = YBufferSize; 80701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin /* chroma */ 80801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin planes[1].addr = buffer->pYUVBuf[1]; 80901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin planes[1].fd = buffer->buf_fd[1]; 81001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin planes[1].allocSize = CBufferSize; 81101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin 81201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin Exynos_OSAL_Log(EXYNOS_LOG_TRACE, 81301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin "%s: registering buf %d (hdr=%p) (l_addr=%p l_fd=%d c_addr=%p c_fd=%d)\n", 81401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin __func__, i, buffer, planes[0].addr, planes[0].fd, planes[1].addr, 81501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin planes[1].fd); 81601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin 81738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang// Exynos_OSAL_LockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, width, height, 81838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang// pExynosOutputPort->portDefinition.format.video.eColorFormat, 81938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang// &stride, pExynosOutputPort->extendBufferHeader[i].pYUVBuf); 82001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin if (pOutbufOps->Register(hMFCHandle, planes, 2) != VIDEO_ERROR_NONE) { 82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer"); 82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 82438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 82538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf, (unsigned int *)dataLen, 2, NULL); 82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang// Exynos_OSAL_UnlockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer); 82738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 82938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) { 83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer"); 83138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 83238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 83338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 83438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 83538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 83638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecStop (pOMXComponent, OUTPUT_PORT_INDEX); 83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 83838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_TRUE; 83938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 84038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 84138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 84238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 84338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 84538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 84638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 84738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 84838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetParameter( 84920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 85020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_INDEXTYPE nParamIndex, 85120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_INOUT OMX_PTR pComponentParameterStructure) 85220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 85338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 85438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 85520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 85620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 85720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 85820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 85920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL || pComponentParameterStructure == NULL) { 86020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 86120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 86220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 86320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 86420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 86520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 86620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 86720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 86820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 86920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 87020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 87120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 87220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 87320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 87420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid ) { 87520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 87620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 87720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 87820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 87920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nParamIndex) { 88020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamStandardComponentRole: 88120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 88220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure; 88320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); 88420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 88520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 88620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 88720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 88820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE); 88920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 89020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 89120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamVideoErrorCorrection: 89220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 89320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure; 89420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL; 89520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 89620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 89720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE)); 89820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 89920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 90020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 90120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 90220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) { 90320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 90420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 90520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 90620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 90720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 90820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pSrcErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX]; 90920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 91020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC; 91120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync; 91220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing; 91320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning; 91420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC; 91520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 91620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 91720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 91820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure); 91920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 92020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 92120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 92220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 92320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 92420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 92520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 92620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 92738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SetParameter( 92820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 92920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_INDEXTYPE nIndex, 93020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_PTR pComponentParameterStructure) 93120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 93238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 93338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 93420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 93520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 93620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 93720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 93820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL || pComponentParameterStructure == NULL) { 93920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 94020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 94120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 94220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 94320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 94420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 94520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 94620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 94720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 94820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 94920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 95020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 95120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 95220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 95320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid ) { 95420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 95520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 95620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 95720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 95820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 95920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamStandardComponentRole: 96020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 96120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure; 96220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 96320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); 96420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 96520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 96620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 96720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 96820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) { 96920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 97020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 97120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 97220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 97320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE)) { 97420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX; 97520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 97620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 97720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 97820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 97920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 98020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 98120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamVideoErrorCorrection: 98220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 98320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure; 98420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL; 98520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL; 98620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 98720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE)); 98820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 98920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 99020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 99120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 99220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) { 99320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 99420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 99520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 99620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 99720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 99820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX]; 99920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 100020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC; 100120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync; 100220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing; 100320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning; 100420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC; 100520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 100620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 100720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 100820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure); 100920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 101020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 101120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 101220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 101320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 101420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 101520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 101620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 101738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetConfig( 101820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent, 101920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_INDEXTYPE nIndex, 102020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PTR pComponentConfigStructure) 102120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 102220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 102320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 102420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 102620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 102720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1028440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (hComponent == NULL || pComponentConfigStructure == NULL) { 102920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 103020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 103120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 103220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 103320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 103420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 103520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 103620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 103720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 103820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 103920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 104020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 104120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 104220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 104320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 104420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 104520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 104620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 104720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 104820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 104920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure); 105020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 105120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 105220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 105320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 105420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 105520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 105620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 105720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 105820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 105938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SetConfig( 106020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent, 106120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_INDEXTYPE nIndex, 106220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PTR pComponentConfigStructure) 106320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 106420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 106520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 106620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 106720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 106820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 106920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1070440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim if (hComponent == NULL || pComponentConfigStructure == NULL) { 107120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 107220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 107520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 107620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 107720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 107820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 107920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 108020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 108120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 108220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 108320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 108420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 108520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 108620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 108720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 108820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 108920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 109020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 109120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure); 109220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 109520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 110020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 110138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_GetExtensionIndex( 110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_STRING cParameterName, 11043e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim OMX_OUT OMX_INDEXTYPE *pIndexType) 110520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 110720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 110920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 111020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 111220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 111320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 111420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 111520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 111620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 111720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 111820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 111920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 112020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 112120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 112220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 112320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 112420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((cParameterName == NULL) || (pIndexType == NULL)) { 112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 112920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 113020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 113220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 113320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 113420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 113520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) { 113620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 113720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *pIndexType = OMX_IndexVendorThumbnailMode; 113820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 113920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 114020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType); 114120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 114220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 114320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 114420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 114520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 114620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 114720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 114820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 114938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_ComponentRoleEnum( 115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE hComponent, 115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U8 *cRole, 115220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 nIndex) 115320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 115420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 115520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 115620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 115720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 115820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 115920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 116020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((hComponent == NULL) || (cRole == NULL)) { 116120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 116220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 116320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 116420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) { 116520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE); 116620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 116720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 116820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNoMore; 116920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 117020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 117120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 117220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 117320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 117420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 117520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 117620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 117720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Init */ 117838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_Init(OMX_COMPONENTTYPE *pOMXComponent) 117920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 11803e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim OMX_ERRORTYPE ret = OMX_ErrorNone; 11813e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 11823e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 11833e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 11843e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 11853e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle; 11863e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim OMX_PTR hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 118738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 118838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = NULL; 118938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = NULL; 119038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = NULL; 119120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 119220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang CSC_METHOD csc_method = CSC_METHOD_SW; 119338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i = 0; 1194800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 11953e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim FunctionIn(); 11963e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim 119738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_FALSE; 119838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_FALSE; 119938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->bUseFlagEOF = OMX_TRUE; 120038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->bSaveFlagEOS = OMX_FALSE; 120138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 120238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* H.264 Codec Open */ 120338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = VP8CodecOpen(pVp8Dec); 120438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 120520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 120620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 120720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 120838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 120938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 121038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 121138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 121238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 121338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID); 121438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); 121538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 12163e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 121738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 121838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 121938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 122038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Use ION Allocator */ 122138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_INPUT_BUFFER)); 122238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecInputBuffer[i]->VirAddr = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY); 122338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr == NULL) { 122438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer"); 122538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 122638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 122738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 122801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pVideoDec->pMFCDecInputBuffer[i]->fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr); 122938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecInputBuffer[i]->bufferSize = DEFAULT_MFC_INPUT_BUFFER_SIZE; 123038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0; 123120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 123238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]); 123338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr); 123438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 123538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]); 123620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 123738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 123838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 123938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 124038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 124138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 124220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 124320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 124438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 124538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID); 124638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); 124738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 124838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 124938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 125038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 125138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 125238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 125338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 125438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bSourceStart = OMX_FALSE; 125538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalCreate(&pVp8Dec->hSourceStartEvent); 125638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bDestinationStart = OMX_FALSE; 125738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalCreate(&pVp8Dec->hDestinationStartEvent); 125820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 125920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP); 126020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS); 126120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec->hMFCVp8Handle.indexTimestamp = 0; 126220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = 0; 126320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 126420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->getAllDelayBuffer = OMX_FALSE; 126520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 126638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#if 0//defined(USE_CSC_GSCALER) 126738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang csc_method = CSC_METHOD_HW; //in case of Use ION buffer. 1268800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#endif 126938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->csc_handle = csc_init(csc_method); 127038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->csc_handle == NULL) { 127138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 127238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 1273800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 127438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->csc_set_format = OMX_FALSE; 127520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 127620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 127720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 127820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 127920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 128020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 128120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 128220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* MFC Terminate */ 128338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent) 128420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 128538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 128638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 128738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 128838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 128938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 129038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 129138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PTR hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 129238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 129338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 129438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 129538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 129638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 129738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i = 0; 129820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 129920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 130020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 130138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->csc_handle != NULL) { 130238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang csc_deinit(pVideoDec->csc_handle); 130338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->csc_handle = NULL; 130438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 130520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 130638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pVp8Dec->hDestinationStartEvent); 130738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hDestinationStartEvent = NULL; 130838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bDestinationStart = OMX_FALSE; 130938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pVp8Dec->hSourceStartEvent); 131038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hSourceStartEvent = NULL; 131138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bSourceStart = OMX_FALSE; 131238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 131338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 13143e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) { 131538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) { 131638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] != NULL) 131738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]); 131838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] != NULL) 131938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]); 132038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]); 132138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecOutputBuffer[i] = NULL; 132238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 132338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 132420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 132538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ); 132638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID); 132738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 132838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 132938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 133038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 133138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 133220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 133320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 133438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 13353e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 133638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->pMFCDecInputBuffer[i] != NULL) { 133738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr != NULL) 13383e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr); 13393e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]); 13403e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim pVideoDec->pMFCDecInputBuffer[i] = NULL; 13413e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim } 134238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 134320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 134438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ); 134538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID); 134638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { 134738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 134838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* TBD */ 134938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /*************/ 135038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Does not require any actions. */ 135120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 135238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecClose(pVp8Dec); 135320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 135420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 135520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 135620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 135720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 135820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 135920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 136038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData) 136120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 136238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 136338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 136438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 136538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 136638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 136738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 136838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 136938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 oneFrameSize = pSrcInputData->dataLen; 137038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 137138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 137238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 137338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE; 137438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i; 137520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 137620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 137720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 137838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc == OMX_FALSE) { 137938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = VP8CodecSrcSetup(pOMXComponent, pSrcInputData); 138020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 138120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 138238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_FALSE) { 138338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = VP8CodecDstSetup(pOMXComponent); 138438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 138538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 138638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((Check_VP8_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize) == OMX_TRUE) || 13873e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { 138838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->timeStamp; 138938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->nFlags; 139038ef2572d26fc760c584a1855a3d002f34eb0231Jiho 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); 139138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDecOps->Set_FrameTag(hMFCHandle, pVp8Dec->hMFCVp8Handle.indexTimestamp); 139238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.indexTimestamp++; 139338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.indexTimestamp %= MAX_TIMESTAMP; 139438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 139538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* queue work for input buffer */ 139638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer); 139738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, (unsigned int *)&oneFrameSize, 1, pSrcInputData->bufferHeader); 139838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecReturn != VIDEO_ERROR_NONE) { 139938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode; 140038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__); 140120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 140220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 140338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang VP8CodecStart(pOMXComponent, INPUT_PORT_INDEX); 140438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->bSourceStart == OMX_FALSE) { 140538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bSourceStart = OMX_TRUE; 140638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pVp8Dec->hSourceStartEvent); 140738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 140838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 140938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->bDestinationStart == OMX_FALSE) { 141038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->bDestinationStart = OMX_TRUE; 141138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pVp8Dec->hDestinationStartEvent); 141238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 1413800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 1414800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 1415800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 141638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 141720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 141838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 141938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 142020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 142138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 142238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 142320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 142438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData) 142538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 142638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 142738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 142838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 142938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 143038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 143138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 143238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 143338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps; 143438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoBuffer *pVideoBuffer; 143520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 143638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 143720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 143838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoBuffer = pInbufOps->Dequeue(hMFCHandle); 143920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 144038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->dataLen = 0; 144138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->usedDataLen = 0; 144238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->remainDataLen = 0; 144338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->nFlags = 0; 144438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->timeStamp = 0; 144520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 144638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoBuffer == NULL) { 144738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL; 144801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pSrcOutputData->buffer.singlePlaneBuffer.fd = 0; 144938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->allocSize = 0; 145038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->pPrivate = NULL; 145138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->bufferHeader = NULL; 145238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 145338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr; 145401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd; 145538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize; 145638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 145738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 145838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i = 0; 145938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->VirAddr) { 146038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (i >= MFC_INPUT_BUFFER_NUM_MAX) { 146138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer"); 14623e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode; 146338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 146438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 146538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang i++; 146638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 146738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0; 146838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i]; 146920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 147038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "i: %d, out dataBuffer: 0x%x", i, pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer); 147120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 147220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 147338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* For Share Buffer */ 147438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate; 147520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 147620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 147738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 147820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 147920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 148020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 148138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 148220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 148320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 1484800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 148538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_VP8Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData) 148620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 148738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 148838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 148938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 149038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; 149138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle; 149238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps; 149338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps; 149438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 dataLen = 0; 149538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE; 149620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 149720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 149820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 149938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) { 150038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer"); 150138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 150220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 150320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 150420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 150538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer, (unsigned int *)&dataLen, 2, pDstInputData->bufferHeader); 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; 153720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 153838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 153920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 154038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVp8Dec->bDestinationStart == OMX_FALSE) { 154138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 154238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 154338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 154420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 154538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (1) { 154638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) { 154738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 154838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 154938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 155038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang displayStatus = pVideoBuffer->displayStatus; 155138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus); 155238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 155338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) || 155438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) || 155538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) || 155638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) { 155738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pVideoBuffer != NULL) { 155838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 155938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 156020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 156138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 156238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 156320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 156420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 156538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 156638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 156738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) 156838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 156938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 157038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.outputIndexTimestamp++; 157138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVp8Dec->hMFCVp8Handle.outputIndexTimestamp %= MAX_TIMESTAMP; 157238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 157338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[0] = pVideoBuffer->planes[0].addr; 157401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pDstOutputData->buffer.multiPlaneBuffer.fd[0] = pVideoBuffer->planes[0].fd; 157538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[1] = pVideoBuffer->planes[1].addr; 157601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pDstOutputData->buffer.multiPlaneBuffer.fd[1] = pVideoBuffer->planes[1].fd; 157738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[2] = pVideoBuffer->planes[2].addr; 157801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pDstOutputData->buffer.multiPlaneBuffer.fd[2] = pVideoBuffer->planes[2].fd; 157938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->allocSize = pVideoBuffer->planes[0].allocSize + pVideoBuffer->planes[1].allocSize + pVideoBuffer->planes[2].allocSize; 158038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->dataLen = pVideoBuffer->planes[0].dataSize + pVideoBuffer->planes[1].dataSize + pVideoBuffer->planes[2].dataSize; 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