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 (pExynosPort
->bNeedContigMem
== OMX_TRUE
) {
201 mem_type
= CONTIG_MEMORY
;
202 } else if ((nPortIndex
== OUTPUT_PORT_INDEX
) &&
203 (pExynosPort
->bufferProcessType
& BUFFER_SHARE
)) {
204 mem_type
= NORMAL_MEMORY
;
207 temp_buffer
= Exynos_OSAL_SharedMemory_Alloc(pVideoDec
->hSharedMemory
, nSizeBytes
, mem_type
);
208 if (temp_buffer
== NULL
) {
209 ret
= OMX_ErrorInsufficientResources
;
212 temp_buffer_fd
= Exynos_OSAL_SharedMemory_VirtToION(pVideoDec
->hSharedMemory
, temp_buffer
);
214 temp_bufferHeader
= (OMX_BUFFERHEADERTYPE
*)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE
));
215 if (temp_bufferHeader
== NULL
) {
216 Exynos_OSAL_SharedMemory_Free(pVideoDec
->hSharedMemory
, temp_buffer
);
217 ret
= OMX_ErrorInsufficientResources
;
220 Exynos_OSAL_Memset(temp_bufferHeader
, 0, sizeof(OMX_BUFFERHEADERTYPE
));
222 for (i
= 0; i
< pExynosPort
->portDefinition
.nBufferCountActual
; i
++) {
223 if (pExynosPort
->bufferStateAllocate
[i
] == BUFFER_STATE_FREE
) {
224 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
= temp_bufferHeader
;
225 pExynosPort
->extendBufferHeader
[i
].buf_fd
[0] = temp_buffer_fd
;
226 pExynosPort
->bufferStateAllocate
[i
] = (BUFFER_STATE_ALLOCATED
| HEADER_STATE_ALLOCATED
);
227 INIT_SET_SIZE_VERSION(temp_bufferHeader
, OMX_BUFFERHEADERTYPE
);
228 if (mem_type
== SECURE_MEMORY
)
229 temp_bufferHeader
->pBuffer
= temp_buffer_fd
;
231 temp_bufferHeader
->pBuffer
= temp_buffer
;
232 temp_bufferHeader
->nAllocLen
= nSizeBytes
;
233 temp_bufferHeader
->pAppPrivate
= pAppPrivate
;
234 if (nPortIndex
== INPUT_PORT_INDEX
)
235 temp_bufferHeader
->nInputPortIndex
= INPUT_PORT_INDEX
;
237 temp_bufferHeader
->nOutputPortIndex
= OUTPUT_PORT_INDEX
;
238 pExynosPort
->assignedBufferNum
++;
239 if (pExynosPort
->assignedBufferNum
== pExynosPort
->portDefinition
.nBufferCountActual
) {
240 pExynosPort
->portDefinition
.bPopulated
= OMX_TRUE
;
241 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
242 Exynos_OSAL_SemaphorePost(pExynosPort
->loadedResource
);
243 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
245 *ppBuffer
= temp_bufferHeader
;
251 Exynos_OSAL_Free(temp_bufferHeader
);
252 Exynos_OSAL_SharedMemory_Free(pVideoDec
->hSharedMemory
, temp_buffer
);
254 ret
= OMX_ErrorInsufficientResources
;
262 OMX_ERRORTYPE
Exynos_OMX_FreeBuffer(
263 OMX_IN OMX_HANDLETYPE hComponent
,
264 OMX_IN OMX_U32 nPortIndex
,
265 OMX_IN OMX_BUFFERHEADERTYPE
*pBufferHdr
)
267 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
268 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
269 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
270 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
271 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
272 OMX_BUFFERHEADERTYPE
*temp_bufferHeader
= NULL
;
273 OMX_U8
*temp_buffer
= NULL
;
278 if (hComponent
== NULL
) {
279 ret
= OMX_ErrorBadParameter
;
282 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
283 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
284 if (ret
!= OMX_ErrorNone
) {
288 if (pOMXComponent
->pComponentPrivate
== NULL
) {
289 ret
= OMX_ErrorBadParameter
;
292 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
293 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
294 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
296 if (CHECK_PORT_TUNNELED(pExynosPort
) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort
)) {
297 ret
= OMX_ErrorBadPortIndex
;
301 if (((pExynosPort
->portState
!= OMX_StateLoaded
) &&
302 (pExynosPort
->portState
!= OMX_StateInvalid
)) &&
303 (pExynosPort
->portDefinition
.bEnabled
!= OMX_FALSE
)) {
304 (*(pExynosComponent
->pCallbacks
->EventHandler
)) (pOMXComponent
,
305 pExynosComponent
->callbackData
,
306 (OMX_U32
)OMX_EventError
,
307 (OMX_U32
)OMX_ErrorPortUnpopulated
,
309 ret
= OMX_ErrorInvalidState
;
313 for (i
= 0; i
< /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM
; i
++) {
314 if (((pExynosPort
->bufferStateAllocate
[i
] | BUFFER_STATE_FREE
) != 0) && (pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
!= NULL
)) {
315 if (pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
== pBufferHdr
->pBuffer
) {
316 if (pExynosPort
->bufferStateAllocate
[i
] & BUFFER_STATE_ALLOCATED
) {
317 if ((pVideoDec
->bDRMPlayerMode
== OMX_TRUE
) && (nPortIndex
== INPUT_PORT_INDEX
)) {
318 OMX_PTR mapBuffer
= Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec
->hSharedMemory
, (int)pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
);
319 Exynos_OSAL_SharedMemory_Free(pVideoDec
->hSharedMemory
, mapBuffer
);
321 Exynos_OSAL_SharedMemory_Free(pVideoDec
->hSharedMemory
, pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
);
323 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
= NULL
;
324 pBufferHdr
->pBuffer
= NULL
;
325 } else if (pExynosPort
->bufferStateAllocate
[i
] & BUFFER_STATE_ASSIGNED
) {
328 pExynosPort
->assignedBufferNum
--;
329 if (pExynosPort
->bufferStateAllocate
[i
] & HEADER_STATE_ALLOCATED
) {
330 Exynos_OSAL_Free(pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
);
331 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
= NULL
;
334 pExynosPort
->bufferStateAllocate
[i
] = BUFFER_STATE_FREE
;
342 if (ret
== OMX_ErrorNone
) {
343 if (pExynosPort
->assignedBufferNum
== 0) {
344 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pExynosPort->unloadedResource signal set");
345 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
346 Exynos_OSAL_SemaphorePost(pExynosPort
->unloadedResource
);
347 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
348 pExynosPort
->portDefinition
.bPopulated
= OMX_FALSE
;
357 OMX_ERRORTYPE
Exynos_OMX_AllocateTunnelBuffer(EXYNOS_OMX_BASEPORT
*pOMXBasePort
, OMX_U32 nPortIndex
)
359 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
360 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
361 OMX_BUFFERHEADERTYPE
*temp_bufferHeader
= NULL
;
362 OMX_U8
*temp_buffer
= NULL
;
363 OMX_U32 bufferSize
= 0;
364 OMX_PARAM_PORTDEFINITIONTYPE portDefinition
;
366 ret
= OMX_ErrorTunnelingUnsupported
;
371 OMX_ERRORTYPE
Exynos_OMX_FreeTunnelBuffer(EXYNOS_OMX_BASEPORT
*pOMXBasePort
, OMX_U32 nPortIndex
)
373 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
374 EXYNOS_OMX_BASEPORT
* pExynosPort
= NULL
;
375 OMX_BUFFERHEADERTYPE
* temp_bufferHeader
= NULL
;
376 OMX_U8
*temp_buffer
= NULL
;
377 OMX_U32 bufferSize
= 0;
379 ret
= OMX_ErrorTunnelingUnsupported
;
384 OMX_ERRORTYPE
Exynos_OMX_ComponentTunnelRequest(
385 OMX_IN OMX_HANDLETYPE hComp
,
386 OMX_IN OMX_U32 nPort
,
387 OMX_IN OMX_HANDLETYPE hTunneledComp
,
388 OMX_IN OMX_U32 nTunneledPort
,
389 OMX_INOUT OMX_TUNNELSETUPTYPE
*pTunnelSetup
)
391 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
393 ret
= OMX_ErrorTunnelingUnsupported
;
398 OMX_ERRORTYPE
Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT
*pExynosPort
, EXYNOS_OMX_DATABUFFER
*pDataBuffer
[])
400 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
406 if (pExynosPort
->portWayType
== WAY1_PORT
) {
407 *pDataBuffer
= &pExynosPort
->way
.port1WayDataBuffer
.dataBuffer
;
408 } else if (pExynosPort
->portWayType
== WAY2_PORT
) {
409 pDataBuffer
[0] = &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
410 pDataBuffer
[1] = &(pExynosPort
->way
.port2WayDataBuffer
.outputDataBuffer
);
419 OMX_ERRORTYPE
Exynos_OMX_FlushPort(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_S32 portIndex
)
421 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
422 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
423 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
424 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
425 OMX_BUFFERHEADERTYPE
*bufferHeader
= NULL
;
426 EXYNOS_OMX_DATABUFFER
*pDataPortBuffer
[2] = {NULL
, NULL
};
427 EXYNOS_OMX_MESSAGE
*message
= NULL
;
428 OMX_U32 flushNum
= 0;
429 OMX_S32 semValue
= 0;
430 int i
= 0, maxBufferNum
= 0;
433 pExynosPort
= &pExynosComponent
->pExynosPort
[portIndex
];
435 while (Exynos_OSAL_GetElemNum(&pExynosPort
->bufferQ
) > 0) {
436 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[portIndex
].bufferSemID
, &semValue
);
438 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[portIndex
].bufferSemID
);
440 Exynos_OSAL_SemaphoreWait(pExynosComponent
->pExynosPort
[portIndex
].bufferSemID
);
441 message
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
442 if ((message
!= NULL
) && (message
->messageType
!= EXYNOS_OMX_CommandFakeBuffer
)) {
443 bufferHeader
= (OMX_BUFFERHEADERTYPE
*)message
->pCmdData
;
444 bufferHeader
->nFilledLen
= 0;
446 if (portIndex
== OUTPUT_PORT_INDEX
) {
447 Exynos_OMX_OutputBufferReturn(pOMXComponent
, bufferHeader
);
448 } else if (portIndex
== INPUT_PORT_INDEX
) {
449 Exynos_OMX_InputBufferReturn(pOMXComponent
, bufferHeader
);
452 Exynos_OSAL_Free(message
);
456 Exynos_OMX_GetFlushBuffer(pExynosPort
, pDataPortBuffer
);
457 if (portIndex
== INPUT_PORT_INDEX
) {
458 if (pDataPortBuffer
[0]->dataValid
== OMX_TRUE
)
459 Exynos_InputBufferReturn(pOMXComponent
, pDataPortBuffer
[0]);
460 if (pDataPortBuffer
[1]->dataValid
== OMX_TRUE
)
461 Exynos_InputBufferReturn(pOMXComponent
, pDataPortBuffer
[1]);
462 } else if (portIndex
== OUTPUT_PORT_INDEX
) {
463 if (pDataPortBuffer
[0]->dataValid
== OMX_TRUE
)
464 Exynos_OutputBufferReturn(pOMXComponent
, pDataPortBuffer
[0]);
465 if (pDataPortBuffer
[1]->dataValid
== OMX_TRUE
)
466 Exynos_OutputBufferReturn(pOMXComponent
, pDataPortBuffer
[1]);
469 if (pExynosComponent
->bMultiThreadProcess
== OMX_TRUE
) {
470 if (pExynosPort
->bufferProcessType
& BUFFER_SHARE
) {
471 if (pExynosPort
->processData
.bufferHeader
!= NULL
) {
472 if (portIndex
== INPUT_PORT_INDEX
) {
473 Exynos_OMX_InputBufferReturn(pOMXComponent
, pExynosPort
->processData
.bufferHeader
);
474 } else if (portIndex
== OUTPUT_PORT_INDEX
) {
476 if (pExynosPort
->bIsANBEnabled
== OMX_TRUE
)
477 Exynos_OSAL_UnlockANB(pExynosPort
->processData
.bufferHeader
->pBuffer
);
479 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pExynosPort
->processData
.bufferHeader
);
482 Exynos_ResetCodecData(&pExynosPort
->processData
);
484 if (pVideoDec
->bReconfigDPB
== OMX_TRUE
)
485 maxBufferNum
= pVideoDec
->nSavedDPBCnt
;
487 maxBufferNum
= pExynosPort
->portDefinition
.nBufferCountActual
;
488 for (i
= 0; i
< maxBufferNum
; i
++) {
489 if (pExynosPort
->extendBufferHeader
[i
].bBufferInOMX
== OMX_TRUE
) {
490 if (portIndex
== OUTPUT_PORT_INDEX
) {
492 if (pExynosPort
->bIsANBEnabled
== OMX_TRUE
)
493 Exynos_OSAL_UnlockANB(pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
);
495 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
);
496 } else if (portIndex
== INPUT_PORT_INDEX
) {
497 Exynos_OMX_InputBufferReturn(pOMXComponent
, pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
);
503 Exynos_ResetCodecData(&pExynosPort
->processData
);
508 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[portIndex
].bufferSemID
, &cnt
);
511 Exynos_OSAL_SemaphoreWait(pExynosComponent
->pExynosPort
[portIndex
].bufferSemID
);
513 Exynos_OSAL_ResetQueue(&pExynosPort
->bufferQ
);
521 OMX_ERRORTYPE
Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_S32 nPortIndex
, OMX_BOOL bEvent
)
523 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
524 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
525 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
526 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
527 EXYNOS_OMX_DATABUFFER
*flushPortBuffer
[2] = {NULL
, NULL
};
528 OMX_U32 i
= 0, cnt
= 0;
532 if (pOMXComponent
== NULL
) {
533 ret
= OMX_ErrorBadParameter
;
536 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
537 if (ret
!= OMX_ErrorNone
) {
541 if (pOMXComponent
->pComponentPrivate
== NULL
) {
542 ret
= OMX_ErrorBadParameter
;
545 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
546 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
548 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,"OMX_CommandFlush start, port:%d", nPortIndex
);
550 pExynosComponent
->pExynosPort
[nPortIndex
].bIsPortFlushed
= OMX_TRUE
;
552 if (pExynosComponent
->bMultiThreadProcess
== OMX_FALSE
) {
553 Exynos_OSAL_SignalSet(pExynosComponent
->pauseEvent
);
555 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[nPortIndex
].pauseEvent
);
558 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
559 Exynos_OMX_GetFlushBuffer(pExynosPort
, flushPortBuffer
);
561 if (pExynosComponent
->pExynosPort
[nPortIndex
].bufferProcessType
& BUFFER_COPY
)
562 Exynos_OSAL_SemaphorePost(pExynosPort
->codecSemID
);
563 Exynos_OSAL_SemaphorePost(pExynosPort
->bufferSemID
);
565 pVideoDec
->exynos_codec_bufferProcessRun(pOMXComponent
, nPortIndex
);
566 Exynos_OSAL_MutexLock(flushPortBuffer
[0]->bufferMutex
);
567 pVideoDec
->exynos_codec_stop(pOMXComponent
, nPortIndex
);
568 Exynos_OSAL_MutexLock(flushPortBuffer
[1]->bufferMutex
);
569 ret
= Exynos_OMX_FlushPort(pOMXComponent
, nPortIndex
);
570 if (pVideoDec
->bReconfigDPB
== OMX_TRUE
)
571 pVideoDec
->exynos_codec_reconfigAllBuffers(pOMXComponent
, nPortIndex
);
572 else if (pExynosComponent
->pExynosPort
[nPortIndex
].bufferProcessType
& BUFFER_COPY
)
573 pVideoDec
->exynos_codec_enqueueAllBuffer(pOMXComponent
, nPortIndex
);
574 Exynos_ResetCodecData(&pExynosPort
->processData
);
576 if (ret
== OMX_ErrorNone
) {
577 if (nPortIndex
== INPUT_PORT_INDEX
) {
578 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_TRUE
;
579 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_FALSE
;
580 Exynos_OSAL_Memset(pExynosComponent
->timeStamp
, -19771003, sizeof(OMX_TICKS
) * MAX_TIMESTAMP
);
581 Exynos_OSAL_Memset(pExynosComponent
->nFlags
, 0, sizeof(OMX_U32
) * MAX_FLAGS
);
582 pExynosComponent
->getAllDelayBuffer
= OMX_FALSE
;
583 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
584 pExynosComponent
->bBehaviorEOS
= OMX_FALSE
;
585 pExynosComponent
->reInputData
= OMX_FALSE
;
588 pExynosComponent
->pExynosPort
[nPortIndex
].bIsPortFlushed
= OMX_FALSE
;
589 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,"OMX_CommandFlush EventCmdComplete, port:%d", nPortIndex
);
590 if (bEvent
== OMX_TRUE
)
591 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
592 pExynosComponent
->callbackData
,
593 OMX_EventCmdComplete
,
594 OMX_CommandFlush
, nPortIndex
, NULL
);
596 Exynos_OSAL_MutexUnlock(flushPortBuffer
[1]->bufferMutex
);
597 Exynos_OSAL_MutexUnlock(flushPortBuffer
[0]->bufferMutex
);
600 if ((ret
!= OMX_ErrorNone
) && (pOMXComponent
!= NULL
) && (pExynosComponent
!= NULL
)) {
601 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
,"%s : %d", __FUNCTION__
, __LINE__
);
602 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
603 pExynosComponent
->callbackData
,
613 OMX_ERRORTYPE
Exynos_InputBufferReturn(
614 OMX_COMPONENTTYPE
*pOMXComponent
,
615 EXYNOS_OMX_DATABUFFER
*pDataBuffer
)
617 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
618 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
619 EXYNOS_OMX_BASEPORT
*pInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
620 OMX_BUFFERHEADERTYPE
*pBufferHdr
= NULL
;
624 pBufferHdr
= pDataBuffer
->bufferHeader
;
626 if (pBufferHdr
!= NULL
) {
627 if (pInputPort
->markType
.hMarkTargetComponent
!= NULL
) {
628 pBufferHdr
->hMarkTargetComponent
= pInputPort
->markType
.hMarkTargetComponent
;
629 pBufferHdr
->pMarkData
= pInputPort
->markType
.pMarkData
;
630 pInputPort
->markType
.hMarkTargetComponent
= NULL
;
631 pInputPort
->markType
.pMarkData
= NULL
;
634 if (pBufferHdr
->hMarkTargetComponent
!= NULL
) {
635 if (pBufferHdr
->hMarkTargetComponent
== pOMXComponent
) {
636 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
637 pExynosComponent
->callbackData
,
639 0, 0, pBufferHdr
->pMarkData
);
641 pExynosComponent
->propagateMarkType
.hMarkTargetComponent
= pBufferHdr
->hMarkTargetComponent
;
642 pExynosComponent
->propagateMarkType
.pMarkData
= pBufferHdr
->pMarkData
;
646 pBufferHdr
->nFilledLen
= 0;
647 pBufferHdr
->nOffset
= 0;
648 Exynos_OMX_InputBufferReturn(pOMXComponent
, pBufferHdr
);
651 /* reset dataBuffer */
652 Exynos_ResetDataBuffer(pDataBuffer
);
660 OMX_ERRORTYPE
Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
662 OMX_ERRORTYPE ret
= OMX_ErrorUndefined
;
663 EXYNOS_OMX_BASEPORT
*pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
664 EXYNOS_OMX_MESSAGE
*message
= NULL
;
665 EXYNOS_OMX_DATABUFFER
*inputUseBuffer
= NULL
;
669 inputUseBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
671 if (pExynosComponent
->currentState
!= OMX_StateExecuting
) {
672 ret
= OMX_ErrorUndefined
;
674 } else if ((pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
675 (!CHECK_PORT_BEING_FLUSHED(pExynosPort
))) {
676 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
677 if (inputUseBuffer
->dataValid
!= OMX_TRUE
) {
678 message
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
679 if (message
== NULL
) {
680 ret
= OMX_ErrorUndefined
;
683 if (message
->messageType
== EXYNOS_OMX_CommandFakeBuffer
) {
684 Exynos_OSAL_Free(message
);
685 ret
= OMX_ErrorCodecFlush
;
689 inputUseBuffer
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)(message
->pCmdData
);
690 inputUseBuffer
->allocSize
= inputUseBuffer
->bufferHeader
->nAllocLen
;
691 inputUseBuffer
->dataLen
= inputUseBuffer
->bufferHeader
->nFilledLen
;
692 inputUseBuffer
->remainDataLen
= inputUseBuffer
->dataLen
;
693 inputUseBuffer
->usedDataLen
= 0;
694 inputUseBuffer
->dataValid
= OMX_TRUE
;
695 inputUseBuffer
->nFlags
= inputUseBuffer
->bufferHeader
->nFlags
;
696 inputUseBuffer
->timeStamp
= inputUseBuffer
->bufferHeader
->nTimeStamp
;
698 Exynos_OSAL_Free(message
);
700 if (inputUseBuffer
->allocSize
<= inputUseBuffer
->dataLen
)
701 Exynos_OSAL_Log(EXYNOS_LOG_WARNING
, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", inputUseBuffer
->allocSize
, inputUseBuffer
->dataLen
);
711 OMX_ERRORTYPE
Exynos_OutputBufferReturn(
712 OMX_COMPONENTTYPE
*pOMXComponent
,
713 EXYNOS_OMX_DATABUFFER
*pDataBuffer
)
715 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
716 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
717 OMX_BUFFERHEADERTYPE
*pBufferHdr
= pDataBuffer
->bufferHeader
;
721 if (pBufferHdr
!= NULL
) {
722 pBufferHdr
->nFilledLen
= pDataBuffer
->remainDataLen
;
723 pBufferHdr
->nOffset
= 0;
724 pBufferHdr
->nFlags
= pDataBuffer
->nFlags
;
725 pBufferHdr
->nTimeStamp
= pDataBuffer
->timeStamp
;
727 if (pExynosComponent
->propagateMarkType
.hMarkTargetComponent
!= NULL
) {
728 pBufferHdr
->hMarkTargetComponent
= pExynosComponent
->propagateMarkType
.hMarkTargetComponent
;
729 pBufferHdr
->pMarkData
= pExynosComponent
->propagateMarkType
.pMarkData
;
731 pExynosComponent
->propagateMarkType
.hMarkTargetComponent
= NULL
;
732 pExynosComponent
->propagateMarkType
.pMarkData
= NULL
;
735 if ((pBufferHdr
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) {
736 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,"event OMX_BUFFERFLAG_EOS!!!");
737 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
738 pExynosComponent
->callbackData
,
741 pBufferHdr
->nFlags
, NULL
);
743 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pBufferHdr
);
746 /* reset dataBuffer */
747 Exynos_ResetDataBuffer(pDataBuffer
);
755 OMX_ERRORTYPE
Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
757 OMX_ERRORTYPE ret
= OMX_ErrorUndefined
;
758 EXYNOS_OMX_BASEPORT
*pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
759 EXYNOS_OMX_MESSAGE
*message
= NULL
;
760 EXYNOS_OMX_DATABUFFER
*outputUseBuffer
= NULL
;
764 if (pExynosPort
->bufferProcessType
& BUFFER_COPY
) {
765 outputUseBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.outputDataBuffer
);
766 } else if (pExynosPort
->bufferProcessType
& BUFFER_SHARE
) {
767 outputUseBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
769 ret
= OMX_ErrorUndefined
;
773 if (pExynosComponent
->currentState
!= OMX_StateExecuting
) {
774 ret
= OMX_ErrorUndefined
;
776 } else if ((pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
777 (!CHECK_PORT_BEING_FLUSHED(pExynosPort
))){
778 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
779 if (outputUseBuffer
->dataValid
!= OMX_TRUE
) {
780 message
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
781 if (message
== NULL
) {
782 ret
= OMX_ErrorUndefined
;
785 if (message
->messageType
== EXYNOS_OMX_CommandFakeBuffer
) {
786 Exynos_OSAL_Free(message
);
787 ret
= OMX_ErrorCodecFlush
;
791 outputUseBuffer
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)(message
->pCmdData
);
792 outputUseBuffer
->allocSize
= outputUseBuffer
->bufferHeader
->nAllocLen
;
793 outputUseBuffer
->dataLen
= 0; //dataBuffer->bufferHeader->nFilledLen;
794 outputUseBuffer
->remainDataLen
= outputUseBuffer
->dataLen
;
795 outputUseBuffer
->usedDataLen
= 0; //dataBuffer->bufferHeader->nOffset;
796 outputUseBuffer
->dataValid
= OMX_TRUE
;
797 /* dataBuffer->nFlags = dataBuffer->bufferHeader->nFlags; */
798 /* dataBuffer->nTimeStamp = dataBuffer->bufferHeader->nTimeStamp; */
800 if (pExynosPort->bufferProcessType & BUFFER_SHARE)
801 outputUseBuffer->pPrivate = outputUseBuffer->bufferHeader->pOutputPortPrivate;
802 else if (pExynosPort->bufferProcessType & BUFFER_COPY) {
803 pExynosPort->processData.dataBuffer = outputUseBuffer->bufferHeader->pBuffer;
804 pExynosPort->processData.allocSize = outputUseBuffer->bufferHeader->nAllocLen;
808 Exynos_OSAL_Free(message
);
819 OMX_BUFFERHEADERTYPE
*Exynos_OutputBufferGetQueue_Direct(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
821 OMX_BUFFERHEADERTYPE
*retBuffer
= NULL
;
822 EXYNOS_OMX_BASEPORT
*pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
823 EXYNOS_OMX_MESSAGE
*message
= NULL
;
827 if (pExynosComponent
->currentState
!= OMX_StateExecuting
) {
830 } else if ((pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
831 (!CHECK_PORT_BEING_FLUSHED(pExynosPort
))){
832 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
834 message
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
835 if (message
== NULL
) {
839 if (message
->messageType
== EXYNOS_OMX_CommandFakeBuffer
) {
840 Exynos_OSAL_Free(message
);
845 retBuffer
= (OMX_BUFFERHEADERTYPE
*)(message
->pCmdData
);
846 Exynos_OSAL_Free(message
);
855 OMX_ERRORTYPE
Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 PortIndex
, OMX_PTR data
)
857 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
858 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
862 pExynosPort
= &pExynosComponent
->pExynosPort
[PortIndex
];
865 ret
= OMX_ErrorInsufficientResources
;
869 ret
= Exynos_OSAL_Queue(&pExynosPort
->codecBufferQ
, (void *)data
);
871 ret
= OMX_ErrorUndefined
;
874 Exynos_OSAL_SemaphorePost(pExynosPort
->codecSemID
);
884 OMX_ERRORTYPE
Exynos_CodecBufferDeQueue(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 PortIndex
, OMX_PTR
*data
)
886 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
887 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
892 pExynosPort
= &pExynosComponent
->pExynosPort
[PortIndex
];
893 Exynos_OSAL_SemaphoreWait(pExynosPort
->codecSemID
);
894 tempData
= (OMX_U32
)Exynos_OSAL_Dequeue(&pExynosPort
->codecBufferQ
);
895 if (tempData
== NULL
) {
897 ret
= OMX_ErrorUndefined
;
900 *data
= (OMX_PTR
)tempData
;
910 OMX_ERRORTYPE
Exynos_CodecBufferReset(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 PortIndex
)
912 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
913 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
917 pExynosPort
= &pExynosComponent
->pExynosPort
[PortIndex
];
919 ret
= Exynos_OSAL_ResetQueue(&pExynosPort
->codecBufferQ
);
921 ret
= OMX_ErrorUndefined
;
926 Exynos_OSAL_Get_SemaphoreCount(pExynosPort
->codecSemID
, &cnt
);
928 Exynos_OSAL_SemaphoreWait(pExynosPort
->codecSemID
);
940 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeGetParameter(
941 OMX_IN OMX_HANDLETYPE hComponent
,
942 OMX_IN OMX_INDEXTYPE nParamIndex
,
943 OMX_INOUT OMX_PTR ComponentParameterStructure
)
945 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
946 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
947 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
948 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
952 if (hComponent
== NULL
) {
953 ret
= OMX_ErrorBadParameter
;
956 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
957 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
958 if (ret
!= OMX_ErrorNone
) {
962 if (pOMXComponent
->pComponentPrivate
== NULL
) {
963 ret
= OMX_ErrorBadParameter
;
966 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
968 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
969 ret
= OMX_ErrorInvalidState
;
973 if (ComponentParameterStructure
== NULL
) {
974 ret
= OMX_ErrorBadParameter
;
978 switch (nParamIndex
) {
979 case OMX_IndexParamVideoInit
:
981 OMX_PORT_PARAM_TYPE
*portParam
= (OMX_PORT_PARAM_TYPE
*)ComponentParameterStructure
;
982 ret
= Exynos_OMX_Check_SizeVersion(portParam
, sizeof(OMX_PORT_PARAM_TYPE
));
983 if (ret
!= OMX_ErrorNone
) {
987 portParam
->nPorts
= pExynosComponent
->portParam
.nPorts
;
988 portParam
->nStartPortNumber
= pExynosComponent
->portParam
.nStartPortNumber
;
992 case OMX_IndexParamVideoPortFormat
:
994 OMX_VIDEO_PARAM_PORTFORMATTYPE
*portFormat
= (OMX_VIDEO_PARAM_PORTFORMATTYPE
*)ComponentParameterStructure
;
995 OMX_U32 portIndex
= portFormat
->nPortIndex
;
996 OMX_U32 index
= portFormat
->nIndex
;
997 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
998 OMX_PARAM_PORTDEFINITIONTYPE
*portDefinition
= NULL
;
999 OMX_U32 supportFormatNum
= 0; /* supportFormatNum = N-1 */
1001 ret
= Exynos_OMX_Check_SizeVersion(portFormat
, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE
));
1002 if (ret
!= OMX_ErrorNone
) {
1006 if ((portIndex
>= pExynosComponent
->portParam
.nPorts
)) {
1007 ret
= OMX_ErrorBadPortIndex
;
1012 if (portIndex
== INPUT_PORT_INDEX
) {
1013 supportFormatNum
= INPUT_PORT_SUPPORTFORMAT_NUM_MAX
- 1;
1014 if (index
> supportFormatNum
) {
1015 ret
= OMX_ErrorNoMore
;
1019 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1020 portDefinition
= &pExynosPort
->portDefinition
;
1022 portFormat
->eCompressionFormat
= portDefinition
->format
.video
.eCompressionFormat
;
1023 portFormat
->eColorFormat
= portDefinition
->format
.video
.eColorFormat
;
1024 portFormat
->xFramerate
= portDefinition
->format
.video
.xFramerate
;
1025 } else if (portIndex
== OUTPUT_PORT_INDEX
) {
1026 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1027 portDefinition
= &pExynosPort
->portDefinition
;
1029 if (pExynosPort
->bIsANBEnabled
== OMX_FALSE
) {
1031 case supportFormat_0
:
1032 portFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1033 portFormat
->eColorFormat
= OMX_COLOR_FormatYUV420Planar
;
1034 portFormat
->xFramerate
= portDefinition
->format
.video
.xFramerate
;
1036 case supportFormat_1
:
1037 portFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1038 portFormat
->eColorFormat
= OMX_COLOR_FormatYUV420SemiPlanar
;
1039 portFormat
->xFramerate
= portDefinition
->format
.video
.xFramerate
;
1041 case supportFormat_2
:
1042 portFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1043 portFormat
->eColorFormat
= OMX_SEC_COLOR_FormatNV12Tiled
;
1044 portFormat
->xFramerate
= portDefinition
->format
.video
.xFramerate
;
1047 if (index
> supportFormat_0
) {
1048 ret
= OMX_ErrorNoMore
;
1055 case supportFormat_0
:
1056 portFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1057 portFormat
->eColorFormat
= OMX_SEC_COLOR_FormatNV12Tiled
;
1058 portFormat
->xFramerate
= portDefinition
->format
.video
.xFramerate
;
1061 if (index
> supportFormat_0
) {
1062 ret
= OMX_ErrorNoMore
;
1069 ret
= OMX_ErrorNone
;
1073 case OMX_IndexParamGetAndroidNativeBuffer
:
1075 ret
= Exynos_OSAL_GetANBParameter(hComponent
, nParamIndex
, ComponentParameterStructure
);
1078 case OMX_IndexParamPortDefinition
:
1080 OMX_PARAM_PORTDEFINITIONTYPE
*portDefinition
= (OMX_PARAM_PORTDEFINITIONTYPE
*)ComponentParameterStructure
;
1081 OMX_U32 portIndex
= portDefinition
->nPortIndex
;
1082 EXYNOS_OMX_BASEPORT
*pExynosPort
;
1084 ret
= Exynos_OMX_GetParameter(hComponent
, nParamIndex
, ComponentParameterStructure
);
1085 if (ret
!= OMX_ErrorNone
) {
1089 /* at this point, GetParameter has done all the verification, we
1090 * just dereference things directly here
1092 pExynosPort
= &pExynosComponent
->pExynosPort
[portIndex
];
1093 if (pExynosPort
->bIsANBEnabled
== OMX_TRUE
) {
1094 portDefinition
->format
.video
.eColorFormat
=
1095 (OMX_COLOR_FORMATTYPE
)Exynos_OSAL_OMX2HalPixelFormat(portDefinition
->format
.video
.eColorFormat
);
1100 case OMX_IndexVendorNeedContigMemory
:
1102 EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
*pPortMemType
= (EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
*)ComponentParameterStructure
;
1103 OMX_U32 nPortIndex
= pPortMemType
->nPortIndex
;
1104 EXYNOS_OMX_BASEPORT
*pExynosPort
;
1106 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1107 ret
= OMX_ErrorBadPortIndex
;
1111 ret
= Exynos_OMX_Check_SizeVersion(pPortMemType
, sizeof(EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
));
1112 if (ret
!= OMX_ErrorNone
)
1115 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1117 pPortMemType
->bNeedContigMem
= pExynosPort
->bNeedContigMem
;
1122 ret
= Exynos_OMX_GetParameter(hComponent
, nParamIndex
, ComponentParameterStructure
);
1132 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeSetParameter(
1133 OMX_IN OMX_HANDLETYPE hComponent
,
1134 OMX_IN OMX_INDEXTYPE nIndex
,
1135 OMX_IN OMX_PTR ComponentParameterStructure
)
1137 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1138 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1139 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1140 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1144 if (hComponent
== NULL
) {
1145 ret
= OMX_ErrorBadParameter
;
1148 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1149 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1150 if (ret
!= OMX_ErrorNone
) {
1154 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1155 ret
= OMX_ErrorBadParameter
;
1158 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1160 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1161 ret
= OMX_ErrorInvalidState
;
1165 if (ComponentParameterStructure
== NULL
) {
1166 ret
= OMX_ErrorBadParameter
;
1171 case OMX_IndexParamVideoPortFormat
:
1173 OMX_VIDEO_PARAM_PORTFORMATTYPE
*portFormat
= (OMX_VIDEO_PARAM_PORTFORMATTYPE
*)ComponentParameterStructure
;
1174 OMX_U32 portIndex
= portFormat
->nPortIndex
;
1175 OMX_U32 index
= portFormat
->nIndex
;
1176 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1177 OMX_PARAM_PORTDEFINITIONTYPE
*portDefinition
= NULL
;
1178 OMX_U32 supportFormatNum
= 0;
1180 ret
= Exynos_OMX_Check_SizeVersion(portFormat
, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE
));
1181 if (ret
!= OMX_ErrorNone
) {
1185 if ((portIndex
>= pExynosComponent
->portParam
.nPorts
)) {
1186 ret
= OMX_ErrorBadPortIndex
;
1189 pExynosPort
= &pExynosComponent
->pExynosPort
[portIndex
];
1190 portDefinition
= &pExynosPort
->portDefinition
;
1192 portDefinition
->format
.video
.eColorFormat
= portFormat
->eColorFormat
;
1193 portDefinition
->format
.video
.eCompressionFormat
= portFormat
->eCompressionFormat
;
1194 portDefinition
->format
.video
.xFramerate
= portFormat
->xFramerate
;
1198 case OMX_IndexParamPortDefinition
:
1200 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDefinition
= (OMX_PARAM_PORTDEFINITIONTYPE
*)ComponentParameterStructure
;
1201 OMX_U32 portIndex
= pPortDefinition
->nPortIndex
;
1202 EXYNOS_OMX_BASEPORT
*pExynosPort
;
1203 OMX_U32 width
, height
, size
;
1204 OMX_U32 realWidth
, realHeight
;
1206 if (portIndex
>= pExynosComponent
->portParam
.nPorts
) {
1207 ret
= OMX_ErrorBadPortIndex
;
1210 ret
= Exynos_OMX_Check_SizeVersion(pPortDefinition
, sizeof(OMX_PARAM_PORTDEFINITIONTYPE
));
1211 if (ret
!= OMX_ErrorNone
) {
1215 pExynosPort
= &pExynosComponent
->pExynosPort
[portIndex
];
1217 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) && (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
1218 if (pExynosPort
->portDefinition
.bEnabled
== OMX_TRUE
) {
1219 ret
= OMX_ErrorIncorrectStateOperation
;
1223 if (pPortDefinition
->nBufferCountActual
< pExynosPort
->portDefinition
.nBufferCountMin
) {
1224 ret
= OMX_ErrorBadParameter
;
1228 Exynos_OSAL_Memcpy(&pExynosPort
->portDefinition
, pPortDefinition
, pPortDefinition
->nSize
);
1230 #ifdef USE_ANB // Modified by Google engineer
1231 /* should not affect the format since in ANB case, the caller
1232 * is providing us a HAL format */
1233 if (pExynosPort
->bIsANBEnabled
== OMX_TRUE
) {
1234 pExynosPort
->portDefinition
.format
.video
.eColorFormat
=
1235 Exynos_OSAL_Hal2OMXPixelFormat(pExynosPort
->portDefinition
.format
.video
.eColorFormat
);
1239 realWidth
= pExynosPort
->portDefinition
.format
.video
.nFrameWidth
;
1240 realHeight
= pExynosPort
->portDefinition
.format
.video
.nFrameHeight
;
1241 width
= ((realWidth
+ 15) & (~15));
1242 height
= ((realHeight
+ 15) & (~15));
1243 size
= (width
* height
* 3) / 2;
1244 pExynosPort
->portDefinition
.format
.video
.nStride
= width
;
1245 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= height
;
1246 pExynosPort
->portDefinition
.nBufferSize
= (size
> pExynosPort
->portDefinition
.nBufferSize
) ? size
: pExynosPort
->portDefinition
.nBufferSize
;
1248 if (portIndex
== INPUT_PORT_INDEX
) {
1249 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1250 pExynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
= pExynosPort
->portDefinition
.format
.video
.nFrameWidth
;
1251 pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
= pExynosPort
->portDefinition
.format
.video
.nFrameHeight
;
1252 pExynosOutputPort
->portDefinition
.format
.video
.nStride
= width
;
1253 pExynosOutputPort
->portDefinition
.format
.video
.nSliceHeight
= height
;
1255 switch (pExynosOutputPort
->portDefinition
.format
.video
.eColorFormat
) {
1256 case OMX_COLOR_FormatYUV420Planar
:
1257 case OMX_COLOR_FormatYUV420SemiPlanar
:
1258 case OMX_SEC_COLOR_FormatNV12Tiled
:
1259 pExynosOutputPort
->portDefinition
.nBufferSize
= (width
* height
* 3) / 2;
1262 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Color format is not support!! use default YUV size!!");
1263 ret
= OMX_ErrorUnsupportedSetting
;
1270 case OMX_IndexParamEnableAndroidBuffers
:
1271 case OMX_IndexParamUseAndroidNativeBuffer
:
1273 ret
= Exynos_OSAL_SetANBParameter(hComponent
, nIndex
, ComponentParameterStructure
);
1277 case OMX_IndexVendorNeedContigMemory
:
1279 EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
*pPortMemType
= (EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
*)ComponentParameterStructure
;
1280 OMX_U32 nPortIndex
= pPortMemType
->nPortIndex
;
1281 EXYNOS_OMX_BASEPORT
*pExynosPort
;
1283 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1284 ret
= OMX_ErrorBadPortIndex
;
1288 ret
= Exynos_OMX_Check_SizeVersion(pPortMemType
, sizeof(EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
));
1289 if (ret
!= OMX_ErrorNone
)
1292 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1294 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) && (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
1295 if (pExynosPort
->portDefinition
.bEnabled
== OMX_TRUE
) {
1296 ret
= OMX_ErrorIncorrectStateOperation
;
1301 pExynosPort
->bNeedContigMem
= pPortMemType
->bNeedContigMem
;
1304 case OMX_IndexVendorSetDTSMode
:
1306 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1307 EXYNOS_OMX_VIDEO_PARAM_DTSMODE
*pDTSParam
= (EXYNOS_OMX_VIDEO_PARAM_DTSMODE
*)ComponentParameterStructure
;
1309 ret
= Exynos_OMX_Check_SizeVersion(pDTSParam
, sizeof(EXYNOS_OMX_VIDEO_PARAM_DTSMODE
));
1310 if (ret
!= OMX_ErrorNone
)
1313 pVideoDec
->bDTSMode
= pDTSParam
->bDTSMode
;
1318 ret
= Exynos_OMX_SetParameter(hComponent
, nIndex
, ComponentParameterStructure
);
1329 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeGetConfig(
1330 OMX_HANDLETYPE hComponent
,
1331 OMX_INDEXTYPE nIndex
,
1332 OMX_PTR pComponentConfigStructure
)
1334 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1335 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1336 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1340 if (hComponent
== NULL
) {
1341 ret
= OMX_ErrorBadParameter
;
1344 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1345 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1346 if (ret
!= OMX_ErrorNone
) {
1349 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1350 ret
= OMX_ErrorBadParameter
;
1353 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1354 if (pComponentConfigStructure
== NULL
) {
1355 ret
= OMX_ErrorBadParameter
;
1358 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1359 ret
= OMX_ErrorInvalidState
;
1364 case OMX_IndexVendorGetBufferFD
:
1366 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1367 EXYNOS_OMX_VIDEO_CONFIG_BUFFERINFO
*pBufferInfo
= (EXYNOS_OMX_VIDEO_CONFIG_BUFFERINFO
*)pComponentConfigStructure
;
1369 ret
= Exynos_OMX_Check_SizeVersion(pBufferInfo
, sizeof(EXYNOS_OMX_VIDEO_CONFIG_BUFFERINFO
));
1370 if (ret
!= OMX_ErrorNone
)
1373 pBufferInfo
->fd
= Exynos_OSAL_SharedMemory_VirtToION(pVideoDec
->hSharedMemory
, pBufferInfo
->pVirAddr
);
1377 ret
= Exynos_OMX_GetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1387 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeSetConfig(
1388 OMX_HANDLETYPE hComponent
,
1389 OMX_INDEXTYPE nIndex
,
1390 OMX_PTR pComponentConfigStructure
)
1392 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1393 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1394 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1398 if (hComponent
== NULL
) {
1399 ret
= OMX_ErrorBadParameter
;
1402 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1403 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1404 if (ret
!= OMX_ErrorNone
) {
1407 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1408 ret
= OMX_ErrorBadParameter
;
1411 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1412 if (pComponentConfigStructure
== NULL
) {
1413 ret
= OMX_ErrorBadParameter
;
1416 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1417 ret
= OMX_ErrorInvalidState
;
1422 case OMX_IndexVendorThumbnailMode
:
1424 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1425 pVideoDec
->bThumbnailMode
= *((OMX_BOOL
*)pComponentConfigStructure
);
1427 ret
= OMX_ErrorNone
;
1431 ret
= Exynos_OMX_SetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1441 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeGetExtensionIndex(
1442 OMX_IN OMX_HANDLETYPE hComponent
,
1443 OMX_IN OMX_STRING cParameterName
,
1444 OMX_OUT OMX_INDEXTYPE
*pIndexType
)
1446 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1447 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1448 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1452 if (hComponent
== NULL
) {
1453 ret
= OMX_ErrorBadParameter
;
1456 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1457 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1458 if (ret
!= OMX_ErrorNone
) {
1462 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1463 ret
= OMX_ErrorBadParameter
;
1466 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1468 if ((cParameterName
== NULL
) || (pIndexType
== NULL
)) {
1469 ret
= OMX_ErrorBadParameter
;
1472 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1473 ret
= OMX_ErrorInvalidState
;
1477 if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_PARAM_NEED_CONTIG_MEMORY
) == 0) {
1478 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexVendorNeedContigMemory
;
1479 ret
= OMX_ErrorNone
;
1481 } else if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_CONFIG_GET_BUFFER_FD
) == 0) {
1482 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexVendorGetBufferFD
;
1483 ret
= OMX_ErrorNone
;
1485 } else if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_PARAM_SET_DTS_MODE
) == 0) {
1486 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexVendorSetDTSMode
;
1487 ret
= OMX_ErrorNone
;
1492 if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_PARAM_ENABLE_ANB
) == 0)
1493 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexParamEnableAndroidBuffers
;
1494 else if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_PARAM_GET_ANB
) == 0)
1495 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexParamGetAndroidNativeBuffer
;
1496 else if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_PARAM_USE_ANB
) == 0)
1497 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexParamUseAndroidNativeBuffer
;
1499 ret
= Exynos_OMX_GetExtensionIndex(hComponent
, cParameterName
, pIndexType
);
1501 ret
= Exynos_OMX_GetExtensionIndex(hComponent
, cParameterName
, pIndexType
);
1511 OMX_ERRORTYPE
Exynos_Shared_ANBBufferToData(EXYNOS_OMX_DATABUFFER
*pUseBuffer
, EXYNOS_OMX_DATA
*pData
, EXYNOS_OMX_BASEPORT
*pExynosPort
, EXYNOS_OMX_PLANE nPlane
)
1513 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1514 OMX_U32 width
, height
;
1515 // void *pPhys[MAX_BUFFER_PLANE];
1516 ExynosVideoPlane planes
[MAX_BUFFER_PLANE
];
1518 memset(planes
, 0, sizeof(planes
));
1520 if (pExynosPort
->bIsANBEnabled
== OMX_TRUE
) {
1523 width
= pExynosPort
->portDefinition
.format
.video
.nFrameWidth
;
1524 height
= pExynosPort
->portDefinition
.format
.video
.nFrameHeight
;
1525 if ((pUseBuffer
->bufferHeader
!= NULL
) &&
1526 (pUseBuffer
->bufferHeader
->pBuffer
!= NULL
) &&
1527 (pExynosPort
->exceptionFlag
== GENERAL_STATE
)) {
1528 Exynos_OSAL_LockANB(pUseBuffer
->bufferHeader
->pBuffer
, width
, height
, pExynosPort
->portDefinition
.format
.video
.eColorFormat
, &stride
, planes
);
1529 pUseBuffer
->dataLen
= sizeof(void *);
1531 ret
= OMX_ErrorBadParameter
;
1535 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
1536 ret
= OMX_ErrorBadParameter
;
1540 if (nPlane
== TWO_PLANE
) {
1541 /* Case of Shared Buffer, Only support two PlaneBuffer */
1542 pData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] = planes
[0].addr
;
1543 pData
->buffer
.multiPlaneBuffer
.dataBuffer
[1] = planes
[1].addr
;
1545 pData
->buffer
.multiPlaneBuffer
.fd
[0] = planes
[0].fd
;
1546 pData
->buffer
.multiPlaneBuffer
.fd
[1] = planes
[1].fd
;
1549 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not support plane");
1550 ret
= OMX_ErrorNotImplemented
;
1554 pData
->allocSize
= pUseBuffer
->allocSize
;
1555 pData
->dataLen
= pUseBuffer
->dataLen
;
1556 pData
->usedDataLen
= pUseBuffer
->usedDataLen
;
1557 pData
->remainDataLen
= pUseBuffer
->remainDataLen
;
1558 pData
->timeStamp
= pUseBuffer
->timeStamp
;
1559 pData
->nFlags
= pUseBuffer
->nFlags
;
1560 pData
->pPrivate
= pUseBuffer
->pPrivate
;
1561 pData
->bufferHeader
= pUseBuffer
->bufferHeader
;
1567 OMX_ERRORTYPE
Exynos_Shared_DataToANBBuffer(EXYNOS_OMX_DATA
*pData
, EXYNOS_OMX_DATABUFFER
*pUseBuffer
, EXYNOS_OMX_BASEPORT
*pExynosPort
)
1569 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1571 pUseBuffer
->bufferHeader
= pData
->bufferHeader
;
1572 pUseBuffer
->allocSize
= pData
->allocSize
;
1573 pUseBuffer
->dataLen
= pData
->dataLen
;
1574 pUseBuffer
->usedDataLen
= pData
->usedDataLen
;
1575 pUseBuffer
->remainDataLen
= pData
->remainDataLen
;
1576 pUseBuffer
->timeStamp
= pData
->timeStamp
;
1577 pUseBuffer
->nFlags
= pData
->nFlags
;
1578 pUseBuffer
->pPrivate
= pData
->pPrivate
;
1580 if ((pUseBuffer
->bufferHeader
== NULL
) ||
1581 (pUseBuffer
->bufferHeader
->pBuffer
== NULL
)) {
1582 ret
= OMX_ErrorUndefined
;
1586 if (pExynosPort
->bIsANBEnabled
== OMX_TRUE
) {
1587 Exynos_OSAL_UnlockANB(pUseBuffer
->bufferHeader
->pBuffer
);
1589 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
1590 ret
= OMX_ErrorBadParameter
;
1599 OMX_ERRORTYPE
Exynos_Shared_DataToBuffer(EXYNOS_OMX_DATA
*pData
, EXYNOS_OMX_DATABUFFER
*pUseBuffer
)
1601 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1603 pUseBuffer
->bufferHeader
= pData
->bufferHeader
;
1604 pUseBuffer
->allocSize
= pData
->allocSize
;
1605 pUseBuffer
->dataLen
= pData
->dataLen
;
1606 pUseBuffer
->usedDataLen
= pData
->usedDataLen
;
1607 pUseBuffer
->remainDataLen
= pData
->remainDataLen
;
1608 pUseBuffer
->timeStamp
= pData
->timeStamp
;
1609 pUseBuffer
->nFlags
= pData
->nFlags
;
1610 pUseBuffer
->pPrivate
= pData
->pPrivate
;