1 /* 2 * 3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 /* 19 * @file Exynos_OMX_Vdec.c 20 * @brief 21 * @author SeungBeom Kim (sbcrux.kim (at) samsung.com) 22 * HyeYeon Chung (hyeon.chung (at) samsung.com) 23 * Yunji Kim (yunji.kim (at) samsung.com) 24 * @version 2.0.0 25 * @history 26 * 2012.02.20 : Create 27 */ 28 29 #include <stdio.h> 30 #include <stdlib.h> 31 #include <string.h> 32 #include "Exynos_OMX_Macros.h" 33 #include "Exynos_OSAL_Event.h" 34 #include "Exynos_OMX_Vdec.h" 35 #include "Exynos_OMX_VdecControl.h" 36 #include "Exynos_OMX_Basecomponent.h" 37 #include "Exynos_OSAL_SharedMemory.h" 38 #include "Exynos_OSAL_Thread.h" 39 #include "Exynos_OSAL_Semaphore.h" 40 #include "Exynos_OSAL_Mutex.h" 41 #include "Exynos_OSAL_ETC.h" 42 #include "csc.h" 43 44 #ifdef USE_ANB 45 #include "Exynos_OSAL_Android.h" 46 #endif 47 48 #undef EXYNOS_LOG_TAG 49 #define EXYNOS_LOG_TAG "EXYNOS_VIDEO_DEC" 50 #define EXYNOS_LOG_OFF 51 //#define EXYNOS_TRACE_ON 52 #include "Exynos_OSAL_Log.h" 53 54 55 int calc_plane(int width, int height) 56 { 57 int mbX, mbY; 58 59 mbX = (width + 15)/16; 60 mbY = (height + 15)/16; 61 62 /* Alignment for interlaced processing */ 63 mbY = (mbY + 1) / 2 * 2; 64 65 return (mbX * 16) * (mbY * 16); 66 } 67 68 inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent) 69 { 70 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 71 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 72 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 73 74 if ((exynosOutputPort->portDefinition.format.video.nFrameWidth != 75 exynosInputPort->portDefinition.format.video.nFrameWidth) || 76 (exynosOutputPort->portDefinition.format.video.nFrameHeight != 77 exynosInputPort->portDefinition.format.video.nFrameHeight)) { 78 OMX_U32 width = 0, height = 0; 79 80 exynosOutputPort->portDefinition.format.video.nFrameWidth = 81 exynosInputPort->portDefinition.format.video.nFrameWidth; 82 exynosOutputPort->portDefinition.format.video.nFrameHeight = 83 exynosInputPort->portDefinition.format.video.nFrameHeight; 84 width = exynosOutputPort->portDefinition.format.video.nStride = 85 exynosInputPort->portDefinition.format.video.nStride; 86 height = exynosOutputPort->portDefinition.format.video.nSliceHeight = 87 exynosInputPort->portDefinition.format.video.nSliceHeight; 88 89 switch(exynosOutputPort->portDefinition.format.video.eColorFormat) { 90 case OMX_COLOR_FormatYUV420Planar: 91 case OMX_COLOR_FormatYUV420SemiPlanar: 92 case OMX_SEC_COLOR_FormatNV12TPhysicalAddress: 93 if (width && height) 94 exynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2; 95 break; 96 case OMX_SEC_COLOR_FormatNV12Tiled: 97 width = exynosOutputPort->portDefinition.format.video.nFrameWidth; 98 height = exynosOutputPort->portDefinition.format.video.nFrameHeight; 99 if (width && height) { 100 int YBufferSize = calc_plane(width, height); 101 int CBufferSize = calc_plane(width, height >> 1); 102 exynosOutputPort->portDefinition.nBufferSize = YBufferSize + CBufferSize; 103 } 104 break; 105 default: 106 if (width && height) 107 exynosOutputPort->portDefinition.nBufferSize = width * height * 2; 108 break; 109 } 110 } 111 112 return; 113 } 114 115 void Exynos_Free_CodecBuffers( 116 OMX_COMPONENTTYPE *pOMXComponent, 117 OMX_U32 nPortIndex) 118 { 119 OMX_ERRORTYPE ret = OMX_ErrorNone; 120 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 121 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 122 CODEC_DEC_BUFFER **ppCodecBuffer = NULL; 123 124 OMX_U32 nPlaneCnt = 0; 125 int i, j; 126 127 FunctionIn(); 128 129 if (nPortIndex == INPUT_PORT_INDEX) { 130 ppCodecBuffer = &(pVideoDec->pMFCDecInputBuffer[0]); 131 nPlaneCnt = MFC_INPUT_BUFFER_PLANE; 132 } else { 133 ppCodecBuffer = &(pVideoDec->pMFCDecOutputBuffer[0]); 134 nPlaneCnt = MFC_OUTPUT_BUFFER_PLANE; 135 } 136 137 for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) { 138 if (ppCodecBuffer[i] != NULL) { 139 for (j = 0; j < nPlaneCnt; j++) { 140 if (ppCodecBuffer[i]->pVirAddr[j] != NULL) 141 Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, ppCodecBuffer[i]->pVirAddr[j]); 142 } 143 144 Exynos_OSAL_Free(ppCodecBuffer[i]); 145 ppCodecBuffer[i] = NULL; 146 } 147 } 148 149 FunctionOut(); 150 } 151 152 OMX_ERRORTYPE Exynos_Allocate_CodecBuffers( 153 OMX_COMPONENTTYPE *pOMXComponent, 154 OMX_U32 nPortIndex, 155 OMX_U32 nBufferCnt, 156 OMX_U32 nPlaneSize[MFC_OUTPUT_BUFFER_PLANE]) 157 { 158 OMX_ERRORTYPE ret = OMX_ErrorNone; 159 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 160 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 161 MEMORY_TYPE eMemoryType = NORMAL_MEMORY; 162 CODEC_DEC_BUFFER **ppCodecBuffer = NULL; 163 164 OMX_U32 nPlaneCnt = 0; 165 int i, j; 166 167 FunctionIn(); 168 169 if (pVideoDec->bDRMPlayerMode == OMX_TRUE) 170 eMemoryType = SECURE_MEMORY; 171 172 if (nPortIndex == INPUT_PORT_INDEX) { 173 ppCodecBuffer = &(pVideoDec->pMFCDecInputBuffer[0]); 174 nPlaneCnt = MFC_INPUT_BUFFER_PLANE; 175 } else { 176 ppCodecBuffer = &(pVideoDec->pMFCDecOutputBuffer[0]); 177 nPlaneCnt = MFC_OUTPUT_BUFFER_PLANE; 178 } 179 180 for (i = 0; i < nBufferCnt; i++) { 181 ppCodecBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER)); 182 if (ppCodecBuffer[i] == NULL) { 183 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc codec buffer"); 184 ret = OMX_ErrorInsufficientResources; 185 goto EXIT; 186 } 187 Exynos_OSAL_Memset(ppCodecBuffer[i], 0, sizeof(CODEC_DEC_BUFFER)); 188 189 for (j = 0; j < nPlaneCnt; j++) { 190 ppCodecBuffer[i]->pVirAddr[j] = 191 (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nPlaneSize[j], eMemoryType); 192 if (ppCodecBuffer[i]->pVirAddr[j] == NULL) { 193 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc plane"); 194 ret = OMX_ErrorInsufficientResources; 195 goto EXIT; 196 } 197 198 ppCodecBuffer[i]->fd[j] = 199 Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, ppCodecBuffer[i]->pVirAddr[j]); 200 ppCodecBuffer[i]->bufferSize[j] = nPlaneSize[j]; 201 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PORT[%d]: pMFCCodecBuffer[%d]->pVirAddr[%d]: 0x%x", nPortIndex, i, j, ppCodecBuffer[i]->pVirAddr[j]); 202 } 203 204 ppCodecBuffer[i]->dataSize = 0; 205 } 206 207 return OMX_ErrorNone; 208 209 EXIT: 210 Exynos_Free_CodecBuffers(pOMXComponent, nPortIndex); 211 212 FunctionOut(); 213 214 return ret; 215 } 216 217 OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex) 218 { 219 OMX_BOOL ret = OMX_FALSE; 220 221 if ((pExynosComponent->currentState == OMX_StateExecuting) && 222 (pExynosComponent->pExynosPort[nPortIndex].portState == OMX_StateIdle) && 223 (pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) && 224 (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToExecuting)) { 225 ret = OMX_TRUE; 226 } else { 227 ret = OMX_FALSE; 228 } 229 230 return ret; 231 } 232 233 OMX_ERRORTYPE Exynos_ResetAllPortConfig(OMX_COMPONENTTYPE *pOMXComponent) 234 { 235 OMX_ERRORTYPE ret = OMX_ErrorNone; 236 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 237 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 238 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 239 240 /* Input port */ 241 pExynosInputPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH; 242 pExynosInputPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT; 243 pExynosInputPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/ 244 pExynosInputPort->portDefinition.format.video.nSliceHeight = 0; 245 pExynosInputPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE; 246 pExynosInputPort->portDefinition.format.video.pNativeRender = 0; 247 pExynosInputPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE; 248 pExynosInputPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; 249 pExynosInputPort->portDefinition.bEnabled = OMX_TRUE; 250 pExynosInputPort->bufferProcessType = BUFFER_SHARE; 251 pExynosInputPort->portWayType = WAY2_PORT; 252 253 /* Output port */ 254 pExynosOutputPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH; 255 pExynosOutputPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT; 256 pExynosOutputPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/ 257 pExynosOutputPort->portDefinition.format.video.nSliceHeight = 0; 258 pExynosOutputPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE; 259 pExynosOutputPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 260 Exynos_OSAL_Memset(pExynosOutputPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE); 261 Exynos_OSAL_Strcpy(pExynosOutputPort->portDefinition.format.video.cMIMEType, "raw/video"); 262 pExynosOutputPort->portDefinition.format.video.pNativeRender = 0; 263 pExynosOutputPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE; 264 pExynosOutputPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar; 265 pExynosOutputPort->portDefinition.nBufferCountActual = MAX_VIDEO_OUTPUTBUFFER_NUM; 266 pExynosOutputPort->portDefinition.nBufferCountMin = MAX_VIDEO_OUTPUTBUFFER_NUM; 267 pExynosOutputPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE; 268 pExynosOutputPort->portDefinition.bEnabled = OMX_TRUE; 269 pExynosOutputPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE; 270 pExynosOutputPort->bIsANBEnabled = OMX_FALSE; 271 pExynosOutputPort->portWayType = WAY2_PORT; 272 273 return ret; 274 } 275 276 OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData) 277 { 278 OMX_ERRORTYPE ret = OMX_ErrorNone; 279 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 280 CODEC_DEC_BUFFER *pInputCodecBuffer = (CODEC_DEC_BUFFER *)codecBuffer; 281 282 pData->buffer.singlePlaneBuffer.dataBuffer = pInputCodecBuffer->pVirAddr[0]; 283 pData->buffer.singlePlaneBuffer.fd = pInputCodecBuffer->fd[0]; 284 pData->allocSize = pInputCodecBuffer->bufferSize[0]; 285 pData->dataLen = pInputCodecBuffer->dataSize; 286 pData->usedDataLen = 0; 287 pData->remainDataLen = pInputCodecBuffer->dataSize; 288 289 pData->nFlags = 0; 290 pData->timeStamp = 0; 291 pData->pPrivate = codecBuffer; 292 pData->bufferHeader = NULL; 293 294 return ret; 295 } 296 297 OMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData) 298 { 299 OMX_ERRORTYPE ret = OMX_ErrorNone; 300 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 301 CODEC_DEC_BUFFER *pCodecBuffer = (CODEC_DEC_BUFFER *)codecBuffer; 302 int i = 0; 303 304 pData->allocSize = 0; 305 pData->dataLen = 0; 306 pData->usedDataLen = 0; 307 pData->remainDataLen = 0; 308 309 pData->nFlags = 0; 310 pData->timeStamp = 0; 311 pData->pPrivate = codecBuffer; 312 pData->bufferHeader = NULL; 313 314 for (i = 0; i < MAX_BUFFER_PLANE; i++) { 315 pData->buffer.multiPlaneBuffer.dataBuffer[i] = pCodecBuffer->pVirAddr[i]; 316 pData->buffer.multiPlaneBuffer.fd[i] = pCodecBuffer->fd[i]; 317 pData->allocSize += pCodecBuffer->bufferSize[i]; 318 } 319 320 return ret; 321 } 322 323 void Exynos_Wait_ProcessPause(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex) 324 { 325 EXYNOS_OMX_BASEPORT *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 326 EXYNOS_OMX_BASEPORT *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 327 EXYNOS_OMX_BASEPORT *exynosOMXPort = NULL; 328 329 FunctionIn(); 330 331 exynosOMXPort = &pExynosComponent->pExynosPort[nPortIndex]; 332 333 if (((pExynosComponent->currentState == OMX_StatePause) || 334 (pExynosComponent->currentState == OMX_StateIdle) || 335 (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) || 336 (pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle)) && 337 (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToLoaded) && 338 (!CHECK_PORT_BEING_FLUSHED(exynosOMXPort))) { 339 Exynos_OSAL_SignalWait(pExynosComponent->pExynosPort[nPortIndex].pauseEvent, DEF_MAX_WAIT_TIME); 340 Exynos_OSAL_SignalReset(pExynosComponent->pExynosPort[nPortIndex].pauseEvent); 341 } 342 343 FunctionOut(); 344 345 return; 346 } 347 348 OMX_BOOL Exynos_CSC_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData) 349 { 350 OMX_BOOL ret = OMX_FALSE; 351 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 352 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 353 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 354 EXYNOS_OMX_DATABUFFER *outputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer; 355 OMX_U32 copySize = 0; 356 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL; 357 358 FunctionIn(); 359 360 OMX_U32 width = 0, height = 0; 361 int imageSize = 0; 362 OMX_COLOR_FORMATTYPE colorFormat; 363 364 void *pOutputBuf = (void *)outputUseBuffer->bufferHeader->pBuffer; 365 void *pSrcBuf[MAX_BUFFER_PLANE] = {NULL, }; 366 void *pYUVBuf[MAX_BUFFER_PLANE] = {NULL, }; 367 368 CSC_ERRORCODE cscRet = CSC_ErrorNone; 369 CSC_METHOD csc_method = CSC_METHOD_SW; 370 unsigned int cacheable = 1; 371 372 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)dstOutputData->extInfo; 373 374 width = pBufferInfo->imageWidth; 375 height = pBufferInfo->imageHeight; 376 imageSize = width * height; 377 colorFormat = pBufferInfo->ColorFormat; 378 379 pSrcBuf[0] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[0]; 380 pSrcBuf[1] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[1]; 381 pSrcBuf[2] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[2]; 382 383 pYUVBuf[0] = (unsigned char *)pOutputBuf; 384 pYUVBuf[1] = (unsigned char *)pOutputBuf + imageSize; 385 pYUVBuf[2] = (unsigned char *)pOutputBuf + imageSize + imageSize / 4; 386 387 csc_get_method(pVideoDec->csc_handle, &csc_method); 388 if (csc_method == CSC_METHOD_HW) { 389 pSrcBuf[0] = dstOutputData->buffer.multiPlaneBuffer.fd[0]; 390 pSrcBuf[1] = dstOutputData->buffer.multiPlaneBuffer.fd[1]; 391 pSrcBuf[2] = dstOutputData->buffer.multiPlaneBuffer.fd[2]; 392 } 393 394 #ifdef USE_ANB 395 if ((exynosOutputPort->bIsANBEnabled == OMX_TRUE) || 396 (exynosOutputPort->bStoreMetaData == OMX_TRUE)) { 397 ExynosVideoPlane planes[MAX_BUFFER_PLANE]; 398 OMX_U32 stride; 399 if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) { 400 Exynos_OSAL_LockANB(pOutputBuf, width, height, exynosOutputPort->portDefinition.format.video.eColorFormat, &stride, planes); 401 } else if (exynosOutputPort->bStoreMetaData == OMX_TRUE) { 402 Exynos_OSAL_LockMetaData(pOutputBuf, width, height, exynosOutputPort->portDefinition.format.video.eColorFormat, &stride, planes); 403 } 404 width = stride; 405 outputUseBuffer->dataLen = sizeof(void *); 406 407 if (csc_method == CSC_METHOD_SW) { 408 pYUVBuf[0] = (unsigned char *)planes[0].addr; 409 pYUVBuf[1] = (unsigned char *)planes[1].addr; 410 pYUVBuf[2] = (unsigned char *)planes[2].addr; 411 } else { 412 pYUVBuf[0] = (unsigned char *)planes[0].fd; 413 pYUVBuf[1] = (unsigned char *)planes[1].fd; 414 pYUVBuf[2] = (unsigned char *)planes[2].fd; 415 } 416 } 417 #endif 418 if ((exynosOutputPort->bIsANBEnabled == OMX_FALSE) && 419 (exynosOutputPort->bStoreMetaData == OMX_FALSE) && 420 (csc_method == CSC_METHOD_HW)) { 421 pYUVBuf[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pOutputBuf); 422 pYUVBuf[1] = NULL; 423 pYUVBuf[2] = NULL; 424 } 425 426 if (pVideoDec->csc_set_format == OMX_FALSE) { 427 csc_set_src_format( 428 pVideoDec->csc_handle, /* handle */ 429 width, /* width */ 430 height, /* height */ 431 0, /* crop_left */ 432 0, /* crop_right */ 433 width, /* crop_width */ 434 height, /* crop_height */ 435 omx_2_hal_pixel_format(colorFormat), /* color_format */ 436 cacheable); /* cacheable */ 437 csc_set_dst_format( 438 pVideoDec->csc_handle, /* handle */ 439 width, /* width */ 440 height, /* height */ 441 0, /* crop_left */ 442 0, /* crop_right */ 443 width, /* crop_width */ 444 height, /* crop_height */ 445 omx_2_hal_pixel_format(exynosOutputPort->portDefinition.format.video.eColorFormat), /* color_format */ 446 cacheable); /* cacheable */ 447 pVideoDec->csc_set_format = OMX_TRUE; 448 } 449 csc_set_src_buffer( 450 pVideoDec->csc_handle, /* handle */ 451 pSrcBuf); /* YUV Addr or FD */ 452 csc_set_dst_buffer( 453 pVideoDec->csc_handle, /* handle */ 454 pYUVBuf); /* YUV Addr or FD */ 455 cscRet = csc_convert(pVideoDec->csc_handle); 456 if (cscRet != CSC_ErrorNone) 457 ret = OMX_FALSE; 458 else 459 ret = OMX_TRUE; 460 461 #ifdef USE_ANB 462 if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) { 463 Exynos_OSAL_UnlockANB(pOutputBuf); 464 } else if (exynosOutputPort->bStoreMetaData == OMX_TRUE) { 465 Exynos_OSAL_UnlockMetaData(pOutputBuf); 466 } 467 #endif 468 469 EXIT: 470 FunctionOut(); 471 472 return ret; 473 } 474 475 OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *srcInputData) 476 { 477 OMX_BOOL ret = OMX_FALSE; 478 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 479 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 480 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 481 EXYNOS_OMX_DATABUFFER *inputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer; 482 OMX_U32 copySize = 0; 483 OMX_BYTE checkInputStream = NULL; 484 OMX_U32 checkInputStreamLen = 0; 485 486 FunctionIn(); 487 488 if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 489 if ((srcInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) || 490 (srcInputData->pPrivate == NULL)) { 491 ret = OMX_FALSE; 492 goto EXIT; 493 } 494 } 495 496 if (inputUseBuffer->dataValid == OMX_TRUE) { 497 if (exynosInputPort->bufferProcessType == BUFFER_SHARE) { 498 Exynos_Shared_BufferToData(inputUseBuffer, srcInputData, ONE_PLANE); 499 500 if (pVideoDec->bDRMPlayerMode == OMX_TRUE) { 501 OMX_PTR dataBuffer = NULL; 502 503 dataBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec->hSharedMemory, 504 srcInputData->buffer.singlePlaneBuffer.dataBuffer); 505 if (dataBuffer == NULL) { 506 ret = OMX_FALSE; 507 goto EXIT; 508 } 509 510 srcInputData->buffer.singlePlaneBuffer.dataBuffer = dataBuffer; 511 } 512 513 /* reset dataBuffer */ 514 Exynos_ResetDataBuffer(inputUseBuffer); 515 } else if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 516 checkInputStream = inputUseBuffer->bufferHeader->pBuffer + inputUseBuffer->usedDataLen; 517 checkInputStreamLen = inputUseBuffer->remainDataLen; 518 519 pExynosComponent->bUseFlagEOF = OMX_TRUE; 520 521 copySize = checkInputStreamLen; 522 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_TRUE"); 523 524 if (((srcInputData->allocSize) - (srcInputData->dataLen)) >= copySize) { 525 if (copySize > 0) { 526 Exynos_OSAL_Memcpy(srcInputData->buffer.singlePlaneBuffer.dataBuffer + srcInputData->dataLen, 527 checkInputStream, copySize); 528 } 529 530 inputUseBuffer->dataLen -= copySize; 531 inputUseBuffer->remainDataLen -= copySize; 532 inputUseBuffer->usedDataLen += copySize; 533 534 srcInputData->dataLen += copySize; 535 srcInputData->remainDataLen += copySize; 536 537 srcInputData->timeStamp = inputUseBuffer->timeStamp; 538 srcInputData->nFlags = inputUseBuffer->nFlags; 539 srcInputData->bufferHeader = inputUseBuffer->bufferHeader; 540 } else { 541 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "input codec buffer is smaller than decoded input data size Out Length"); 542 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 543 pExynosComponent->callbackData, 544 OMX_EventError, OMX_ErrorUndefined, 0, NULL); 545 ret = OMX_FALSE; 546 } 547 548 Exynos_InputBufferReturn(pOMXComponent, inputUseBuffer); 549 } 550 551 if ((srcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) { 552 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "bSaveFlagEOS : OMX_TRUE"); 553 pExynosComponent->bSaveFlagEOS = OMX_TRUE; 554 if (srcInputData->dataLen != 0) 555 pExynosComponent->bBehaviorEOS = OMX_TRUE; 556 } 557 558 if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) { 559 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_TRUE; 560 pExynosComponent->checkTimeStamp.startTimeStamp = srcInputData->timeStamp; 561 pExynosComponent->checkTimeStamp.nStartFlags = srcInputData->nFlags; 562 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE; 563 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "first frame timestamp after seeking %lld us (%.2f secs)", 564 srcInputData->timeStamp, srcInputData->timeStamp / 1E6); 565 } 566 567 ret = OMX_TRUE; 568 } 569 570 EXIT: 571 572 FunctionOut(); 573 574 return ret; 575 } 576 577 OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData) 578 { 579 OMX_BOOL ret = OMX_FALSE; 580 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 581 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 582 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 583 EXYNOS_OMX_DATABUFFER *outputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer; 584 OMX_U32 copySize = 0; 585 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL; 586 587 FunctionIn(); 588 589 if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) { 590 if ((exynosOutputPort->bIsANBEnabled == OMX_FALSE) && 591 (exynosOutputPort->bStoreMetaData == OMX_FALSE)) { 592 if (Exynos_Shared_DataToBuffer(dstOutputData, outputUseBuffer) == OMX_ErrorNone) 593 outputUseBuffer->dataValid = OMX_TRUE; 594 } else { 595 if (Exynos_Shared_DataToANBBuffer(dstOutputData, outputUseBuffer, exynosOutputPort) == OMX_ErrorNone) { 596 outputUseBuffer->dataValid = OMX_TRUE; 597 } else { 598 ret = OMX_FALSE; 599 goto EXIT; 600 } 601 } 602 } 603 604 if (outputUseBuffer->dataValid == OMX_TRUE) { 605 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out timestamp after seeking %lld us (%.2f secs)", 606 dstOutputData->timeStamp, dstOutputData->timeStamp / 1E6); 607 if ((pExynosComponent->checkTimeStamp.needCheckStartTimeStamp == OMX_TRUE) && 608 ((dstOutputData->nFlags & OMX_BUFFERFLAG_EOS) != OMX_BUFFERFLAG_EOS)) { 609 if ((pExynosComponent->checkTimeStamp.startTimeStamp == dstOutputData->timeStamp) && 610 (pExynosComponent->checkTimeStamp.nStartFlags == dstOutputData->nFlags)){ 611 pExynosComponent->checkTimeStamp.startTimeStamp = -19761123; 612 pExynosComponent->checkTimeStamp.nStartFlags = 0x0; 613 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE; 614 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE; 615 } else { 616 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "drop frame after seeking", pExynosComponent); 617 if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) 618 Exynos_OMX_FillThisBuffer(pOMXComponent, outputUseBuffer->bufferHeader); 619 ret = OMX_TRUE; 620 goto EXIT; 621 } 622 } else if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE)) { 623 ret = OMX_TRUE; 624 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "not set check timestame after seeking"); 625 goto EXIT; 626 } 627 628 if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 629 OMX_U32 width = 0, height = 0; 630 int imageSize = 0; 631 void *pOutputBuf = (void *)outputUseBuffer->bufferHeader->pBuffer; 632 633 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)dstOutputData->extInfo; 634 635 width = pBufferInfo->imageWidth; 636 height = pBufferInfo->imageHeight; 637 imageSize = width * height; 638 639 if ((dstOutputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) && 640 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) { 641 copySize = dstOutputData->remainDataLen; 642 Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"copySize: %d", copySize); 643 644 outputUseBuffer->dataLen += copySize; 645 outputUseBuffer->remainDataLen += copySize; 646 outputUseBuffer->nFlags = dstOutputData->nFlags; 647 outputUseBuffer->timeStamp = dstOutputData->timeStamp; 648 649 if (outputUseBuffer->remainDataLen > 0) { 650 ret = Exynos_CSC_OutputData(pOMXComponent, dstOutputData); 651 } else { 652 ret = OMX_TRUE; 653 } 654 655 if (ret == OMX_TRUE) { 656 if ((outputUseBuffer->remainDataLen > 0) || 657 ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) || 658 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) { 659 Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer); 660 } 661 } else { 662 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "csc_convert Error"); 663 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 664 pExynosComponent->callbackData, 665 OMX_EventError, OMX_ErrorUndefined, 0, NULL); 666 ret = OMX_FALSE; 667 } 668 } else if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) { 669 outputUseBuffer->dataLen = 0; 670 outputUseBuffer->remainDataLen = 0; 671 outputUseBuffer->nFlags = dstOutputData->nFlags; 672 outputUseBuffer->timeStamp = dstOutputData->timeStamp; 673 Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer); 674 } else { 675 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "output buffer is smaller than decoded data size Out Length"); 676 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 677 pExynosComponent->callbackData, 678 OMX_EventError, OMX_ErrorUndefined, 0, NULL); 679 ret = OMX_FALSE; 680 } 681 } else if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) { 682 if ((outputUseBuffer->remainDataLen > 0) || 683 ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) || 684 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) 685 Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer); 686 } 687 } else { 688 ret = OMX_FALSE; 689 } 690 691 EXIT: 692 FunctionOut(); 693 694 return ret; 695 } 696 697 OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent) 698 { 699 OMX_ERRORTYPE ret = OMX_ErrorNone; 700 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 701 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 702 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 703 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 704 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 705 EXYNOS_OMX_DATABUFFER *srcInputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer; 706 EXYNOS_OMX_DATA *pSrcInputData = &exynosInputPort->processData; 707 OMX_BOOL bCheckInputData = OMX_FALSE; 708 OMX_BOOL bValidCodecData = OMX_FALSE; 709 710 FunctionIn(); 711 712 while (!pVideoDec->bExitBufferProcessThread) { 713 Exynos_OSAL_SleepMillisec(0); 714 Exynos_Wait_ProcessPause(pExynosComponent, INPUT_PORT_INDEX); 715 716 while ((Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) && 717 (!pVideoDec->bExitBufferProcessThread)) { 718 Exynos_OSAL_SleepMillisec(0); 719 720 if ((CHECK_PORT_BEING_FLUSHED(exynosInputPort)) || 721 ((exynosOutputPort->exceptionFlag != GENERAL_STATE) && (ret == OMX_ErrorInputDataDecodeYet))) 722 break; 723 if (exynosInputPort->portState != OMX_StateIdle) 724 break; 725 726 Exynos_OSAL_MutexLock(srcInputUseBuffer->bufferMutex); 727 if (ret != OMX_ErrorInputDataDecodeYet) { 728 if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 729 OMX_PTR codecBuffer; 730 if ((pSrcInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) || (pSrcInputData->pPrivate == NULL)) { 731 Exynos_CodecBufferDeQueue(pExynosComponent, INPUT_PORT_INDEX, &codecBuffer); 732 if (codecBuffer != NULL) { 733 Exynos_Input_CodecBufferToData(pExynosComponent, codecBuffer, pSrcInputData); 734 } 735 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex); 736 break; 737 } 738 } 739 740 if (srcInputUseBuffer->dataValid == OMX_TRUE) { 741 bCheckInputData = Exynos_Preprocessor_InputData(pOMXComponent, pSrcInputData); 742 } else { 743 bCheckInputData = OMX_FALSE; 744 } 745 746 if ((bCheckInputData == OMX_FALSE) && 747 (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) { 748 ret = Exynos_InputBufferGetQueue(pExynosComponent); 749 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex); 750 break; 751 } 752 753 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort)) { 754 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex); 755 break; 756 } 757 } 758 759 ret = pVideoDec->exynos_codec_srcInputProcess(pOMXComponent, pSrcInputData); 760 if (ret != OMX_ErrorInputDataDecodeYet) { 761 Exynos_ResetCodecData(pSrcInputData); 762 } 763 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex); 764 if (ret == OMX_ErrorCodecInit) 765 pVideoDec->bExitBufferProcessThread = OMX_TRUE; 766 } 767 } 768 769 EXIT: 770 771 FunctionOut(); 772 773 return ret; 774 } 775 776 OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent) 777 { 778 OMX_ERRORTYPE ret = OMX_ErrorNone; 779 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 780 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 781 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 782 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 783 EXYNOS_OMX_DATABUFFER *srcOutputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.outputDataBuffer; 784 EXYNOS_OMX_DATA srcOutputData; 785 786 FunctionIn(); 787 788 while (!pVideoDec->bExitBufferProcessThread) { 789 Exynos_OSAL_SleepMillisec(0); 790 791 while (!pVideoDec->bExitBufferProcessThread) { 792 if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 793 if (Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX) == OMX_FALSE) 794 break; 795 } 796 Exynos_OSAL_SleepMillisec(0); 797 798 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort)) 799 break; 800 801 Exynos_OSAL_MutexLock(srcOutputUseBuffer->bufferMutex); 802 ret = pVideoDec->exynos_codec_srcOutputProcess(pOMXComponent, &srcOutputData); 803 804 if (ret == OMX_ErrorNone) { 805 if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 806 OMX_PTR codecBuffer; 807 codecBuffer = srcOutputData.pPrivate; 808 if (codecBuffer != NULL) 809 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, codecBuffer); 810 } 811 if (exynosInputPort->bufferProcessType == BUFFER_SHARE) { 812 Exynos_Shared_DataToBuffer(&srcOutputData, srcOutputUseBuffer); 813 Exynos_InputBufferReturn(pOMXComponent, srcOutputUseBuffer); 814 } 815 Exynos_ResetCodecData(&srcOutputData); 816 } 817 Exynos_OSAL_MutexUnlock(srcOutputUseBuffer->bufferMutex); 818 } 819 } 820 821 EXIT: 822 823 FunctionOut(); 824 825 return ret; 826 } 827 828 OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent) 829 { 830 OMX_ERRORTYPE ret = OMX_ErrorNone; 831 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 832 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 833 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 834 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 835 EXYNOS_OMX_DATABUFFER *dstInputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.inputDataBuffer; 836 EXYNOS_OMX_DATA dstInputData; 837 838 FunctionIn(); 839 840 while (!pVideoDec->bExitBufferProcessThread) { 841 Exynos_OSAL_SleepMillisec(0); 842 843 while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) && 844 (!pVideoDec->bExitBufferProcessThread)) { 845 Exynos_OSAL_SleepMillisec(0); 846 847 if ((CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) || 848 (!CHECK_PORT_POPULATED(exynosOutputPort)) || 849 (exynosOutputPort->exceptionFlag != GENERAL_STATE)) 850 break; 851 if (exynosOutputPort->portState != OMX_StateIdle) 852 break; 853 854 Exynos_OSAL_MutexLock(dstInputUseBuffer->bufferMutex); 855 if (ret != OMX_ErrorOutputBufferUseYet) { 856 if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 857 OMX_PTR codecBuffer; 858 ret = Exynos_CodecBufferDeQueue(pExynosComponent, OUTPUT_PORT_INDEX, &codecBuffer); 859 if (ret != OMX_ErrorNone) { 860 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex); 861 break; 862 } 863 Exynos_Output_CodecBufferToData(pExynosComponent, codecBuffer, &dstInputData); 864 } 865 866 if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) { 867 if ((dstInputUseBuffer->dataValid != OMX_TRUE) && 868 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) { 869 ret = Exynos_OutputBufferGetQueue(pExynosComponent); 870 if (ret != OMX_ErrorNone) { 871 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex); 872 break; 873 } 874 if ((exynosOutputPort->bIsANBEnabled == OMX_FALSE) && 875 (exynosOutputPort->bStoreMetaData == OMX_FALSE)) { 876 Exynos_Shared_BufferToData(dstInputUseBuffer, &dstInputData, TWO_PLANE); 877 } else { 878 ret = Exynos_Shared_ANBBufferToData(dstInputUseBuffer, &dstInputData, exynosOutputPort, TWO_PLANE); 879 if (ret != OMX_ErrorNone) { 880 dstInputUseBuffer->dataValid = OMX_FALSE; 881 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex); 882 break; 883 } 884 } 885 Exynos_OSAL_RefANB_Increase(pVideoDec->hRefHandle, dstInputData.bufferHeader->pBuffer); 886 Exynos_ResetDataBuffer(dstInputUseBuffer); 887 } 888 } 889 890 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) { 891 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex); 892 break; 893 } 894 } 895 896 ret = pVideoDec->exynos_codec_dstInputProcess(pOMXComponent, &dstInputData); 897 if (ret != OMX_ErrorOutputBufferUseYet) { 898 Exynos_ResetCodecData(&dstInputData); 899 } 900 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex); 901 } 902 } 903 904 EXIT: 905 906 FunctionOut(); 907 908 return ret; 909 } 910 911 OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent) 912 { 913 OMX_ERRORTYPE ret = OMX_ErrorNone; 914 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 915 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 916 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 917 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 918 EXYNOS_OMX_DATABUFFER *dstOutputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer; 919 EXYNOS_OMX_DATA *pDstOutputData = &exynosOutputPort->processData; 920 921 FunctionIn(); 922 923 while (!pVideoDec->bExitBufferProcessThread) { 924 Exynos_OSAL_SleepMillisec(0); 925 Exynos_Wait_ProcessPause(pExynosComponent, OUTPUT_PORT_INDEX); 926 927 while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) && 928 (!pVideoDec->bExitBufferProcessThread)) { 929 Exynos_OSAL_SleepMillisec(0); 930 931 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) 932 break; 933 934 Exynos_OSAL_MutexLock(dstOutputUseBuffer->bufferMutex); 935 if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 936 if ((dstOutputUseBuffer->dataValid != OMX_TRUE) && 937 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) { 938 ret = Exynos_OutputBufferGetQueue(pExynosComponent); 939 if (ret != OMX_ErrorNone) { 940 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex); 941 break; 942 } 943 } 944 } 945 946 if ((dstOutputUseBuffer->dataValid == OMX_TRUE) || 947 (exynosOutputPort->bufferProcessType == BUFFER_SHARE)) 948 ret = pVideoDec->exynos_codec_dstOutputProcess(pOMXComponent, pDstOutputData); 949 950 if (((ret == OMX_ErrorNone) && (dstOutputUseBuffer->dataValid == OMX_TRUE)) || 951 (exynosOutputPort->bufferProcessType == BUFFER_SHARE)) { 952 if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) { 953 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL; 954 int i; 955 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo; 956 for (i = 0; i < VIDEO_BUFFER_MAX_NUM; i++) { 957 if (pBufferInfo->PDSB.dpbFD[i].fd > -1) { 958 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "decRefCnt-FD:%d", pBufferInfo->PDSB.dpbFD[i].fd); 959 Exynos_OSAL_RefANB_Decrease(pVideoDec->hRefHandle, pBufferInfo->PDSB.dpbFD[i].fd); 960 } else { 961 break; 962 } 963 } 964 } 965 Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData); 966 } 967 968 if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 969 OMX_PTR codecBuffer = pDstOutputData->pPrivate; 970 if (codecBuffer != NULL) { 971 Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, codecBuffer); 972 pDstOutputData->pPrivate = NULL; 973 } 974 } 975 976 /* reset outputData */ 977 Exynos_ResetCodecData(pDstOutputData); 978 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex); 979 } 980 } 981 982 EXIT: 983 984 FunctionOut(); 985 986 return ret; 987 } 988 989 static OMX_ERRORTYPE Exynos_OMX_SrcInputProcessThread(OMX_PTR threadData) 990 { 991 OMX_ERRORTYPE ret = OMX_ErrorNone; 992 OMX_COMPONENTTYPE *pOMXComponent = NULL; 993 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 994 EXYNOS_OMX_MESSAGE *message = NULL; 995 996 FunctionIn(); 997 998 if (threadData == NULL) { 999 ret = OMX_ErrorBadParameter; 1000 goto EXIT; 1001 } 1002 pOMXComponent = (OMX_COMPONENTTYPE *)threadData; 1003 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 1004 if (ret != OMX_ErrorNone) { 1005 goto EXIT; 1006 } 1007 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 1008 Exynos_OMX_SrcInputBufferProcess(pOMXComponent); 1009 1010 Exynos_OSAL_ThreadExit(NULL); 1011 1012 EXIT: 1013 FunctionOut(); 1014 1015 return ret; 1016 } 1017 1018 static OMX_ERRORTYPE Exynos_OMX_SrcOutputProcessThread(OMX_PTR threadData) 1019 { 1020 OMX_ERRORTYPE ret = OMX_ErrorNone; 1021 OMX_COMPONENTTYPE *pOMXComponent = NULL; 1022 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 1023 EXYNOS_OMX_MESSAGE *message = NULL; 1024 1025 FunctionIn(); 1026 1027 if (threadData == NULL) { 1028 ret = OMX_ErrorBadParameter; 1029 goto EXIT; 1030 } 1031 pOMXComponent = (OMX_COMPONENTTYPE *)threadData; 1032 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 1033 if (ret != OMX_ErrorNone) { 1034 goto EXIT; 1035 } 1036 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 1037 Exynos_OMX_SrcOutputBufferProcess(pOMXComponent); 1038 1039 Exynos_OSAL_ThreadExit(NULL); 1040 1041 EXIT: 1042 FunctionOut(); 1043 1044 return ret; 1045 } 1046 1047 static OMX_ERRORTYPE Exynos_OMX_DstInputProcessThread(OMX_PTR threadData) 1048 { 1049 OMX_ERRORTYPE ret = OMX_ErrorNone; 1050 OMX_COMPONENTTYPE *pOMXComponent = NULL; 1051 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 1052 EXYNOS_OMX_MESSAGE *message = NULL; 1053 1054 FunctionIn(); 1055 1056 if (threadData == NULL) { 1057 ret = OMX_ErrorBadParameter; 1058 goto EXIT; 1059 } 1060 pOMXComponent = (OMX_COMPONENTTYPE *)threadData; 1061 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 1062 if (ret != OMX_ErrorNone) { 1063 goto EXIT; 1064 } 1065 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 1066 Exynos_OMX_DstInputBufferProcess(pOMXComponent); 1067 1068 Exynos_OSAL_ThreadExit(NULL); 1069 1070 EXIT: 1071 FunctionOut(); 1072 1073 return ret; 1074 } 1075 1076 static OMX_ERRORTYPE Exynos_OMX_DstOutputProcessThread(OMX_PTR threadData) 1077 { 1078 OMX_ERRORTYPE ret = OMX_ErrorNone; 1079 OMX_COMPONENTTYPE *pOMXComponent = NULL; 1080 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 1081 EXYNOS_OMX_MESSAGE *message = NULL; 1082 1083 FunctionIn(); 1084 1085 if (threadData == NULL) { 1086 ret = OMX_ErrorBadParameter; 1087 goto EXIT; 1088 } 1089 pOMXComponent = (OMX_COMPONENTTYPE *)threadData; 1090 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 1091 if (ret != OMX_ErrorNone) { 1092 goto EXIT; 1093 } 1094 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 1095 Exynos_OMX_DstOutputBufferProcess(pOMXComponent); 1096 1097 Exynos_OSAL_ThreadExit(NULL); 1098 1099 EXIT: 1100 FunctionOut(); 1101 1102 return ret; 1103 } 1104 1105 OMX_ERRORTYPE Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent) 1106 { 1107 OMX_ERRORTYPE ret = OMX_ErrorNone; 1108 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 1109 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 1110 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 1111 1112 FunctionIn(); 1113 1114 pVideoDec->bExitBufferProcessThread = OMX_FALSE; 1115 1116 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hDstOutputThread, 1117 Exynos_OMX_DstOutputProcessThread, 1118 pOMXComponent); 1119 if (ret == OMX_ErrorNone) 1120 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hSrcOutputThread, 1121 Exynos_OMX_SrcOutputProcessThread, 1122 pOMXComponent); 1123 if (ret == OMX_ErrorNone) 1124 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hDstInputThread, 1125 Exynos_OMX_DstInputProcessThread, 1126 pOMXComponent); 1127 if (ret == OMX_ErrorNone) 1128 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hSrcInputThread, 1129 Exynos_OMX_SrcInputProcessThread, 1130 pOMXComponent); 1131 1132 EXIT: 1133 FunctionOut(); 1134 1135 return ret; 1136 } 1137 1138 OMX_ERRORTYPE Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent) 1139 { 1140 OMX_ERRORTYPE ret = OMX_ErrorNone; 1141 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 1142 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 1143 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 1144 OMX_S32 countValue = 0; 1145 unsigned int i = 0; 1146 1147 FunctionIn(); 1148 1149 pVideoDec->bExitBufferProcessThread = OMX_TRUE; 1150 1151 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID, &countValue); 1152 if (countValue == 0) 1153 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID); 1154 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID, &countValue); 1155 if (countValue == 0) 1156 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID); 1157 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent); 1158 Exynos_OSAL_ThreadTerminate(pVideoDec->hSrcInputThread); 1159 pVideoDec->hSrcInputThread = NULL; 1160 1161 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID, &countValue); 1162 if (countValue == 0) 1163 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID); 1164 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID, &countValue); 1165 if (countValue == 0) 1166 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID); 1167 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent); 1168 Exynos_OSAL_ThreadTerminate(pVideoDec->hDstInputThread); 1169 pVideoDec->hDstInputThread = NULL; 1170 1171 pVideoDec->exynos_codec_stop(pOMXComponent, INPUT_PORT_INDEX); 1172 pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX); 1173 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent); 1174 Exynos_OSAL_ThreadTerminate(pVideoDec->hSrcOutputThread); 1175 pVideoDec->hSrcOutputThread = NULL; 1176 1177 pVideoDec->exynos_codec_stop(pOMXComponent, OUTPUT_PORT_INDEX); 1178 pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX); 1179 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent); 1180 Exynos_OSAL_ThreadTerminate(pVideoDec->hDstOutputThread); 1181 pVideoDec->hDstOutputThread = NULL; 1182 1183 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE; 1184 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE; 1185 1186 EXIT: 1187 FunctionOut(); 1188 1189 return ret; 1190 } 1191 1192 OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent) 1193 { 1194 OMX_ERRORTYPE ret = OMX_ErrorNone; 1195 OMX_COMPONENTTYPE *pOMXComponent = NULL; 1196 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 1197 EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 1198 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 1199 1200 FunctionIn(); 1201 1202 if (hComponent == NULL) { 1203 ret = OMX_ErrorBadParameter; 1204 goto EXIT; 1205 } 1206 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 1207 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 1208 if (ret != OMX_ErrorNone) { 1209 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__); 1210 goto EXIT; 1211 } 1212 1213 ret = Exynos_OMX_BaseComponent_Constructor(pOMXComponent); 1214 if (ret != OMX_ErrorNone) { 1215 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__); 1216 goto EXIT; 1217 } 1218 1219 ret = Exynos_OMX_Port_Constructor(pOMXComponent); 1220 if (ret != OMX_ErrorNone) { 1221 Exynos_OMX_BaseComponent_Destructor(pOMXComponent); 1222 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__); 1223 goto EXIT; 1224 } 1225 1226 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 1227 1228 pVideoDec = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT)); 1229 if (pVideoDec == NULL) { 1230 Exynos_OMX_BaseComponent_Destructor(pOMXComponent); 1231 ret = OMX_ErrorInsufficientResources; 1232 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 1233 goto EXIT; 1234 } 1235 1236 Exynos_OSAL_Memset(pVideoDec, 0, sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT)); 1237 pVideoDec->bReconfigDPB = OMX_FALSE; 1238 pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pVideoDec; 1239 1240 pExynosComponent->bSaveFlagEOS = OMX_FALSE; 1241 pExynosComponent->bBehaviorEOS = OMX_FALSE; 1242 pExynosComponent->bMultiThreadProcess = OMX_TRUE; 1243 1244 /* Input port */ 1245 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 1246 pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_INPUTBUFFER_NUM; 1247 pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_INPUTBUFFER_NUM; 1248 pExynosPort->portDefinition.nBufferSize = 0; 1249 pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo; 1250 1251 pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE); 1252 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video"); 1253 pExynosPort->portDefinition.format.video.pNativeRender = 0; 1254 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE; 1255 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 1256 1257 pExynosPort->portDefinition.format.video.nFrameWidth = 0; 1258 pExynosPort->portDefinition.format.video.nFrameHeight= 0; 1259 pExynosPort->portDefinition.format.video.nStride = 0; 1260 pExynosPort->portDefinition.format.video.nSliceHeight = 0; 1261 pExynosPort->portDefinition.format.video.nBitrate = 64000; 1262 pExynosPort->portDefinition.format.video.xFramerate = (15 << 16); 1263 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; 1264 pExynosPort->portDefinition.format.video.pNativeWindow = NULL; 1265 1266 /* Output port */ 1267 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 1268 pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_OUTPUTBUFFER_NUM; 1269 pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_OUTPUTBUFFER_NUM; 1270 pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE; 1271 pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo; 1272 1273 pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE); 1274 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video"); 1275 pExynosPort->portDefinition.format.video.pNativeRender = 0; 1276 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE; 1277 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 1278 1279 pExynosPort->portDefinition.format.video.nFrameWidth = 0; 1280 pExynosPort->portDefinition.format.video.nFrameHeight= 0; 1281 pExynosPort->portDefinition.format.video.nStride = 0; 1282 pExynosPort->portDefinition.format.video.nSliceHeight = 0; 1283 pExynosPort->portDefinition.format.video.nBitrate = 64000; 1284 pExynosPort->portDefinition.format.video.xFramerate = (15 << 16); 1285 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; 1286 pExynosPort->portDefinition.format.video.pNativeWindow = NULL; 1287 1288 pExynosPort->processData.extInfo = (OMX_PTR)Exynos_OSAL_Malloc(sizeof(DECODE_CODEC_EXTRA_BUFFERINFO)); 1289 Exynos_OSAL_Memset(((char *)pExynosPort->processData.extInfo), 0, sizeof(DECODE_CODEC_EXTRA_BUFFERINFO)); 1290 { 1291 int i = 0; 1292 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL; 1293 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)(pExynosPort->processData.extInfo); 1294 for (i = 0; i < VIDEO_BUFFER_MAX_NUM; i++) { 1295 pBufferInfo->PDSB.dpbFD[i].fd = -1; 1296 pBufferInfo->PDSB.dpbFD[i].fd1 = -1; 1297 pBufferInfo->PDSB.dpbFD[i].fd2 = -1; 1298 } 1299 } 1300 pOMXComponent->UseBuffer = &Exynos_OMX_UseBuffer; 1301 pOMXComponent->AllocateBuffer = &Exynos_OMX_AllocateBuffer; 1302 pOMXComponent->FreeBuffer = &Exynos_OMX_FreeBuffer; 1303 pOMXComponent->ComponentTunnelRequest = &Exynos_OMX_ComponentTunnelRequest; 1304 1305 pExynosComponent->exynos_AllocateTunnelBuffer = &Exynos_OMX_AllocateTunnelBuffer; 1306 pExynosComponent->exynos_FreeTunnelBuffer = &Exynos_OMX_FreeTunnelBuffer; 1307 pExynosComponent->exynos_BufferProcessCreate = &Exynos_OMX_BufferProcess_Create; 1308 pExynosComponent->exynos_BufferProcessTerminate = &Exynos_OMX_BufferProcess_Terminate; 1309 pExynosComponent->exynos_BufferFlush = &Exynos_OMX_BufferFlush; 1310 1311 pVideoDec->hRefHandle = Exynos_OSAL_RefANB_Create(); 1312 1313 EXIT: 1314 FunctionOut(); 1315 1316 return ret; 1317 } 1318 1319 OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent) 1320 { 1321 OMX_ERRORTYPE ret = OMX_ErrorNone; 1322 OMX_COMPONENTTYPE *pOMXComponent = NULL; 1323 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 1324 EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 1325 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 1326 int i = 0; 1327 1328 FunctionIn(); 1329 1330 if (hComponent == NULL) { 1331 ret = OMX_ErrorBadParameter; 1332 goto EXIT; 1333 } 1334 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 1335 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 1336 if (ret != OMX_ErrorNone) { 1337 goto EXIT; 1338 } 1339 1340 if (pOMXComponent->pComponentPrivate == NULL) { 1341 ret = OMX_ErrorBadParameter; 1342 goto EXIT; 1343 } 1344 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 1345 1346 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 1347 1348 Exynos_OSAL_RefANB_Terminate(pVideoDec->hRefHandle); 1349 1350 Exynos_OSAL_Free(pVideoDec); 1351 pExynosComponent->hComponentHandle = pVideoDec = NULL; 1352 1353 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 1354 if (pExynosPort->processData.extInfo != NULL) { 1355 Exynos_OSAL_Free(pExynosPort->processData.extInfo); 1356 pExynosPort->processData.extInfo = NULL; 1357 } 1358 1359 for(i = 0; i < ALL_PORT_NUM; i++) { 1360 pExynosPort = &pExynosComponent->pExynosPort[i]; 1361 Exynos_OSAL_Free(pExynosPort->portDefinition.format.video.cMIMEType); 1362 pExynosPort->portDefinition.format.video.cMIMEType = NULL; 1363 } 1364 1365 ret = Exynos_OMX_Port_Destructor(pOMXComponent); 1366 1367 ret = Exynos_OMX_BaseComponent_Destructor(hComponent); 1368 1369 EXIT: 1370 FunctionOut(); 1371 1372 return ret; 1373 } 1374