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_VdecControl.c
21 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
30 #include "Exynos_OMX_Macros.h"
31 #include "Exynos_OSAL_Event.h"
32 #include "Exynos_OMX_Vdec.h"
33 #include "Exynos_OMX_VdecControl.h"
34 #include "Exynos_OMX_Basecomponent.h"
35 #include "Exynos_OSAL_Thread.h"
36 #include "Exynos_OSAL_Semaphore.h"
37 #include "Exynos_OSAL_Mutex.h"
38 #include "Exynos_OSAL_ETC.h"
39 #include "Exynos_OSAL_SharedMemory.h"
42 #include "Exynos_OSAL_Android.h"
45 #include "ExynosVideoApi.h"
48 #define EXYNOS_LOG_TAG "EXYNOS_VIDEO_DECCONTROL"
49 #define EXYNOS_LOG_OFF
50 //#define EXYNOS_TRACE_ON
51 #include "Exynos_OSAL_Log.h"
54 OMX_ERRORTYPE
Exynos_OMX_UseBuffer(
55 OMX_IN OMX_HANDLETYPE hComponent
,
56 OMX_INOUT OMX_BUFFERHEADERTYPE
**ppBufferHdr
,
57 OMX_IN OMX_U32 nPortIndex
,
58 OMX_IN OMX_PTR pAppPrivate
,
59 OMX_IN OMX_U32 nSizeBytes
,
60 OMX_IN OMX_U8
*pBuffer
)
62 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
63 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
64 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
65 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
66 OMX_BUFFERHEADERTYPE
*temp_bufferHeader
= NULL
;
71 if (hComponent
== NULL
) {
72 ret
= OMX_ErrorBadParameter
;
75 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
76 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
77 if (ret
!= OMX_ErrorNone
) {
81 if (pOMXComponent
->pComponentPrivate
== NULL
) {
82 ret
= OMX_ErrorBadParameter
;
85 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
87 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
88 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
89 ret
= OMX_ErrorBadPortIndex
;
92 if (pExynosPort
->portState
!= OMX_StateIdle
) {
93 ret
= OMX_ErrorIncorrectStateOperation
;
97 if (CHECK_PORT_TUNNELED(pExynosPort
) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort
)) {
98 ret
= OMX_ErrorBadPortIndex
;
102 temp_bufferHeader
= (OMX_BUFFERHEADERTYPE
*)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE
));
103 if (temp_bufferHeader
== NULL
) {
104 ret
= OMX_ErrorInsufficientResources
;
107 Exynos_OSAL_Memset(temp_bufferHeader
, 0, sizeof(OMX_BUFFERHEADERTYPE
));
109 for (i
= 0; i
< pExynosPort
->portDefinition
.nBufferCountActual
; i
++) {
110 if (pExynosPort
->bufferStateAllocate
[i
] == BUFFER_STATE_FREE
) {
111 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
= temp_bufferHeader
;
112 pExynosPort
->bufferStateAllocate
[i
] = (BUFFER_STATE_ASSIGNED
| HEADER_STATE_ALLOCATED
);
113 INIT_SET_SIZE_VERSION(temp_bufferHeader
, OMX_BUFFERHEADERTYPE
);
114 temp_bufferHeader
->pBuffer
= pBuffer
;
115 temp_bufferHeader
->nAllocLen
= nSizeBytes
;
116 temp_bufferHeader
->pAppPrivate
= pAppPrivate
;
117 if (nPortIndex
== INPUT_PORT_INDEX
)
118 temp_bufferHeader
->nInputPortIndex
= INPUT_PORT_INDEX
;
120 temp_bufferHeader
->nOutputPortIndex
= OUTPUT_PORT_INDEX
;
122 pExynosPort
->assignedBufferNum
++;
123 if (pExynosPort
->assignedBufferNum
== pExynosPort
->portDefinition
.nBufferCountActual
) {
124 pExynosPort
->portDefinition
.bPopulated
= OMX_TRUE
;
125 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
126 Exynos_OSAL_SemaphorePost(pExynosPort
->loadedResource
);
127 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
129 *ppBufferHdr
= temp_bufferHeader
;
135 Exynos_OSAL_Free(temp_bufferHeader
);
136 ret
= OMX_ErrorInsufficientResources
;
144 OMX_ERRORTYPE
Exynos_OMX_AllocateBuffer(
145 OMX_IN OMX_HANDLETYPE hComponent
,
146 OMX_INOUT OMX_BUFFERHEADERTYPE
**ppBuffer
,
147 OMX_IN OMX_U32 nPortIndex
,
148 OMX_IN OMX_PTR pAppPrivate
,
149 OMX_IN OMX_U32 nSizeBytes
)
151 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
152 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
153 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
154 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
155 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
156 OMX_BUFFERHEADERTYPE
*temp_bufferHeader
= NULL
;
157 OMX_U8
*temp_buffer
= NULL
;
158 int temp_buffer_fd
= -1;
160 MEMORY_TYPE mem_type
= SYSTEM_MEMORY
;
164 if (hComponent
== NULL
) {
165 ret
= OMX_ErrorBadParameter
;
168 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
169 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
170 if (ret
!= OMX_ErrorNone
) {
174 if (pOMXComponent
->pComponentPrivate
== NULL
) {
175 ret
= OMX_ErrorBadParameter
;
178 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
179 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
181 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
182 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
183 ret
= OMX_ErrorBadPortIndex
;
187 if (pExynosPort->portState != OMX_StateIdle ) {
188 ret = OMX_ErrorIncorrectStateOperation;
192 if (CHECK_PORT_TUNNELED(pExynosPort
) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort
)) {
193 ret
= OMX_ErrorBadPortIndex
;
197 if ((pVideoDec
->bDRMPlayerMode
== OMX_TRUE
) &&
198 (nPortIndex
== INPUT_PORT_INDEX
)) {
199 mem_type
= SECURE_MEMORY
;
200 } else if ((nPortIndex
== OUTPUT_PORT_INDEX
) &&
201 (pExynosPort
->bufferProcessType
& BUFFER_SHARE
)) {
202 mem_type
= NORMAL_MEMORY
;
205 temp_buffer
= Exynos_OSAL_SharedMemory_Alloc(pVideoDec
->hSharedMemory
, nSizeBytes
, mem_type
);
206 if (temp_buffer
== NULL
) {
207 ret
= OMX_ErrorInsufficientResources
;
210 temp_buffer_fd
= Exynos_OSAL_SharedMemory_VirtToION(pVideoDec
->hSharedMemory
, temp_buffer
);
212 temp_bufferHeader
= (OMX_BUFFERHEADERTYPE
*)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE
));
213 if (temp_bufferHeader
== NULL
) {
214 Exynos_OSAL_SharedMemory_Free(pVideoDec
->hSharedMemory
, temp_buffer
);
215 ret
= OMX_ErrorInsufficientResources
;
218 Exynos_OSAL_Memset(temp_bufferHeader
, 0, sizeof(OMX_BUFFERHEADERTYPE
));
220 for (i
= 0; i
< pExynosPort
->portDefinition
.nBufferCountActual
; i
++) {
221 if (pExynosPort
->bufferStateAllocate
[i
] == BUFFER_STATE_FREE
) {
222 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
= temp_bufferHeader
;
223 pExynosPort
->extendBufferHeader
[i
].buf_fd
[0] = temp_buffer_fd
;
224 pExynosPort
->bufferStateAllocate
[i
] = (BUFFER_STATE_ALLOCATED
| HEADER_STATE_ALLOCATED
);
225 INIT_SET_SIZE_VERSION(temp_bufferHeader
, OMX_BUFFERHEADERTYPE
);
226 if (mem_type
== SECURE_MEMORY
)
227 temp_bufferHeader
->pBuffer
= temp_buffer_fd
;
229 temp_bufferHeader
->pBuffer
= temp_buffer
;
230 temp_bufferHeader
->nAllocLen
= nSizeBytes
;
231 temp_bufferHeader
->pAppPrivate
= pAppPrivate
;
232 if (nPortIndex
== INPUT_PORT_INDEX
)
233 temp_bufferHeader
->nInputPortIndex
= INPUT_PORT_INDEX
;
235 temp_bufferHeader
->nOutputPortIndex
= OUTPUT_PORT_INDEX
;
236 pExynosPort
->assignedBufferNum
++;
237 if (pExynosPort
->assignedBufferNum
== pExynosPort
->portDefinition
.nBufferCountActual
) {
238 pExynosPort
->portDefinition
.bPopulated
= OMX_TRUE
;
239 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
240 Exynos_OSAL_SemaphorePost(pExynosPort
->loadedResource
);
241 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
243 *ppBuffer
= temp_bufferHeader
;
249 Exynos_OSAL_Free(temp_bufferHeader
);
250 Exynos_OSAL_SharedMemory_Free(pVideoDec
->hSharedMemory
, temp_buffer
);
252 ret
= OMX_ErrorInsufficientResources
;
260 OMX_ERRORTYPE
Exynos_OMX_FreeBuffer(
261 OMX_IN OMX_HANDLETYPE hComponent
,
262 OMX_IN OMX_U32 nPortIndex
,
263 OMX_IN OMX_BUFFERHEADERTYPE
*pBufferHdr
)
265 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
266 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
267 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
268 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
269 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
270 OMX_BUFFERHEADERTYPE
*temp_bufferHeader
= NULL
;
271 OMX_U8
*temp_buffer
= NULL
;
276 if (hComponent
== NULL
) {
277 ret
= OMX_ErrorBadParameter
;
280 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
281 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
282 if (ret
!= OMX_ErrorNone
) {
286 if (pOMXComponent
->pComponentPrivate
== NULL
) {
287 ret
= OMX_ErrorBadParameter
;
290 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
291 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
292 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
294 if (CHECK_PORT_TUNNELED(pExynosPort
) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort
)) {
295 ret
= OMX_ErrorBadPortIndex
;
299 if ((pExynosPort
->portState
!= OMX_StateLoaded
) && (pExynosPort
->portState
!= OMX_StateInvalid
)) {
300 (*(pExynosComponent
->pCallbacks
->EventHandler
)) (pOMXComponent
,
301 pExynosComponent
->callbackData
,
302 (OMX_U32
)OMX_EventError
,
303 (OMX_U32
)OMX_ErrorPortUnpopulated
,
307 for (i
= 0; i
< /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM
; i
++) {
308 if (((pExynosPort
->bufferStateAllocate
[i
] | BUFFER_STATE_FREE
) != 0) && (pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
!= NULL
)) {
309 if (pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
== pBufferHdr
->pBuffer
) {
310 if (pExynosPort
->bufferStateAllocate
[i
] & BUFFER_STATE_ALLOCATED
) {
311 if ((pVideoDec
->bDRMPlayerMode
== OMX_TRUE
) && (nPortIndex
== INPUT_PORT_INDEX
)) {
312 OMX_PTR mapBuffer
= Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec
->hSharedMemory
, (int)pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
);
313 Exynos_OSAL_SharedMemory_Free(pVideoDec
->hSharedMemory
, mapBuffer
);
315 Exynos_OSAL_SharedMemory_Free(pVideoDec
->hSharedMemory
, pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
);
317 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
= NULL
;
318 pBufferHdr
->pBuffer
= NULL
;
319 } else if (pExynosPort
->bufferStateAllocate
[i
] & BUFFER_STATE_ASSIGNED
) {
322 pExynosPort
->assignedBufferNum
--;
323 if (pExynosPort
->bufferStateAllocate
[i
] & HEADER_STATE_ALLOCATED
) {
324 Exynos_OSAL_Free(pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
);
325 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
= NULL
;
328 pExynosPort
->bufferStateAllocate
[i
] = BUFFER_STATE_FREE
;
336 if (ret
== OMX_ErrorNone
) {
337 if (pExynosPort
->assignedBufferNum
== 0) {
338 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pExynosPort->unloadedResource signal set");
339 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
340 Exynos_OSAL_SemaphorePost(pExynosPort
->unloadedResource
);
341 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
342 pExynosPort
->portDefinition
.bPopulated
= OMX_FALSE
;
351 OMX_ERRORTYPE
Exynos_OMX_AllocateTunnelBuffer(EXYNOS_OMX_BASEPORT
*pOMXBasePort
, OMX_U32 nPortIndex
)
353 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
354 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
355 OMX_BUFFERHEADERTYPE
*temp_bufferHeader
= NULL
;
356 OMX_U8
*temp_buffer
= NULL
;
357 OMX_U32 bufferSize
= 0;
358 OMX_PARAM_PORTDEFINITIONTYPE portDefinition
;
360 ret
= OMX_ErrorTunnelingUnsupported
;
365 OMX_ERRORTYPE
Exynos_OMX_FreeTunnelBuffer(EXYNOS_OMX_BASEPORT
*pOMXBasePort
, OMX_U32 nPortIndex
)
367 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
368 EXYNOS_OMX_BASEPORT
* pExynosPort
= NULL
;
369 OMX_BUFFERHEADERTYPE
* temp_bufferHeader
= NULL
;
370 OMX_U8
*temp_buffer
= NULL
;
371 OMX_U32 bufferSize
= 0;
373 ret
= OMX_ErrorTunnelingUnsupported
;
378 OMX_ERRORTYPE
Exynos_OMX_ComponentTunnelRequest(
379 OMX_IN OMX_HANDLETYPE hComp
,
380 OMX_IN OMX_U32 nPort
,
381 OMX_IN OMX_HANDLETYPE hTunneledComp
,
382 OMX_IN OMX_U32 nTunneledPort
,
383 OMX_INOUT OMX_TUNNELSETUPTYPE
*pTunnelSetup
)
385 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
387 ret
= OMX_ErrorTunnelingUnsupported
;
392 OMX_ERRORTYPE
Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT
*pExynosPort
, EXYNOS_OMX_DATABUFFER
*pDataBuffer
[])
394 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
400 if (pExynosPort
->portWayType
== WAY1_PORT
) {
401 *pDataBuffer
= &pExynosPort
->way
.port1WayDataBuffer
.dataBuffer
;
402 } else if (pExynosPort
->portWayType
== WAY2_PORT
) {
403 pDataBuffer
[0] = &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
404 pDataBuffer
[1] = &(pExynosPort
->way
.port2WayDataBuffer
.outputDataBuffer
);
413 OMX_ERRORTYPE
Exynos_OMX_FlushPort(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_S32 portIndex
)
415 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
416 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
417 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
418 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
419 OMX_BUFFERHEADERTYPE
*bufferHeader
= NULL
;
420 EXYNOS_OMX_DATABUFFER
*pDataPortBuffer
[2] = {NULL
, NULL
};
421 EXYNOS_OMX_MESSAGE
*message
= NULL
;
422 OMX_U32 flushNum
= 0;
423 OMX_S32 semValue
= 0;
424 int i
= 0, maxBufferNum
= 0;
427 pExynosPort
= &pExynosComponent
->pExynosPort
[portIndex
];
429 while (Exynos_OSAL_GetElemNum(&pExynosPort
->bufferQ
) > 0) {
430 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[portIndex
].bufferSemID
, &semValue
);
432 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[portIndex
].bufferSemID
);
434 Exynos_OSAL_SemaphoreWait(pExynosComponent
->pExynosPort
[portIndex
].bufferSemID
);
435 message
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
436 if ((message
!= NULL
) && (message
->messageType
!= EXYNOS_OMX_CommandFakeBuffer
)) {
437 bufferHeader
= (OMX_BUFFERHEADERTYPE
*)message
->pCmdData
;
438 bufferHeader
->nFilledLen
= 0;
440 if (portIndex
== OUTPUT_PORT_INDEX
) {
441 Exynos_OMX_OutputBufferReturn(pOMXComponent
, bufferHeader
);
442 } else if (portIndex
== INPUT_PORT_INDEX
) {
443 Exynos_OMX_InputBufferReturn(pOMXComponent
, bufferHeader
);
446 Exynos_OSAL_Free(message
);
450 Exynos_OMX_GetFlushBuffer(pExynosPort
, pDataPortBuffer
);
451 if (portIndex
== INPUT_PORT_INDEX
) {
452 if (pDataPortBuffer
[0]->dataValid
== OMX_TRUE
)
453 Exynos_InputBufferReturn(pOMXComponent
, pDataPortBuffer
[0]);
454 if (pDataPortBuffer
[1]->dataValid
== OMX_TRUE
)
455 Exynos_InputBufferReturn(pOMXComponent
, pDataPortBuffer
[1]);
456 } else if (portIndex
== OUTPUT_PORT_INDEX
) {
457 if (pDataPortBuffer
[0]->dataValid
== OMX_TRUE
)
458 Exynos_OutputBufferReturn(pOMXComponent
, pDataPortBuffer
[0]);
459 if (pDataPortBuffer
[1]->dataValid
== OMX_TRUE
)
460 Exynos_OutputBufferReturn(pOMXComponent
, pDataPortBuffer
[1]);
463 if (pExynosComponent
->bMultiThreadProcess
== OMX_TRUE
) {
464 if (pExynosPort
->bufferProcessType
& BUFFER_SHARE
) {
465 if (pExynosPort
->processData
.bufferHeader
!= NULL
) {
466 if (portIndex
== INPUT_PORT_INDEX
) {
467 Exynos_OMX_InputBufferReturn(pOMXComponent
, pExynosPort
->processData
.bufferHeader
);
468 } else if (portIndex
== OUTPUT_PORT_INDEX
) {
470 if (pExynosPort
->bIsANBEnabled
== OMX_TRUE
)
471 Exynos_OSAL_UnlockANB(pExynosPort
->processData
.bufferHeader
->pBuffer
);
473 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pExynosPort
->processData
.bufferHeader
);
476 Exynos_ResetCodecData(&pExynosPort
->processData
);
478 if (pVideoDec
->bReconfigDPB
== OMX_TRUE
)
479 maxBufferNum
= pVideoDec
->nSavedDPBCnt
;
481 maxBufferNum
= pExynosPort
->portDefinition
.nBufferCountActual
;
482 for (i
= 0; i
< maxBufferNum
; i
++) {
483 if (pExynosPort
->extendBufferHeader
[i
].bBufferInOMX
== OMX_TRUE
) {
484 if (portIndex
== OUTPUT_PORT_INDEX
) {
486 if (pExynosPort
->bIsANBEnabled
== OMX_TRUE
)
487 Exynos_OSAL_UnlockANB(pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
);
489 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
);
490 } else if (portIndex
== INPUT_PORT_INDEX
) {
491 Exynos_OMX_InputBufferReturn(pOMXComponent
, pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
);
497 Exynos_ResetCodecData(&pExynosPort
->processData
);
502 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[portIndex
].bufferSemID
, &cnt
);
505 Exynos_OSAL_SemaphoreWait(pExynosComponent
->pExynosPort
[portIndex
].bufferSemID
);
507 Exynos_OSAL_ResetQueue(&pExynosPort
->bufferQ
);
515 OMX_ERRORTYPE
Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_S32 nPortIndex
, OMX_BOOL bEvent
)
517 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
518 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
519 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
520 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
521 EXYNOS_OMX_DATABUFFER
*flushPortBuffer
[2] = {NULL
, NULL
};
522 OMX_U32 i
= 0, cnt
= 0;
526 if (pOMXComponent
== NULL
) {
527 ret
= OMX_ErrorBadParameter
;
530 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
531 if (ret
!= OMX_ErrorNone
) {
535 if (pOMXComponent
->pComponentPrivate
== NULL
) {
536 ret
= OMX_ErrorBadParameter
;
539 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
540 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
542 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,"OMX_CommandFlush start, port:%d", nPortIndex
);
544 pExynosComponent
->pExynosPort
[nPortIndex
].bIsPortFlushed
= OMX_TRUE
;
546 if (pExynosComponent
->bMultiThreadProcess
== OMX_FALSE
) {
547 Exynos_OSAL_SignalSet(pExynosComponent
->pauseEvent
);
549 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[nPortIndex
].pauseEvent
);
552 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
553 Exynos_OMX_GetFlushBuffer(pExynosPort
, flushPortBuffer
);
555 if (pExynosComponent
->pExynosPort
[nPortIndex
].bufferProcessType
& BUFFER_COPY
)
556 Exynos_OSAL_SemaphorePost(pExynosPort
->codecSemID
);
557 Exynos_OSAL_SemaphorePost(pExynosPort
->bufferSemID
);
559 pVideoDec
->exynos_codec_bufferProcessRun(pOMXComponent
, nPortIndex
);
560 Exynos_OSAL_MutexLock(flushPortBuffer
[0]->bufferMutex
);
561 pVideoDec
->exynos_codec_stop(pOMXComponent
, nPortIndex
);
562 Exynos_OSAL_MutexLock(flushPortBuffer
[1]->bufferMutex
);
563 ret
= Exynos_OMX_FlushPort(pOMXComponent
, nPortIndex
);
564 if (pVideoDec
->bReconfigDPB
== OMX_TRUE
)
565 pVideoDec
->exynos_codec_reconfigAllBuffers(pOMXComponent
, nPortIndex
);
566 else if (pExynosComponent
->pExynosPort
[nPortIndex
].bufferProcessType
& BUFFER_COPY
)
567 pVideoDec
->exynos_codec_enqueueAllBuffer(pOMXComponent
, nPortIndex
);
568 Exynos_ResetCodecData(&pExynosPort
->processData
);
570 if (ret
== OMX_ErrorNone
) {
571 if (nPortIndex
== INPUT_PORT_INDEX
) {
572 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_TRUE
;
573 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_FALSE
;
574 Exynos_OSAL_Memset(pExynosComponent
->timeStamp
, -19771003, sizeof(OMX_TICKS
) * MAX_TIMESTAMP
);
575 Exynos_OSAL_Memset(pExynosComponent
->nFlags
, 0, sizeof(OMX_U32
) * MAX_FLAGS
);
576 pExynosComponent
->getAllDelayBuffer
= OMX_FALSE
;
577 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
578 pExynosComponent
->reInputData
= OMX_FALSE
;
581 pExynosComponent
->pExynosPort
[nPortIndex
].bIsPortFlushed
= OMX_FALSE
;
582 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,"OMX_CommandFlush EventCmdComplete, port:%d", nPortIndex
);
583 if (bEvent
== OMX_TRUE
)
584 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
585 pExynosComponent
->callbackData
,
586 OMX_EventCmdComplete
,
587 OMX_CommandFlush
, nPortIndex
, NULL
);
589 Exynos_OSAL_MutexUnlock(flushPortBuffer
[1]->bufferMutex
);
590 Exynos_OSAL_MutexUnlock(flushPortBuffer
[0]->bufferMutex
);
593 if ((ret
!= OMX_ErrorNone
) && (pOMXComponent
!= NULL
) && (pExynosComponent
!= NULL
)) {
594 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
,"%s : %d", __FUNCTION__
, __LINE__
);
595 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
596 pExynosComponent
->callbackData
,
606 OMX_ERRORTYPE
Exynos_InputBufferReturn(
607 OMX_COMPONENTTYPE
*pOMXComponent
,
608 EXYNOS_OMX_DATABUFFER
*pDataBuffer
)
610 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
611 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
612 EXYNOS_OMX_BASEPORT
*pInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
613 OMX_BUFFERHEADERTYPE
*pBufferHdr
= NULL
;
617 pBufferHdr
= pDataBuffer
->bufferHeader
;
619 if (pBufferHdr
!= NULL
) {
620 if (pInputPort
->markType
.hMarkTargetComponent
!= NULL
) {
621 pBufferHdr
->hMarkTargetComponent
= pInputPort
->markType
.hMarkTargetComponent
;
622 pBufferHdr
->pMarkData
= pInputPort
->markType
.pMarkData
;
623 pInputPort
->markType
.hMarkTargetComponent
= NULL
;
624 pInputPort
->markType
.pMarkData
= NULL
;
627 if (pBufferHdr
->hMarkTargetComponent
!= NULL
) {
628 if (pBufferHdr
->hMarkTargetComponent
== pOMXComponent
) {
629 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
630 pExynosComponent
->callbackData
,
632 0, 0, pBufferHdr
->pMarkData
);
634 pExynosComponent
->propagateMarkType
.hMarkTargetComponent
= pBufferHdr
->hMarkTargetComponent
;
635 pExynosComponent
->propagateMarkType
.pMarkData
= pBufferHdr
->pMarkData
;
639 pBufferHdr
->nFilledLen
= 0;
640 pBufferHdr
->nOffset
= 0;
641 Exynos_OMX_InputBufferReturn(pOMXComponent
, pBufferHdr
);
644 /* reset dataBuffer */
645 Exynos_ResetDataBuffer(pDataBuffer
);
653 OMX_ERRORTYPE
Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
655 OMX_ERRORTYPE ret
= OMX_ErrorUndefined
;
656 EXYNOS_OMX_BASEPORT
*pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
657 EXYNOS_OMX_MESSAGE
*message
= NULL
;
658 EXYNOS_OMX_DATABUFFER
*inputUseBuffer
= NULL
;
662 inputUseBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
664 if (pExynosComponent
->currentState
!= OMX_StateExecuting
) {
665 ret
= OMX_ErrorUndefined
;
667 } else if ((pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
668 (!CHECK_PORT_BEING_FLUSHED(pExynosPort
))) {
669 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
670 if (inputUseBuffer
->dataValid
!= OMX_TRUE
) {
671 message
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
672 if (message
== NULL
) {
673 ret
= OMX_ErrorUndefined
;
676 if (message
->messageType
== EXYNOS_OMX_CommandFakeBuffer
) {
677 Exynos_OSAL_Free(message
);
678 ret
= OMX_ErrorCodecFlush
;
682 inputUseBuffer
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)(message
->pCmdData
);
683 inputUseBuffer
->allocSize
= inputUseBuffer
->bufferHeader
->nAllocLen
;
684 inputUseBuffer
->dataLen
= inputUseBuffer
->bufferHeader
->nFilledLen
;
685 inputUseBuffer
->remainDataLen
= inputUseBuffer
->dataLen
;
686 inputUseBuffer
->usedDataLen
= 0;
687 inputUseBuffer
->dataValid
= OMX_TRUE
;
688 inputUseBuffer
->nFlags
= inputUseBuffer
->bufferHeader
->nFlags
;
689 inputUseBuffer
->timeStamp
= inputUseBuffer
->bufferHeader
->nTimeStamp
;
691 Exynos_OSAL_Free(message
);
693 if (inputUseBuffer
->allocSize
<= inputUseBuffer
->dataLen
)
694 Exynos_OSAL_Log(EXYNOS_LOG_WARNING
, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", inputUseBuffer
->allocSize
, inputUseBuffer
->dataLen
);
704 OMX_ERRORTYPE
Exynos_OutputBufferReturn(
705 OMX_COMPONENTTYPE
*pOMXComponent
,
706 EXYNOS_OMX_DATABUFFER
*pDataBuffer
)
708 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
709 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
710 OMX_BUFFERHEADERTYPE
*pBufferHdr
= pDataBuffer
->bufferHeader
;
714 if (pBufferHdr
!= NULL
) {
715 pBufferHdr
->nFilledLen
= pDataBuffer
->remainDataLen
;
716 pBufferHdr
->nOffset
= 0;
717 pBufferHdr
->nFlags
= pDataBuffer
->nFlags
;
718 pBufferHdr
->nTimeStamp
= pDataBuffer
->timeStamp
;
720 if (pExynosComponent
->propagateMarkType
.hMarkTargetComponent
!= NULL
) {
721 pBufferHdr
->hMarkTargetComponent
= pExynosComponent
->propagateMarkType
.hMarkTargetComponent
;
722 pBufferHdr
->pMarkData
= pExynosComponent
->propagateMarkType
.pMarkData
;
724 pExynosComponent
->propagateMarkType
.hMarkTargetComponent
= NULL
;
725 pExynosComponent
->propagateMarkType
.pMarkData
= NULL
;
728 if ((pBufferHdr
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) {
729 pBufferHdr
->nFilledLen
= 0;
730 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,"event OMX_BUFFERFLAG_EOS!!!");
731 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
732 pExynosComponent
->callbackData
,
735 pBufferHdr
->nFlags
, NULL
);
737 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pBufferHdr
);
740 /* reset dataBuffer */
741 Exynos_ResetDataBuffer(pDataBuffer
);
749 OMX_ERRORTYPE
Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
751 OMX_ERRORTYPE ret
= OMX_ErrorUndefined
;
752 EXYNOS_OMX_BASEPORT
*pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
753 EXYNOS_OMX_MESSAGE
*message
= NULL
;
754 EXYNOS_OMX_DATABUFFER
*outputUseBuffer
= NULL
;
758 if (pExynosPort
->bufferProcessType
& BUFFER_COPY
) {
759 outputUseBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.outputDataBuffer
);
760 } else if (pExynosPort
->bufferProcessType
& BUFFER_SHARE
) {
761 outputUseBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
764 if (pExynosComponent
->currentState
!= OMX_StateExecuting
) {
765 ret
= OMX_ErrorUndefined
;
767 } else if ((pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
768 (!CHECK_PORT_BEING_FLUSHED(pExynosPort
))){
769 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
770 if (outputUseBuffer
->dataValid
!= OMX_TRUE
) {
771 message
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
772 if (message
== NULL
) {
773 ret
= OMX_ErrorUndefined
;
776 if (message
->messageType
== EXYNOS_OMX_CommandFakeBuffer
) {
777 Exynos_OSAL_Free(message
);
778 ret
= OMX_ErrorCodecFlush
;
782 outputUseBuffer
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)(message
->pCmdData
);
783 outputUseBuffer
->allocSize
= outputUseBuffer
->bufferHeader
->nAllocLen
;
784 outputUseBuffer
->dataLen
= 0; //dataBuffer->bufferHeader->nFilledLen;
785 outputUseBuffer
->remainDataLen
= outputUseBuffer
->dataLen
;
786 outputUseBuffer
->usedDataLen
= 0; //dataBuffer->bufferHeader->nOffset;
787 outputUseBuffer
->dataValid
= OMX_TRUE
;
788 /* dataBuffer->nFlags = dataBuffer->bufferHeader->nFlags; */
789 /* dataBuffer->nTimeStamp = dataBuffer->bufferHeader->nTimeStamp; */
791 if (pExynosPort->bufferProcessType & BUFFER_SHARE)
792 outputUseBuffer->pPrivate = outputUseBuffer->bufferHeader->pOutputPortPrivate;
793 else if (pExynosPort->bufferProcessType & BUFFER_COPY) {
794 pExynosPort->processData.dataBuffer = outputUseBuffer->bufferHeader->pBuffer;
795 pExynosPort->processData.allocSize = outputUseBuffer->bufferHeader->nAllocLen;
799 Exynos_OSAL_Free(message
);
810 OMX_BUFFERHEADERTYPE
*Exynos_OutputBufferGetQueue_Direct(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
812 OMX_BUFFERHEADERTYPE
*retBuffer
= NULL
;
813 EXYNOS_OMX_BASEPORT
*pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
814 EXYNOS_OMX_MESSAGE
*message
= NULL
;
818 if (pExynosComponent
->currentState
!= OMX_StateExecuting
) {
821 } else if ((pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
822 (!CHECK_PORT_BEING_FLUSHED(pExynosPort
))){
823 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
825 message
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
826 if (message
== NULL
) {
830 if (message
->messageType
== EXYNOS_OMX_CommandFakeBuffer
) {
831 Exynos_OSAL_Free(message
);
836 retBuffer
= (OMX_BUFFERHEADERTYPE
*)(message
->pCmdData
);
837 Exynos_OSAL_Free(message
);
846 OMX_ERRORTYPE
Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 PortIndex
, OMX_PTR data
)
848 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
849 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
853 pExynosPort
= &pExynosComponent
->pExynosPort
[PortIndex
];
856 ret
= OMX_ErrorInsufficientResources
;
860 ret
= Exynos_OSAL_Queue(&pExynosPort
->codecBufferQ
, (void *)data
);
862 ret
= OMX_ErrorUndefined
;
865 Exynos_OSAL_SemaphorePost(pExynosPort
->codecSemID
);
875 OMX_ERRORTYPE
Exynos_CodecBufferDeQueue(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 PortIndex
, OMX_PTR
*data
)
877 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
878 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
883 pExynosPort
= &pExynosComponent
->pExynosPort
[PortIndex
];
884 Exynos_OSAL_SemaphoreWait(pExynosPort
->codecSemID
);
885 tempData
= (OMX_U32
)Exynos_OSAL_Dequeue(&pExynosPort
->codecBufferQ
);
886 if (tempData
== NULL
) {
888 ret
= OMX_ErrorUndefined
;
891 *data
= (OMX_PTR
)tempData
;
901 OMX_ERRORTYPE
Exynos_CodecBufferReset(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 PortIndex
)
903 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
904 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
908 pExynosPort
= &pExynosComponent
->pExynosPort
[PortIndex
];
910 ret
= Exynos_OSAL_ResetQueue(&pExynosPort
->codecBufferQ
);
912 ret
= OMX_ErrorUndefined
;
917 Exynos_OSAL_Get_SemaphoreCount(pExynosPort
->codecSemID
, &cnt
);
919 Exynos_OSAL_SemaphoreWait(pExynosPort
->codecSemID
);
931 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeGetParameter(
932 OMX_IN OMX_HANDLETYPE hComponent
,
933 OMX_IN OMX_INDEXTYPE nParamIndex
,
934 OMX_INOUT OMX_PTR ComponentParameterStructure
)
936 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
937 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
938 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
939 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
943 if (hComponent
== NULL
) {
944 ret
= OMX_ErrorBadParameter
;
947 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
948 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
949 if (ret
!= OMX_ErrorNone
) {
953 if (pOMXComponent
->pComponentPrivate
== NULL
) {
954 ret
= OMX_ErrorBadParameter
;
957 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
959 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
960 ret
= OMX_ErrorInvalidState
;
964 if (ComponentParameterStructure
== NULL
) {
965 ret
= OMX_ErrorBadParameter
;
969 switch (nParamIndex
) {
970 case OMX_IndexParamVideoInit
:
972 OMX_PORT_PARAM_TYPE
*portParam
= (OMX_PORT_PARAM_TYPE
*)ComponentParameterStructure
;
973 ret
= Exynos_OMX_Check_SizeVersion(portParam
, sizeof(OMX_PORT_PARAM_TYPE
));
974 if (ret
!= OMX_ErrorNone
) {
978 portParam
->nPorts
= pExynosComponent
->portParam
.nPorts
;
979 portParam
->nStartPortNumber
= pExynosComponent
->portParam
.nStartPortNumber
;
983 case OMX_IndexParamVideoPortFormat
:
985 OMX_VIDEO_PARAM_PORTFORMATTYPE
*portFormat
= (OMX_VIDEO_PARAM_PORTFORMATTYPE
*)ComponentParameterStructure
;
986 OMX_U32 portIndex
= portFormat
->nPortIndex
;
987 OMX_U32 index
= portFormat
->nIndex
;
988 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
989 OMX_PARAM_PORTDEFINITIONTYPE
*portDefinition
= NULL
;
990 OMX_U32 supportFormatNum
= 0; /* supportFormatNum = N-1 */
992 ret
= Exynos_OMX_Check_SizeVersion(portFormat
, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE
));
993 if (ret
!= OMX_ErrorNone
) {
997 if ((portIndex
>= pExynosComponent
->portParam
.nPorts
)) {
998 ret
= OMX_ErrorBadPortIndex
;
1003 if (portIndex
== INPUT_PORT_INDEX
) {
1004 supportFormatNum
= INPUT_PORT_SUPPORTFORMAT_NUM_MAX
- 1;
1005 if (index
> supportFormatNum
) {
1006 ret
= OMX_ErrorNoMore
;
1010 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1011 portDefinition
= &pExynosPort
->portDefinition
;
1013 portFormat
->eCompressionFormat
= portDefinition
->format
.video
.eCompressionFormat
;
1014 portFormat
->eColorFormat
= portDefinition
->format
.video
.eColorFormat
;
1015 portFormat
->xFramerate
= portDefinition
->format
.video
.xFramerate
;
1016 } else if (portIndex
== OUTPUT_PORT_INDEX
) {
1017 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1018 portDefinition
= &pExynosPort
->portDefinition
;
1021 case supportFormat_0
:
1022 portFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1023 portFormat
->eColorFormat
= OMX_COLOR_FormatYUV420Planar
;
1024 portFormat
->xFramerate
= portDefinition
->format
.video
.xFramerate
;
1026 case supportFormat_1
:
1027 portFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1028 portFormat
->eColorFormat
= OMX_COLOR_FormatYUV420SemiPlanar
;
1029 portFormat
->xFramerate
= portDefinition
->format
.video
.xFramerate
;
1031 case supportFormat_2
:
1032 portFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1033 portFormat
->eColorFormat
= OMX_SEC_COLOR_FormatNV12Tiled
;
1034 portFormat
->xFramerate
= portDefinition
->format
.video
.xFramerate
;
1037 if (index
> supportFormat_0
) {
1038 ret
= OMX_ErrorNoMore
;
1044 ret
= OMX_ErrorNone
;
1048 case OMX_IndexParamGetAndroidNativeBuffer
:
1050 ret
= Exynos_OSAL_GetANBParameter(hComponent
, nParamIndex
, ComponentParameterStructure
);
1053 case OMX_IndexParamPortDefinition
:
1055 OMX_PARAM_PORTDEFINITIONTYPE
*portDefinition
= (OMX_PARAM_PORTDEFINITIONTYPE
*)ComponentParameterStructure
;
1056 OMX_U32 portIndex
= portDefinition
->nPortIndex
;
1057 EXYNOS_OMX_BASEPORT
*pExynosPort
;
1059 ret
= Exynos_OMX_GetParameter(hComponent
, nParamIndex
, ComponentParameterStructure
);
1060 if (ret
!= OMX_ErrorNone
) {
1064 /* at this point, GetParameter has done all the verification, we
1065 * just dereference things directly here
1067 pExynosPort
= &pExynosComponent
->pExynosPort
[portIndex
];
1068 if (pExynosPort
->bIsANBEnabled
== OMX_TRUE
) {
1069 portDefinition
->format
.video
.eColorFormat
=
1070 (OMX_COLOR_FORMATTYPE
)Exynos_OSAL_OMX2HalPixelFormat(portDefinition
->format
.video
.eColorFormat
);
1077 ret
= Exynos_OMX_GetParameter(hComponent
, nParamIndex
, ComponentParameterStructure
);
1087 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeSetParameter(
1088 OMX_IN OMX_HANDLETYPE hComponent
,
1089 OMX_IN OMX_INDEXTYPE nIndex
,
1090 OMX_IN OMX_PTR ComponentParameterStructure
)
1092 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1093 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1094 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1095 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1099 if (hComponent
== NULL
) {
1100 ret
= OMX_ErrorBadParameter
;
1103 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1104 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1105 if (ret
!= OMX_ErrorNone
) {
1109 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1110 ret
= OMX_ErrorBadParameter
;
1113 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1115 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1116 ret
= OMX_ErrorInvalidState
;
1120 if (ComponentParameterStructure
== NULL
) {
1121 ret
= OMX_ErrorBadParameter
;
1126 case OMX_IndexParamVideoPortFormat
:
1128 OMX_VIDEO_PARAM_PORTFORMATTYPE
*portFormat
= (OMX_VIDEO_PARAM_PORTFORMATTYPE
*)ComponentParameterStructure
;
1129 OMX_U32 portIndex
= portFormat
->nPortIndex
;
1130 OMX_U32 index
= portFormat
->nIndex
;
1131 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1132 OMX_PARAM_PORTDEFINITIONTYPE
*portDefinition
= NULL
;
1133 OMX_U32 supportFormatNum
= 0;
1135 ret
= Exynos_OMX_Check_SizeVersion(portFormat
, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE
));
1136 if (ret
!= OMX_ErrorNone
) {
1140 if ((portIndex
>= pExynosComponent
->portParam
.nPorts
)) {
1141 ret
= OMX_ErrorBadPortIndex
;
1144 pExynosPort
= &pExynosComponent
->pExynosPort
[portIndex
];
1145 portDefinition
= &pExynosPort
->portDefinition
;
1147 portDefinition
->format
.video
.eColorFormat
= portFormat
->eColorFormat
;
1148 portDefinition
->format
.video
.eCompressionFormat
= portFormat
->eCompressionFormat
;
1149 portDefinition
->format
.video
.xFramerate
= portFormat
->xFramerate
;
1153 case OMX_IndexParamPortDefinition
:
1155 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDefinition
= (OMX_PARAM_PORTDEFINITIONTYPE
*)ComponentParameterStructure
;
1156 OMX_U32 portIndex
= pPortDefinition
->nPortIndex
;
1157 EXYNOS_OMX_BASEPORT
*pExynosPort
;
1158 OMX_U32 width
, height
, size
;
1159 OMX_U32 realWidth
, realHeight
;
1161 if (portIndex
>= pExynosComponent
->portParam
.nPorts
) {
1162 ret
= OMX_ErrorBadPortIndex
;
1165 ret
= Exynos_OMX_Check_SizeVersion(pPortDefinition
, sizeof(OMX_PARAM_PORTDEFINITIONTYPE
));
1166 if (ret
!= OMX_ErrorNone
) {
1170 pExynosPort
= &pExynosComponent
->pExynosPort
[portIndex
];
1172 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) && (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
1173 if (pExynosPort
->portDefinition
.bEnabled
== OMX_TRUE
) {
1174 ret
= OMX_ErrorIncorrectStateOperation
;
1178 if (pPortDefinition
->nBufferCountActual
< pExynosPort
->portDefinition
.nBufferCountMin
) {
1179 ret
= OMX_ErrorBadParameter
;
1183 Exynos_OSAL_Memcpy(&pExynosPort
->portDefinition
, pPortDefinition
, pPortDefinition
->nSize
);
1185 #ifdef USE_ANB // Modified by Google engineer
1186 /* should not affect the format since in ANB case, the caller
1187 * is providing us a HAL format */
1188 if (pExynosPort
->bIsANBEnabled
== OMX_TRUE
) {
1189 pExynosPort
->portDefinition
.format
.video
.eColorFormat
=
1190 Exynos_OSAL_Hal2OMXPixelFormat(pExynosPort
->portDefinition
.format
.video
.eColorFormat
);
1194 realWidth
= pExynosPort
->portDefinition
.format
.video
.nFrameWidth
;
1195 realHeight
= pExynosPort
->portDefinition
.format
.video
.nFrameHeight
;
1196 width
= ((realWidth
+ 15) & (~15));
1197 height
= ((realHeight
+ 15) & (~15));
1198 size
= (width
* height
* 3) / 2;
1199 pExynosPort
->portDefinition
.format
.video
.nStride
= width
;
1200 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= height
;
1201 pExynosPort
->portDefinition
.nBufferSize
= (size
> pExynosPort
->portDefinition
.nBufferSize
) ? size
: pExynosPort
->portDefinition
.nBufferSize
;
1203 if (portIndex
== INPUT_PORT_INDEX
) {
1204 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1205 pExynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
= pExynosPort
->portDefinition
.format
.video
.nFrameWidth
;
1206 pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
= pExynosPort
->portDefinition
.format
.video
.nFrameHeight
;
1207 pExynosOutputPort
->portDefinition
.format
.video
.nStride
= width
;
1208 pExynosOutputPort
->portDefinition
.format
.video
.nSliceHeight
= height
;
1210 switch (pExynosOutputPort
->portDefinition
.format
.video
.eColorFormat
) {
1211 case OMX_COLOR_FormatYUV420Planar
:
1212 case OMX_COLOR_FormatYUV420SemiPlanar
:
1213 pExynosOutputPort
->portDefinition
.nBufferSize
= (width
* height
* 3) / 2;
1215 case OMX_SEC_COLOR_FormatNV12Tiled
:
1216 pExynosOutputPort
->portDefinition
.nBufferSize
=
1217 calc_plane(pExynosPort
->portDefinition
.format
.video
.nFrameWidth
, pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
) +
1218 calc_plane(pExynosPort
->portDefinition
.format
.video
.nFrameWidth
, pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
>> 1);
1221 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Color format is not support!! use default YUV size!!");
1222 ret
= OMX_ErrorUnsupportedSetting
;
1226 if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1227 pExynosOutputPort
->portDefinition
.nBufferSize
=
1228 calc_plane(pExynosPort
->portDefinition
.format
.video
.nFrameWidth
, pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
) +
1229 calc_plane(pExynosPort
->portDefinition
.format
.video
.nFrameWidth
, pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
>> 1);
1235 case OMX_IndexParamEnableAndroidBuffers
:
1236 case OMX_IndexParamUseAndroidNativeBuffer
:
1238 ret
= Exynos_OSAL_SetANBParameter(hComponent
, nIndex
, ComponentParameterStructure
);
1244 ret
= Exynos_OMX_SetParameter(hComponent
, nIndex
, ComponentParameterStructure
);
1255 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeGetConfig(
1256 OMX_HANDLETYPE hComponent
,
1257 OMX_INDEXTYPE nIndex
,
1258 OMX_PTR pComponentConfigStructure
)
1260 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1261 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1262 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1266 if (hComponent
== NULL
) {
1267 ret
= OMX_ErrorBadParameter
;
1270 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1271 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1272 if (ret
!= OMX_ErrorNone
) {
1275 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1276 ret
= OMX_ErrorBadParameter
;
1279 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1280 if (pComponentConfigStructure
== NULL
) {
1281 ret
= OMX_ErrorBadParameter
;
1284 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1285 ret
= OMX_ErrorInvalidState
;
1291 ret
= Exynos_OMX_GetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1301 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeSetConfig(
1302 OMX_HANDLETYPE hComponent
,
1303 OMX_INDEXTYPE nIndex
,
1304 OMX_PTR pComponentConfigStructure
)
1306 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1307 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1308 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1312 if (hComponent
== NULL
) {
1313 ret
= OMX_ErrorBadParameter
;
1316 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1317 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1318 if (ret
!= OMX_ErrorNone
) {
1321 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1322 ret
= OMX_ErrorBadParameter
;
1325 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1326 if (pComponentConfigStructure
== NULL
) {
1327 ret
= OMX_ErrorBadParameter
;
1330 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1331 ret
= OMX_ErrorInvalidState
;
1336 case OMX_IndexVendorThumbnailMode
:
1338 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1339 pVideoDec
->bThumbnailMode
= *((OMX_BOOL
*)pComponentConfigStructure
);
1341 ret
= OMX_ErrorNone
;
1345 ret
= Exynos_OMX_SetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1355 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeGetExtensionIndex(
1356 OMX_IN OMX_HANDLETYPE hComponent
,
1357 OMX_IN OMX_STRING cParameterName
,
1358 OMX_OUT OMX_INDEXTYPE
*pIndexType
)
1360 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1361 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1362 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1366 if (hComponent
== NULL
) {
1367 ret
= OMX_ErrorBadParameter
;
1370 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1371 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1372 if (ret
!= OMX_ErrorNone
) {
1376 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1377 ret
= OMX_ErrorBadParameter
;
1380 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1382 if ((cParameterName
== NULL
) || (pIndexType
== NULL
)) {
1383 ret
= OMX_ErrorBadParameter
;
1386 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1387 ret
= OMX_ErrorInvalidState
;
1392 if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_PARAM_ENABLE_ANB
) == 0)
1393 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexParamEnableAndroidBuffers
;
1394 else if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_PARAM_GET_ANB
) == 0)
1395 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexParamGetAndroidNativeBuffer
;
1396 else if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_PARAM_USE_ANB
) == 0)
1397 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexParamUseAndroidNativeBuffer
;
1399 ret
= Exynos_OMX_GetExtensionIndex(hComponent
, cParameterName
, pIndexType
);
1401 ret
= Exynos_OMX_GetExtensionIndex(hComponent
, cParameterName
, pIndexType
);
1411 OMX_ERRORTYPE
Exynos_Shared_ANBBufferToData(EXYNOS_OMX_DATABUFFER
*pUseBuffer
, EXYNOS_OMX_DATA
*pData
, EXYNOS_OMX_BASEPORT
*pExynosPort
, EXYNOS_OMX_PLANE nPlane
)
1413 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1414 OMX_U32 width
, height
;
1415 // void *pPhys[MAX_BUFFER_PLANE];
1416 ExynosVideoPlane planes
[MAX_BUFFER_PLANE
];
1418 memset(planes
, 0, sizeof(planes
));
1420 if (pExynosPort
->bIsANBEnabled
== OMX_TRUE
) {
1423 width
= pExynosPort
->portDefinition
.format
.video
.nFrameWidth
;
1424 height
= pExynosPort
->portDefinition
.format
.video
.nFrameHeight
;
1425 if ((pUseBuffer
->bufferHeader
!= NULL
) && (pUseBuffer
->bufferHeader
->pBuffer
!= NULL
)) {
1426 Exynos_OSAL_LockANB(pUseBuffer
->bufferHeader
->pBuffer
, width
, height
, pExynosPort
->portDefinition
.format
.video
.eColorFormat
, &stride
, planes
);
1427 pUseBuffer
->dataLen
= sizeof(void *);
1429 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
1430 ret
= OMX_ErrorBadParameter
;
1434 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
1435 ret
= OMX_ErrorBadParameter
;
1439 if (nPlane
== TWO_PLANE
) {
1440 /* Case of Shared Buffer, Only support two PlaneBuffer */
1441 pData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] = planes
[0].addr
;
1442 pData
->buffer
.multiPlaneBuffer
.dataBuffer
[1] = planes
[1].addr
;
1444 pData
->buffer
.multiPlaneBuffer
.fd
[0] = planes
[0].fd
;
1445 pData
->buffer
.multiPlaneBuffer
.fd
[1] = planes
[1].fd
;
1448 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not support plane");
1449 ret
= OMX_ErrorNotImplemented
;
1453 pData
->allocSize
= pUseBuffer
->allocSize
;
1454 pData
->dataLen
= pUseBuffer
->dataLen
;
1455 pData
->usedDataLen
= pUseBuffer
->usedDataLen
;
1456 pData
->remainDataLen
= pUseBuffer
->remainDataLen
;
1457 pData
->timeStamp
= pUseBuffer
->timeStamp
;
1458 pData
->nFlags
= pUseBuffer
->nFlags
;
1459 pData
->pPrivate
= pUseBuffer
->pPrivate
;
1460 pData
->bufferHeader
= pUseBuffer
->bufferHeader
;
1466 OMX_ERRORTYPE
Exynos_Shared_DataToANBBuffer(EXYNOS_OMX_DATA
*pData
, EXYNOS_OMX_DATABUFFER
*pUseBuffer
, EXYNOS_OMX_BASEPORT
*pExynosPort
)
1468 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1470 pUseBuffer
->bufferHeader
= pData
->bufferHeader
;
1471 pUseBuffer
->allocSize
= pData
->allocSize
;
1472 pUseBuffer
->dataLen
= pData
->dataLen
;
1473 pUseBuffer
->usedDataLen
= pData
->usedDataLen
;
1474 pUseBuffer
->remainDataLen
= pData
->remainDataLen
;
1475 pUseBuffer
->timeStamp
= pData
->timeStamp
;
1476 pUseBuffer
->nFlags
= pData
->nFlags
;
1477 pUseBuffer
->pPrivate
= pData
->pPrivate
;
1479 if ((pUseBuffer
->bufferHeader
== NULL
) ||
1480 (pUseBuffer
->bufferHeader
->pBuffer
== NULL
)) {
1481 ret
= OMX_ErrorUndefined
;
1485 if (pExynosPort
->bIsANBEnabled
== OMX_TRUE
) {
1486 Exynos_OSAL_UnlockANB(pUseBuffer
->bufferHeader
->pBuffer
);
1488 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
1489 ret
= OMX_ErrorBadParameter
;
1498 OMX_ERRORTYPE
Exynos_Shared_DataToBuffer(EXYNOS_OMX_DATA
*pData
, EXYNOS_OMX_DATABUFFER
*pUseBuffer
)
1500 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1502 pUseBuffer
->bufferHeader
= pData
->bufferHeader
;
1503 pUseBuffer
->allocSize
= pData
->allocSize
;
1504 pUseBuffer
->dataLen
= pData
->dataLen
;
1505 pUseBuffer
->usedDataLen
= pData
->usedDataLen
;
1506 pUseBuffer
->remainDataLen
= pData
->remainDataLen
;
1507 pUseBuffer
->timeStamp
= pData
->timeStamp
;
1508 pUseBuffer
->nFlags
= pData
->nFlags
;
1509 pUseBuffer
->pPrivate
= pData
->pPrivate
;