3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 * @file Exynos_OMX_Vdec.c
21 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
22 * HyeYeon Chung (hyeon.chung@samsung.com)
23 * Yunji Kim (yunji.kim@samsung.com)
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_Thread.h"
38 #include "Exynos_OSAL_Semaphore.h"
39 #include "Exynos_OSAL_Mutex.h"
40 #include "Exynos_OSAL_ETC.h"
43 #include "Exynos_OSAL_Android.h"
46 #include "ExynosVideoApi.h"
50 #define EXYNOS_LOG_TAG "EXYNOS_VIDEO_DEC"
51 #define EXYNOS_LOG_OFF
52 //#define EXYNOS_TRACE_ON
53 #include "Exynos_OSAL_Log.h"
56 int calc_plane(int width
, int height
)
60 mbX
= (width
+ 15)/16;
61 mbY
= (height
+ 15)/16;
63 /* Alignment for interlaced processing */
64 mbY
= (mbY
+ 1) / 2 * 2;
66 return (mbX
* 16) * (mbY
* 16);
69 inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE
*pOMXComponent
)
71 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
72 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
73 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
75 if ((exynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
!=
76 exynosInputPort
->portDefinition
.format
.video
.nFrameWidth
) ||
77 (exynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
!=
78 exynosInputPort
->portDefinition
.format
.video
.nFrameHeight
)) {
79 OMX_U32 width
= 0, height
= 0;
81 exynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
=
82 exynosInputPort
->portDefinition
.format
.video
.nFrameWidth
;
83 exynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
=
84 exynosInputPort
->portDefinition
.format
.video
.nFrameHeight
;
85 width
= exynosOutputPort
->portDefinition
.format
.video
.nStride
=
86 exynosInputPort
->portDefinition
.format
.video
.nStride
;
87 height
= exynosOutputPort
->portDefinition
.format
.video
.nSliceHeight
=
88 exynosInputPort
->portDefinition
.format
.video
.nSliceHeight
;
90 switch(exynosOutputPort
->portDefinition
.format
.video
.eColorFormat
) {
91 case OMX_COLOR_FormatYUV420Planar
:
92 case OMX_COLOR_FormatYUV420SemiPlanar
:
94 exynosOutputPort
->portDefinition
.nBufferSize
= (width
* height
* 3) / 2;
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
;
107 exynosOutputPort
->portDefinition
.nBufferSize
= width
* height
* 2;
115 OMX_BOOL
Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 nPortIndex
)
117 OMX_BOOL ret
= OMX_FALSE
;
119 if ((pExynosComponent
->currentState
== OMX_StateExecuting
) &&
120 (pExynosComponent
->pExynosPort
[nPortIndex
].portState
== OMX_StateIdle
) &&
121 (pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
122 (pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateIdleToExecuting
)) {
131 OMX_ERRORTYPE
Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_PTR codecBuffer
, EXYNOS_OMX_DATA
*pData
)
133 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
134 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
135 CODEC_DEC_BUFFER
*pInputCodecBuffer
= (CODEC_DEC_BUFFER
*)codecBuffer
;
137 pData
->buffer
.singlePlaneBuffer
.dataBuffer
= pInputCodecBuffer
->pVirAddr
[0];
138 pData
->buffer
.singlePlaneBuffer
.fd
= pInputCodecBuffer
->fd
[0];
139 pData
->allocSize
= pInputCodecBuffer
->bufferSize
[0];
140 pData
->dataLen
= pInputCodecBuffer
->dataSize
;
141 pData
->usedDataLen
= 0;
142 pData
->remainDataLen
= pInputCodecBuffer
->dataSize
;
145 pData
->timeStamp
= 0;
146 pData
->pPrivate
= codecBuffer
;
147 pData
->bufferHeader
= NULL
;
152 OMX_ERRORTYPE
Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_PTR codecBuffer
, EXYNOS_OMX_DATA
*pData
)
154 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
155 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
156 OMX_PTR pSrcBuf
[MAX_BUFFER_PLANE
];
157 OMX_U32 allocSize
[MAX_BUFFER_PLANE
];
159 pVideoDec
->exynos_codec_getCodecOutputPrivateData(codecBuffer
, pSrcBuf
, allocSize
);
160 pData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] = pSrcBuf
[0];
161 pData
->buffer
.multiPlaneBuffer
.dataBuffer
[1] = pSrcBuf
[1];
162 pData
->buffer
.multiPlaneBuffer
.dataBuffer
[2] = pSrcBuf
[2];
163 pData
->allocSize
= allocSize
[0] + allocSize
[1] + allocSize
[2];
165 pData
->usedDataLen
= 0;
166 pData
->remainDataLen
= 0;
169 pData
->timeStamp
= 0;
170 pData
->pPrivate
= codecBuffer
;
171 pData
->bufferHeader
= NULL
;
176 void Exynos_Wait_ProcessPause(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 nPortIndex
)
178 EXYNOS_OMX_BASEPORT
*exynosOMXInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
179 EXYNOS_OMX_BASEPORT
*exynosOMXOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
180 EXYNOS_OMX_BASEPORT
*exynosOMXPort
= NULL
;
184 exynosOMXPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
186 if (((pExynosComponent
->currentState
== OMX_StatePause
) ||
187 (pExynosComponent
->currentState
== OMX_StateIdle
) ||
188 (pExynosComponent
->transientState
== EXYNOS_OMX_TransStateLoadedToIdle
) ||
189 (pExynosComponent
->transientState
== EXYNOS_OMX_TransStateExecutingToIdle
)) &&
190 (pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateIdleToLoaded
) &&
191 (!CHECK_PORT_BEING_FLUSHED(exynosOMXPort
))) {
192 Exynos_OSAL_SignalWait(pExynosComponent
->pExynosPort
[nPortIndex
].pauseEvent
, DEF_MAX_WAIT_TIME
);
193 Exynos_OSAL_SignalReset(pExynosComponent
->pExynosPort
[nPortIndex
].pauseEvent
);
201 OMX_BOOL
Exynos_CSC_OutputData(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*dstOutputData
)
203 OMX_BOOL ret
= OMX_FALSE
;
204 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
205 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
206 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
207 EXYNOS_OMX_DATABUFFER
*outputUseBuffer
= &exynosOutputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
208 OMX_U32 copySize
= 0;
209 DECODE_CODEC_EXTRA_BUFFERINFO
*pBufferInfo
= NULL
;
213 OMX_U32 width
= 0, height
= 0;
215 OMX_COLOR_FORMATTYPE colorFormat
;
217 void *pOutputBuf
= (void *)outputUseBuffer
->bufferHeader
->pBuffer
;
218 void *pSrcBuf
[MAX_BUFFER_PLANE
] = {NULL
, };
219 void *pYUVBuf
[MAX_BUFFER_PLANE
] = {NULL
, };
221 CSC_ERRORCODE cscRet
= CSC_ErrorNone
;
222 CSC_METHOD csc_method
= CSC_METHOD_SW
;
223 unsigned int cacheable
= 1;
225 pBufferInfo
= (DECODE_CODEC_EXTRA_BUFFERINFO
*)dstOutputData
->extInfo
;
227 width
= pBufferInfo
->imageWidth
;
228 height
= pBufferInfo
->imageHeight
;
229 imageSize
= width
* height
;
230 colorFormat
= pBufferInfo
->ColorFormat
;
232 pSrcBuf
[0] = dstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0];
233 pSrcBuf
[1] = dstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[1];
234 pSrcBuf
[2] = dstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[2];
236 pYUVBuf
[0] = (unsigned char *)pOutputBuf
;
237 pYUVBuf
[1] = (unsigned char *)pOutputBuf
+ imageSize
;
238 pYUVBuf
[2] = (unsigned char *)pOutputBuf
+ imageSize
+ imageSize
/ 4;
240 csc_get_method(pVideoDec
->csc_handle
, &csc_method
);
241 if (csc_method
== CSC_METHOD_HW
) {
242 pSrcBuf
[0] = dstOutputData
->buffer
.multiPlaneBuffer
.fd
[0];
243 pSrcBuf
[1] = dstOutputData
->buffer
.multiPlaneBuffer
.fd
[1];
244 pSrcBuf
[2] = dstOutputData
->buffer
.multiPlaneBuffer
.fd
[2];
248 if (exynosOutputPort
->bIsANBEnabled
== OMX_TRUE
) {
249 ExynosVideoPlane planes
[MAX_BUFFER_PLANE
];
251 Exynos_OSAL_LockANB(pOutputBuf
, width
, height
, exynosOutputPort
->portDefinition
.format
.video
.eColorFormat
, &stride
, planes
);
253 outputUseBuffer
->dataLen
= sizeof(void *);
255 if (csc_method
== CSC_METHOD_SW
) {
256 pYUVBuf
[0] = (unsigned char *)planes
[0].addr
;
257 pYUVBuf
[1] = (unsigned char *)planes
[1].addr
;
258 pYUVBuf
[2] = (unsigned char *)planes
[2].addr
;
260 pYUVBuf
[0] = (unsigned char *)planes
[0].fd
;
261 pYUVBuf
[1] = (unsigned char *)planes
[1].fd
;
262 pYUVBuf
[2] = (unsigned char *)planes
[2].fd
;
266 if ((exynosOutputPort
->bIsANBEnabled
== OMX_FALSE
) &&
267 (csc_method
== CSC_METHOD_HW
)) {
268 pYUVBuf
[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec
->hSharedMemory
, pOutputBuf
);
273 if (pVideoDec
->csc_set_format
== OMX_FALSE
) {
275 pVideoDec
->csc_handle
, /* handle */
280 width
, /* crop_width */
281 height
, /* crop_height */
282 omx_2_hal_pixel_format(colorFormat
), /* color_format */
283 cacheable
); /* cacheable */
285 pVideoDec
->csc_handle
, /* handle */
290 width
, /* crop_width */
291 height
, /* crop_height */
292 omx_2_hal_pixel_format(exynosOutputPort
->portDefinition
.format
.video
.eColorFormat
), /* color_format */
293 cacheable
); /* cacheable */
294 pVideoDec
->csc_set_format
= OMX_TRUE
;
297 pVideoDec
->csc_handle
, /* handle */
298 pSrcBuf
); /* YUV Addr or FD */
300 pVideoDec
->csc_handle
, /* handle */
301 pYUVBuf
); /* YUV Addr or FD */
302 cscRet
= csc_convert(pVideoDec
->csc_handle
);
303 if (cscRet
!= CSC_ErrorNone
)
309 if (exynosOutputPort
->bIsANBEnabled
== OMX_TRUE
) {
310 Exynos_OSAL_UnlockANB(pOutputBuf
);
320 OMX_BOOL
Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*srcInputData
)
322 OMX_BOOL ret
= OMX_FALSE
;
323 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
324 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
325 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
326 EXYNOS_OMX_DATABUFFER
*inputUseBuffer
= &exynosInputPort
->way
.port2WayDataBuffer
.inputDataBuffer
;
327 OMX_U32 copySize
= 0;
328 OMX_BYTE checkInputStream
= NULL
;
329 OMX_U32 checkInputStreamLen
= 0;
333 if (exynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
334 if ((srcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
== NULL
) ||
335 (srcInputData
->pPrivate
== NULL
)) {
341 if (inputUseBuffer
->dataValid
== OMX_TRUE
) {
342 if (exynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
343 Exynos_Shared_BufferToData(inputUseBuffer
, srcInputData
, ONE_PLANE
);
345 if (pVideoDec
->bDRMPlayerMode
== OMX_TRUE
) {
346 OMX_PTR dataBuffer
= NULL
;
348 dataBuffer
= Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec
->hSharedMemory
,
349 srcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
);
350 if (dataBuffer
== NULL
) {
355 srcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
= dataBuffer
;
358 /* reset dataBuffer */
359 Exynos_ResetDataBuffer(inputUseBuffer
);
360 } else if (exynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
361 checkInputStream
= inputUseBuffer
->bufferHeader
->pBuffer
+ inputUseBuffer
->usedDataLen
;
362 checkInputStreamLen
= inputUseBuffer
->remainDataLen
;
364 pExynosComponent
->bUseFlagEOF
= OMX_TRUE
;
366 copySize
= checkInputStreamLen
;
367 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "exynos_checkInputFrame : OMX_TRUE");
369 if (((srcInputData
->allocSize
) - (srcInputData
->dataLen
)) >= copySize
) {
371 Exynos_OSAL_Memcpy(srcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
+ srcInputData
->dataLen
,
372 checkInputStream
, copySize
);
375 inputUseBuffer
->dataLen
-= copySize
;
376 inputUseBuffer
->remainDataLen
-= copySize
;
377 inputUseBuffer
->usedDataLen
+= copySize
;
379 srcInputData
->dataLen
+= copySize
;
380 srcInputData
->remainDataLen
+= copySize
;
382 srcInputData
->timeStamp
= inputUseBuffer
->timeStamp
;
383 srcInputData
->nFlags
= inputUseBuffer
->nFlags
;
384 srcInputData
->bufferHeader
= inputUseBuffer
->bufferHeader
;
386 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "input codec buffer is smaller than decoded input data size Out Length");
387 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
388 pExynosComponent
->callbackData
,
389 OMX_EventError
, OMX_ErrorUndefined
, 0, NULL
);
393 Exynos_InputBufferReturn(pOMXComponent
);
396 if ((srcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) {
397 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "bSaveFlagEOS : OMX_TRUE");
398 srcInputData
->dataLen
= 0;
399 srcInputData
->remainDataLen
= 0;
400 pExynosComponent
->bSaveFlagEOS
= OMX_TRUE
;
403 if (pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
== OMX_TRUE
) {
404 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_TRUE
;
405 pExynosComponent
->checkTimeStamp
.startTimeStamp
= srcInputData
->timeStamp
;
406 pExynosComponent
->checkTimeStamp
.nStartFlags
= srcInputData
->nFlags
;
407 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_FALSE
;
408 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "first frame timestamp after seeking %lld us (%.2f secs)",
409 srcInputData
->timeStamp
, srcInputData
->timeStamp
/ 1E6
);
422 OMX_BOOL
Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*dstOutputData
)
424 OMX_BOOL ret
= OMX_FALSE
;
425 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
426 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
427 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
428 EXYNOS_OMX_DATABUFFER
*outputUseBuffer
= &exynosOutputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
429 OMX_U32 copySize
= 0;
430 DECODE_CODEC_EXTRA_BUFFERINFO
*pBufferInfo
= NULL
;
434 if (exynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
435 if (exynosOutputPort
->bIsANBEnabled
== OMX_FALSE
) {
436 if (Exynos_Shared_DataToBuffer(dstOutputData
, outputUseBuffer
) == OMX_ErrorNone
)
437 outputUseBuffer
->dataValid
= OMX_TRUE
;
439 if (Exynos_Shared_DataToANBBuffer(dstOutputData
, outputUseBuffer
, exynosOutputPort
) == OMX_ErrorNone
) {
440 outputUseBuffer
->dataValid
= OMX_TRUE
;
448 if (outputUseBuffer
->dataValid
== OMX_TRUE
) {
449 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "out timestamp after seeking %lld us (%.2f secs)",
450 dstOutputData
->timeStamp
, dstOutputData
->timeStamp
/ 1E6
);
451 if ((pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
== OMX_TRUE
) &&
452 ((dstOutputData
->nFlags
& OMX_BUFFERFLAG_EOS
) != OMX_BUFFERFLAG_EOS
)) {
453 if ((pExynosComponent
->checkTimeStamp
.startTimeStamp
== dstOutputData
->timeStamp
) &&
454 (pExynosComponent
->checkTimeStamp
.nStartFlags
== dstOutputData
->nFlags
)){
455 pExynosComponent
->checkTimeStamp
.startTimeStamp
= -19761123;
456 pExynosComponent
->checkTimeStamp
.nStartFlags
= 0x0;
457 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_FALSE
;
458 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_FALSE
;
460 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "drop frame after seeking", pExynosComponent
);
461 if (exynosOutputPort
->bufferProcessType
& BUFFER_SHARE
)
462 Exynos_OMX_FillThisBuffer(pOMXComponent
, outputUseBuffer
->bufferHeader
);
464 if (pExynosComponent
->checkTimeStamp
.startTimeStamp
< dstOutputData
->timeStamp
) {
465 pExynosComponent
->checkTimeStamp
.startTimeStamp
= -19761123;
466 pExynosComponent
->checkTimeStamp
.nStartFlags
= 0x0;
467 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_FALSE
;
468 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_FALSE
;
474 } else if ((pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
== OMX_TRUE
)) {
476 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "not set check timestame after seeking");
480 if (exynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
481 OMX_U32 width
= 0, height
= 0;
483 void *pOutputBuf
= (void *)outputUseBuffer
->bufferHeader
->pBuffer
;
485 pBufferInfo
= (DECODE_CODEC_EXTRA_BUFFERINFO
*)dstOutputData
->extInfo
;
487 width
= pBufferInfo
->imageWidth
;
488 height
= pBufferInfo
->imageHeight
;
489 imageSize
= width
* height
;
491 if ((dstOutputData
->remainDataLen
<= (outputUseBuffer
->allocSize
- outputUseBuffer
->dataLen
)) &&
492 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))) {
493 copySize
= dstOutputData
->remainDataLen
;
494 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,"copySize: %d", copySize
);
496 outputUseBuffer
->dataLen
+= copySize
;
497 outputUseBuffer
->remainDataLen
+= copySize
;
498 outputUseBuffer
->nFlags
= dstOutputData
->nFlags
;
499 outputUseBuffer
->timeStamp
= dstOutputData
->timeStamp
;
501 if (outputUseBuffer
->remainDataLen
> 0) {
502 ret
= Exynos_CSC_OutputData(pOMXComponent
, dstOutputData
);
507 if (ret
== OMX_TRUE
) {
508 if ((outputUseBuffer
->remainDataLen
> 0) ||
509 ((outputUseBuffer
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) ||
510 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))) {
511 Exynos_OutputBufferReturn(pOMXComponent
);
514 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "csc_convert Error");
515 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
516 pExynosComponent
->callbackData
,
517 OMX_EventError
, OMX_ErrorUndefined
, 0, NULL
);
520 } else if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
)) {
521 outputUseBuffer
->dataLen
= 0;
522 outputUseBuffer
->remainDataLen
= 0;
523 outputUseBuffer
->nFlags
= dstOutputData
->nFlags
;
524 outputUseBuffer
->timeStamp
= dstOutputData
->timeStamp
;
525 Exynos_OutputBufferReturn(pOMXComponent
);
527 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "output buffer is smaller than decoded data size Out Length");
528 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
529 pExynosComponent
->callbackData
,
530 OMX_EventError
, OMX_ErrorUndefined
, 0, NULL
);
533 } else if (exynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
534 if ((outputUseBuffer
->remainDataLen
> 0) ||
535 ((outputUseBuffer
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) ||
536 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
)))
537 Exynos_OutputBufferReturn(pOMXComponent
);
549 OMX_ERRORTYPE
Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent
)
551 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
552 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
553 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
554 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
555 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
556 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
557 EXYNOS_OMX_DATABUFFER
*srcInputUseBuffer
= &exynosInputPort
->way
.port2WayDataBuffer
.inputDataBuffer
;
558 EXYNOS_OMX_DATA
*pSrcInputData
= &exynosInputPort
->processData
;
559 OMX_BOOL bCheckInputData
= OMX_FALSE
;
560 OMX_BOOL bValidCodecData
= OMX_FALSE
;
564 while (!pVideoDec
->bExitBufferProcessThread
) {
565 Exynos_OSAL_SleepMillisec(0);
566 Exynos_Wait_ProcessPause(pExynosComponent
, INPUT_PORT_INDEX
);
568 while ((Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) &&
569 (!pVideoDec
->bExitBufferProcessThread
)) {
570 Exynos_OSAL_SleepMillisec(0);
572 if ((CHECK_PORT_BEING_FLUSHED(exynosInputPort
)) ||
573 ((exynosOutputPort
->exceptionFlag
== NEED_PORT_DISABLE
) && (ret
== OMX_ErrorInputDataDecodeYet
)))
575 if (exynosInputPort
->portState
!= OMX_StateIdle
)
578 Exynos_OSAL_MutexLock(srcInputUseBuffer
->bufferMutex
);
579 if (ret
!= OMX_ErrorInputDataDecodeYet
) {
580 if (exynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
582 if ((pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
== NULL
) || (pSrcInputData
->pPrivate
== NULL
)) {
583 Exynos_CodecBufferDeQueue(pExynosComponent
, INPUT_PORT_INDEX
, &codecBuffer
);
584 if (codecBuffer
!= NULL
) {
585 Exynos_Input_CodecBufferToData(pExynosComponent
, codecBuffer
, pSrcInputData
);
587 Exynos_OSAL_MutexUnlock(srcInputUseBuffer
->bufferMutex
);
592 if (srcInputUseBuffer
->dataValid
== OMX_TRUE
) {
593 bCheckInputData
= Exynos_Preprocessor_InputData(pOMXComponent
, pSrcInputData
);
595 bCheckInputData
= OMX_FALSE
;
598 if ((bCheckInputData
== OMX_FALSE
) &&
599 (!CHECK_PORT_BEING_FLUSHED(exynosInputPort
))) {
600 ret
= Exynos_InputBufferGetQueue(pExynosComponent
);
601 Exynos_OSAL_MutexUnlock(srcInputUseBuffer
->bufferMutex
);
605 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort
)) {
606 Exynos_OSAL_MutexUnlock(srcInputUseBuffer
->bufferMutex
);
611 ret
= pVideoDec
->exynos_codec_srcInputProcess(pOMXComponent
, pSrcInputData
);
612 if (ret
== OMX_ErrorCorruptedFrame
) {
613 if (exynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
615 codecBuffer
= pSrcInputData
->pPrivate
;
616 if (codecBuffer
!= NULL
)
617 Exynos_CodecBufferEnQueue(pExynosComponent
, INPUT_PORT_INDEX
, codecBuffer
);
620 if (exynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
621 Exynos_OMX_InputBufferReturn(pOMXComponent
, pSrcInputData
->bufferHeader
);
625 if (ret
!= OMX_ErrorInputDataDecodeYet
) {
626 Exynos_ResetCodecData(pSrcInputData
);
628 Exynos_OSAL_MutexUnlock(srcInputUseBuffer
->bufferMutex
);
629 if (ret
== OMX_ErrorCodecInit
)
630 pVideoDec
->bExitBufferProcessThread
= OMX_TRUE
;
641 OMX_ERRORTYPE
Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent
)
643 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
644 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
645 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
646 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
647 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
648 EXYNOS_OMX_DATABUFFER
*srcOutputUseBuffer
= &exynosInputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
649 EXYNOS_OMX_DATA srcOutputData
;
653 while (!pVideoDec
->bExitBufferProcessThread
) {
654 Exynos_OSAL_SleepMillisec(0);
656 while (!pVideoDec
->bExitBufferProcessThread
) {
657 if (exynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
658 if (Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
) == OMX_FALSE
)
661 Exynos_OSAL_SleepMillisec(0);
663 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort
))
666 Exynos_OSAL_MutexLock(srcOutputUseBuffer
->bufferMutex
);
667 ret
= pVideoDec
->exynos_codec_srcOutputProcess(pOMXComponent
, &srcOutputData
);
669 if (ret
== OMX_ErrorNone
) {
670 if (exynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
672 codecBuffer
= srcOutputData
.pPrivate
;
673 if (codecBuffer
!= NULL
)
674 Exynos_CodecBufferEnQueue(pExynosComponent
, INPUT_PORT_INDEX
, codecBuffer
);
676 if (exynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
677 Exynos_Shared_DataToBuffer(&srcOutputData
, srcOutputUseBuffer
);
678 Exynos_InputBufferReturn(pOMXComponent
);
680 Exynos_ResetCodecData(&srcOutputData
);
682 Exynos_OSAL_MutexUnlock(srcOutputUseBuffer
->bufferMutex
);
693 OMX_ERRORTYPE
Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent
)
695 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
696 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
697 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
698 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
699 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
700 EXYNOS_OMX_DATABUFFER
*dstInputUseBuffer
= &exynosOutputPort
->way
.port2WayDataBuffer
.inputDataBuffer
;
701 EXYNOS_OMX_DATA dstInputData
;
705 while (!pVideoDec
->bExitBufferProcessThread
) {
706 Exynos_OSAL_SleepMillisec(0);
708 while ((Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) &&
709 (!pVideoDec
->bExitBufferProcessThread
)) {
710 Exynos_OSAL_SleepMillisec(0);
712 if ((CHECK_PORT_BEING_FLUSHED(exynosOutputPort
)) ||
713 (!CHECK_PORT_POPULATED(exynosOutputPort
)))
715 if (exynosOutputPort
->portState
!= OMX_StateIdle
)
718 Exynos_OSAL_MutexLock(dstInputUseBuffer
->bufferMutex
);
719 if (ret
!= OMX_ErrorOutputBufferUseYet
) {
720 if (exynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
722 ret
= Exynos_CodecBufferDeQueue(pExynosComponent
, OUTPUT_PORT_INDEX
, &codecBuffer
);
723 if (ret
!= OMX_ErrorNone
) {
724 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
727 Exynos_Output_CodecBufferToData(pExynosComponent
, codecBuffer
, &dstInputData
);
730 if (exynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
731 if ((dstInputUseBuffer
->dataValid
!= OMX_TRUE
) &&
732 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))) {
733 ret
= Exynos_OutputBufferGetQueue(pExynosComponent
);
734 if (ret
!= OMX_ErrorNone
) {
735 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
738 if (exynosOutputPort
->bIsANBEnabled
== OMX_FALSE
) {
739 Exynos_Shared_BufferToData(dstInputUseBuffer
, &dstInputData
, TWO_PLANE
);
741 ret
= Exynos_Shared_ANBBufferToData(dstInputUseBuffer
, &dstInputData
, exynosOutputPort
, TWO_PLANE
);
742 if (ret
!= OMX_ErrorNone
) {
743 dstInputUseBuffer
->dataValid
= OMX_FALSE
;
744 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
748 Exynos_ResetDataBuffer(dstInputUseBuffer
);
752 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
)) {
753 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
758 ret
= pVideoDec
->exynos_codec_dstInputProcess(pOMXComponent
, &dstInputData
);
759 if (ret
!= OMX_ErrorOutputBufferUseYet
) {
760 Exynos_ResetCodecData(&dstInputData
);
762 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
773 OMX_ERRORTYPE
Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent
)
775 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
776 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
777 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
778 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
779 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
780 EXYNOS_OMX_DATABUFFER
*dstOutputUseBuffer
= &exynosOutputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
781 EXYNOS_OMX_DATA
*pDstOutputData
= &exynosOutputPort
->processData
;
785 while (!pVideoDec
->bExitBufferProcessThread
) {
786 Exynos_OSAL_SleepMillisec(0);
787 Exynos_Wait_ProcessPause(pExynosComponent
, OUTPUT_PORT_INDEX
);
789 while ((Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) &&
790 (!pVideoDec
->bExitBufferProcessThread
)) {
791 Exynos_OSAL_SleepMillisec(0);
793 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))
796 Exynos_OSAL_MutexLock(dstOutputUseBuffer
->bufferMutex
);
797 if (exynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
798 if ((dstOutputUseBuffer
->dataValid
!= OMX_TRUE
) &&
799 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))) {
800 ret
= Exynos_OutputBufferGetQueue(pExynosComponent
);
801 if (ret
!= OMX_ErrorNone
) {
802 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer
->bufferMutex
);
808 if ((dstOutputUseBuffer
->dataValid
== OMX_TRUE
) ||
809 (exynosOutputPort
->bufferProcessType
& BUFFER_SHARE
))
810 ret
= pVideoDec
->exynos_codec_dstOutputProcess(pOMXComponent
, pDstOutputData
);
812 if (((ret
== OMX_ErrorNone
) && (dstOutputUseBuffer
->dataValid
== OMX_TRUE
)) ||
813 (exynosOutputPort
->bufferProcessType
& BUFFER_SHARE
)) {
814 Exynos_Postprocess_OutputData(pOMXComponent
, pDstOutputData
);
817 if (exynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
819 codecBuffer
= pDstOutputData
->pPrivate
;
820 if (codecBuffer
!= NULL
) {
821 Exynos_CodecBufferEnQueue(pExynosComponent
, OUTPUT_PORT_INDEX
, codecBuffer
);
822 pDstOutputData
->pPrivate
= NULL
;
826 /* reset outputData */
827 Exynos_ResetCodecData(pDstOutputData
);
828 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer
->bufferMutex
);
839 static OMX_ERRORTYPE
Exynos_OMX_SrcInputProcessThread(OMX_PTR threadData
)
841 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
842 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
843 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
844 EXYNOS_OMX_MESSAGE
*message
= NULL
;
848 if (threadData
== NULL
) {
849 ret
= OMX_ErrorBadParameter
;
852 pOMXComponent
= (OMX_COMPONENTTYPE
*)threadData
;
853 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
854 if (ret
!= OMX_ErrorNone
) {
857 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
858 Exynos_OMX_SrcInputBufferProcess(pOMXComponent
);
860 Exynos_OSAL_ThreadExit(NULL
);
868 static OMX_ERRORTYPE
Exynos_OMX_SrcOutputProcessThread(OMX_PTR threadData
)
870 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
871 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
872 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
873 EXYNOS_OMX_MESSAGE
*message
= NULL
;
877 if (threadData
== NULL
) {
878 ret
= OMX_ErrorBadParameter
;
881 pOMXComponent
= (OMX_COMPONENTTYPE
*)threadData
;
882 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
883 if (ret
!= OMX_ErrorNone
) {
886 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
887 Exynos_OMX_SrcOutputBufferProcess(pOMXComponent
);
889 Exynos_OSAL_ThreadExit(NULL
);
897 static OMX_ERRORTYPE
Exynos_OMX_DstInputProcessThread(OMX_PTR threadData
)
899 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
900 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
901 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
902 EXYNOS_OMX_MESSAGE
*message
= NULL
;
906 if (threadData
== NULL
) {
907 ret
= OMX_ErrorBadParameter
;
910 pOMXComponent
= (OMX_COMPONENTTYPE
*)threadData
;
911 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
912 if (ret
!= OMX_ErrorNone
) {
915 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
916 Exynos_OMX_DstInputBufferProcess(pOMXComponent
);
918 Exynos_OSAL_ThreadExit(NULL
);
926 static OMX_ERRORTYPE
Exynos_OMX_DstOutputProcessThread(OMX_PTR threadData
)
928 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
929 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
930 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
931 EXYNOS_OMX_MESSAGE
*message
= NULL
;
935 if (threadData
== NULL
) {
936 ret
= OMX_ErrorBadParameter
;
939 pOMXComponent
= (OMX_COMPONENTTYPE
*)threadData
;
940 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
941 if (ret
!= OMX_ErrorNone
) {
944 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
945 Exynos_OMX_DstOutputBufferProcess(pOMXComponent
);
947 Exynos_OSAL_ThreadExit(NULL
);
955 OMX_ERRORTYPE
Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent
)
957 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
958 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
959 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
960 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
964 pVideoDec
->bExitBufferProcessThread
= OMX_FALSE
;
966 ret
= Exynos_OSAL_ThreadCreate(&pVideoDec
->hDstOutputThread
,
967 Exynos_OMX_DstOutputProcessThread
,
969 if (ret
== OMX_ErrorNone
)
970 ret
= Exynos_OSAL_ThreadCreate(&pVideoDec
->hSrcOutputThread
,
971 Exynos_OMX_SrcOutputProcessThread
,
973 if (ret
== OMX_ErrorNone
)
974 ret
= Exynos_OSAL_ThreadCreate(&pVideoDec
->hDstInputThread
,
975 Exynos_OMX_DstInputProcessThread
,
977 if (ret
== OMX_ErrorNone
)
978 ret
= Exynos_OSAL_ThreadCreate(&pVideoDec
->hSrcInputThread
,
979 Exynos_OMX_SrcInputProcessThread
,
988 OMX_ERRORTYPE
Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent
)
990 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
991 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
992 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
993 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
994 OMX_S32 countValue
= 0;
999 pVideoDec
->bExitBufferProcessThread
= OMX_TRUE
;
1001 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].bufferSemID
, &countValue
);
1002 if (countValue
== 0)
1003 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].bufferSemID
);
1004 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].codecSemID
, &countValue
);
1005 if (countValue
== 0)
1006 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].codecSemID
);
1007 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].pauseEvent
);
1008 Exynos_OSAL_ThreadTerminate(pVideoDec
->hSrcInputThread
);
1009 pVideoDec
->hSrcInputThread
= NULL
;
1011 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].bufferSemID
, &countValue
);
1012 if (countValue
== 0)
1013 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].bufferSemID
);
1014 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].codecSemID
, &countValue
);
1015 if (countValue
== 0)
1016 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].codecSemID
);
1017 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].pauseEvent
);
1018 Exynos_OSAL_ThreadTerminate(pVideoDec
->hDstInputThread
);
1019 pVideoDec
->hDstInputThread
= NULL
;
1021 pVideoDec
->exynos_codec_stop(pOMXComponent
, INPUT_PORT_INDEX
);
1022 pVideoDec
->exynos_codec_bufferProcessRun(pOMXComponent
, INPUT_PORT_INDEX
);
1023 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].pauseEvent
);
1024 Exynos_OSAL_ThreadTerminate(pVideoDec
->hSrcOutputThread
);
1025 pVideoDec
->hSrcOutputThread
= NULL
;
1027 pVideoDec
->exynos_codec_stop(pOMXComponent
, OUTPUT_PORT_INDEX
);
1028 pVideoDec
->exynos_codec_bufferProcessRun(pOMXComponent
, INPUT_PORT_INDEX
);
1029 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].pauseEvent
);
1030 Exynos_OSAL_ThreadTerminate(pVideoDec
->hDstOutputThread
);
1031 pVideoDec
->hDstOutputThread
= NULL
;
1039 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent
)
1041 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1042 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1043 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1044 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1045 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
1049 if (hComponent
== NULL
) {
1050 ret
= OMX_ErrorBadParameter
;
1053 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1054 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1055 if (ret
!= OMX_ErrorNone
) {
1056 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
1060 ret
= Exynos_OMX_BaseComponent_Constructor(pOMXComponent
);
1061 if (ret
!= OMX_ErrorNone
) {
1062 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
1066 ret
= Exynos_OMX_Port_Constructor(pOMXComponent
);
1067 if (ret
!= OMX_ErrorNone
) {
1068 Exynos_OMX_BaseComponent_Destructor(pOMXComponent
);
1069 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
1073 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1075 pVideoDec
= Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT
));
1076 if (pVideoDec
== NULL
) {
1077 Exynos_OMX_BaseComponent_Destructor(pOMXComponent
);
1078 ret
= OMX_ErrorInsufficientResources
;
1079 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
1083 Exynos_OSAL_Memset(pVideoDec
, 0, sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT
));
1084 pExynosComponent
->hComponentHandle
= (OMX_HANDLETYPE
)pVideoDec
;
1086 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
1087 pExynosComponent
->bMultiThreadProcess
= OMX_TRUE
;
1090 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1091 pExynosPort
->portDefinition
.nBufferCountActual
= MAX_VIDEO_INPUTBUFFER_NUM
;
1092 pExynosPort
->portDefinition
.nBufferCountMin
= MAX_VIDEO_INPUTBUFFER_NUM
;
1093 pExynosPort
->portDefinition
.nBufferSize
= 0;
1094 pExynosPort
->portDefinition
.eDomain
= OMX_PortDomainVideo
;
1096 pExynosPort
->portDefinition
.format
.video
.cMIMEType
= Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE
);
1097 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
1098 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
1099 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
1100 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1102 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= 0;
1103 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= 0;
1104 pExynosPort
->portDefinition
.format
.video
.nStride
= 0;
1105 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
1106 pExynosPort
->portDefinition
.format
.video
.nBitrate
= 64000;
1107 pExynosPort
->portDefinition
.format
.video
.xFramerate
= (15 << 16);
1108 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
1109 pExynosPort
->portDefinition
.format
.video
.pNativeWindow
= NULL
;
1112 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1113 pExynosPort
->portDefinition
.nBufferCountActual
= MAX_VIDEO_OUTPUTBUFFER_NUM
;
1114 pExynosPort
->portDefinition
.nBufferCountMin
= MAX_VIDEO_OUTPUTBUFFER_NUM
;
1115 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE
;
1116 pExynosPort
->portDefinition
.eDomain
= OMX_PortDomainVideo
;
1118 pExynosPort
->portDefinition
.format
.video
.cMIMEType
= Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE
);
1119 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
1120 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
1121 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
1122 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1124 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= 0;
1125 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= 0;
1126 pExynosPort
->portDefinition
.format
.video
.nStride
= 0;
1127 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
1128 pExynosPort
->portDefinition
.format
.video
.nBitrate
= 64000;
1129 pExynosPort
->portDefinition
.format
.video
.xFramerate
= (15 << 16);
1130 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
1131 pExynosPort
->portDefinition
.format
.video
.pNativeWindow
= NULL
;
1133 pExynosPort
->processData
.extInfo
= (OMX_PTR
)Exynos_OSAL_Malloc(sizeof(DECODE_CODEC_EXTRA_BUFFERINFO
));
1135 pOMXComponent
->UseBuffer
= &Exynos_OMX_UseBuffer
;
1136 pOMXComponent
->AllocateBuffer
= &Exynos_OMX_AllocateBuffer
;
1137 pOMXComponent
->FreeBuffer
= &Exynos_OMX_FreeBuffer
;
1138 pOMXComponent
->ComponentTunnelRequest
= &Exynos_OMX_ComponentTunnelRequest
;
1140 pExynosComponent
->exynos_AllocateTunnelBuffer
= &Exynos_OMX_AllocateTunnelBuffer
;
1141 pExynosComponent
->exynos_FreeTunnelBuffer
= &Exynos_OMX_FreeTunnelBuffer
;
1142 pExynosComponent
->exynos_BufferProcessCreate
= &Exynos_OMX_BufferProcess_Create
;
1143 pExynosComponent
->exynos_BufferProcessTerminate
= &Exynos_OMX_BufferProcess_Terminate
;
1144 pExynosComponent
->exynos_BufferFlush
= &Exynos_OMX_BufferFlush
;
1152 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent
)
1154 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1155 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1156 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1157 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1158 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
1163 if (hComponent
== NULL
) {
1164 ret
= OMX_ErrorBadParameter
;
1167 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1168 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1169 if (ret
!= OMX_ErrorNone
) {
1173 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1174 ret
= OMX_ErrorBadParameter
;
1177 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1179 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1181 Exynos_OSAL_Free(pVideoDec
);
1182 pExynosComponent
->hComponentHandle
= pVideoDec
= NULL
;
1184 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1185 if (pExynosPort
->processData
.extInfo
!= NULL
) {
1186 Exynos_OSAL_Free(pExynosPort
->processData
.extInfo
);
1187 pExynosPort
->processData
.extInfo
= NULL
;
1190 for(i
= 0; i
< ALL_PORT_NUM
; i
++) {
1191 pExynosPort
= &pExynosComponent
->pExynosPort
[i
];
1192 Exynos_OSAL_Free(pExynosPort
->portDefinition
.format
.video
.cMIMEType
);
1193 pExynosPort
->portDefinition
.format
.video
.cMIMEType
= NULL
;
1196 ret
= Exynos_OMX_Port_Destructor(pOMXComponent
);
1198 ret
= Exynos_OMX_BaseComponent_Destructor(hComponent
);