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_VencControl.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_Venc.h"
33 #include "Exynos_OMX_VencControl.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"
46 #define EXYNOS_LOG_TAG "EXYNOS_VIDEO_ENCCONTROL"
47 #define EXYNOS_LOG_OFF
48 //#define EXYNOS_TRACE_ON
49 #include "Exynos_OSAL_Log.h"
52 OMX_ERRORTYPE
Exynos_OMX_UseBuffer(
53 OMX_IN OMX_HANDLETYPE hComponent
,
54 OMX_INOUT OMX_BUFFERHEADERTYPE
**ppBufferHdr
,
55 OMX_IN OMX_U32 nPortIndex
,
56 OMX_IN OMX_PTR pAppPrivate
,
57 OMX_IN OMX_U32 nSizeBytes
,
58 OMX_IN OMX_U8
*pBuffer
)
60 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
61 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
62 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
63 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
64 OMX_BUFFERHEADERTYPE
*pTempBufferHdr
= NULL
;
69 if (hComponent
== NULL
) {
70 ret
= OMX_ErrorBadParameter
;
73 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
75 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
76 if (ret
!= OMX_ErrorNone
) {
80 if (pOMXComponent
->pComponentPrivate
== NULL
) {
81 ret
= OMX_ErrorBadParameter
;
84 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
86 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
87 ret
= OMX_ErrorBadPortIndex
;
90 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
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 pTempBufferHdr
= (OMX_BUFFERHEADERTYPE
*)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE
));
103 if (pTempBufferHdr
== NULL
) {
104 ret
= OMX_ErrorInsufficientResources
;
107 Exynos_OSAL_Memset(pTempBufferHdr
, 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
= pTempBufferHdr
;
112 pExynosPort
->bufferStateAllocate
[i
] = (BUFFER_STATE_ASSIGNED
| HEADER_STATE_ALLOCATED
);
113 INIT_SET_SIZE_VERSION(pTempBufferHdr
, OMX_BUFFERHEADERTYPE
);
114 pTempBufferHdr
->pBuffer
= pBuffer
;
115 pTempBufferHdr
->nAllocLen
= nSizeBytes
;
116 pTempBufferHdr
->pAppPrivate
= pAppPrivate
;
117 if (nPortIndex
== INPUT_PORT_INDEX
)
118 pTempBufferHdr
->nInputPortIndex
= INPUT_PORT_INDEX
;
120 pTempBufferHdr
->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
= pTempBufferHdr
;
135 Exynos_OSAL_Free(pTempBufferHdr
);
136 ret
= OMX_ErrorInsufficientResources
;
144 OMX_ERRORTYPE
Exynos_OMX_AllocateBuffer(
145 OMX_IN OMX_HANDLETYPE hComponent
,
146 OMX_INOUT OMX_BUFFERHEADERTYPE
**ppBufferHdr
,
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_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
155 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
156 OMX_BUFFERHEADERTYPE
*pTempBufferHdr
= NULL
;
157 OMX_U8
*pTempBuffer
= NULL
;
158 int fdTempBuffer
= -1;
159 MEMORY_TYPE eMemType
= SYSTEM_MEMORY
;
164 if (hComponent
== NULL
) {
165 ret
= OMX_ErrorBadParameter
;
168 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
170 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
171 if (ret
!= OMX_ErrorNone
) {
175 if (pOMXComponent
->pComponentPrivate
== NULL
) {
176 ret
= OMX_ErrorBadParameter
;
179 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
181 if (pExynosComponent
->hComponentHandle
== NULL
) {
182 ret
= OMX_ErrorBadParameter
;
185 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
187 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
188 ret
= OMX_ErrorBadPortIndex
;
191 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
193 if (pExynosPort->portState != OMX_StateIdle ) {
194 ret = OMX_ErrorIncorrectStateOperation;
198 if (CHECK_PORT_TUNNELED(pExynosPort
) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort
)) {
199 ret
= OMX_ErrorBadPortIndex
;
203 if ((pVideoEnc
->bDRMPlayerMode
== OMX_TRUE
) &&
204 (nPortIndex
== OUTPUT_PORT_INDEX
)) {
205 eMemType
= SECURE_MEMORY
;
206 } else if (pExynosPort
->bNeedContigMem
== OMX_TRUE
) {
207 eMemType
= CONTIG_MEMORY
;
208 } else if ((nPortIndex
== INPUT_PORT_INDEX
) &&
209 (pExynosPort
->bufferProcessType
& BUFFER_SHARE
)) {
210 eMemType
= NORMAL_MEMORY
;
213 pTempBuffer
= Exynos_OSAL_SharedMemory_Alloc(pVideoEnc
->hSharedMemory
, nSizeBytes
, eMemType
);
214 if (pTempBuffer
== NULL
) {
215 ret
= OMX_ErrorInsufficientResources
;
218 fdTempBuffer
= Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc
->hSharedMemory
, pTempBuffer
);
220 pTempBufferHdr
= (OMX_BUFFERHEADERTYPE
*)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE
));
221 if (pTempBufferHdr
== NULL
) {
222 Exynos_OSAL_SharedMemory_Free(pVideoEnc
->hSharedMemory
, pTempBuffer
);
223 ret
= OMX_ErrorInsufficientResources
;
226 Exynos_OSAL_Memset(pTempBufferHdr
, 0, sizeof(OMX_BUFFERHEADERTYPE
));
228 for (i
= 0; i
< pExynosPort
->portDefinition
.nBufferCountActual
; i
++) {
229 if (pExynosPort
->bufferStateAllocate
[i
] == BUFFER_STATE_FREE
) {
230 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
= pTempBufferHdr
;
231 pExynosPort
->extendBufferHeader
[i
].buf_fd
[0] = fdTempBuffer
;
232 pExynosPort
->bufferStateAllocate
[i
] = (BUFFER_STATE_ALLOCATED
| HEADER_STATE_ALLOCATED
);
233 INIT_SET_SIZE_VERSION(pTempBufferHdr
, OMX_BUFFERHEADERTYPE
);
234 if (eMemType
== SECURE_MEMORY
)
235 pTempBufferHdr
->pBuffer
= fdTempBuffer
;
237 pTempBufferHdr
->pBuffer
= pTempBuffer
;
238 pTempBufferHdr
->nAllocLen
= nSizeBytes
;
239 pTempBufferHdr
->pAppPrivate
= pAppPrivate
;
240 if (nPortIndex
== INPUT_PORT_INDEX
)
241 pTempBufferHdr
->nInputPortIndex
= INPUT_PORT_INDEX
;
243 pTempBufferHdr
->nOutputPortIndex
= OUTPUT_PORT_INDEX
;
244 pExynosPort
->assignedBufferNum
++;
245 if (pExynosPort
->assignedBufferNum
== pExynosPort
->portDefinition
.nBufferCountActual
) {
246 pExynosPort
->portDefinition
.bPopulated
= OMX_TRUE
;
247 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
248 Exynos_OSAL_SemaphorePost(pExynosPort
->loadedResource
);
249 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
251 *ppBufferHdr
= pTempBufferHdr
;
257 Exynos_OSAL_Free(pTempBufferHdr
);
258 Exynos_OSAL_SharedMemory_Free(pVideoEnc
->hSharedMemory
, pTempBuffer
);
260 ret
= OMX_ErrorInsufficientResources
;
268 OMX_ERRORTYPE
Exynos_OMX_FreeBuffer(
269 OMX_IN OMX_HANDLETYPE hComponent
,
270 OMX_IN OMX_U32 nPortIndex
,
271 OMX_IN OMX_BUFFERHEADERTYPE
*pBufferHdr
)
273 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
274 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
275 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
276 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
277 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
278 OMX_BUFFERHEADERTYPE
*pOMXBufferHdr
= NULL
;
283 if (hComponent
== NULL
) {
284 ret
= OMX_ErrorBadParameter
;
287 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
289 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
290 if (ret
!= OMX_ErrorNone
) {
294 if (pOMXComponent
->pComponentPrivate
== NULL
) {
295 ret
= OMX_ErrorBadParameter
;
298 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
300 if (pExynosComponent
->hComponentHandle
== NULL
) {
301 ret
= OMX_ErrorBadParameter
;
304 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
306 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
307 ret
= OMX_ErrorBadPortIndex
;
310 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
312 if (CHECK_PORT_TUNNELED(pExynosPort
) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort
)) {
313 ret
= OMX_ErrorBadPortIndex
;
317 if ((pExynosPort
->portState
!= OMX_StateLoaded
) &&
318 (pExynosPort
->portState
!= OMX_StateInvalid
)) {
319 (*(pExynosComponent
->pCallbacks
->EventHandler
)) (pOMXComponent
,
320 pExynosComponent
->callbackData
,
321 (OMX_U32
)OMX_EventError
,
322 (OMX_U32
)OMX_ErrorPortUnpopulated
,
326 for (i
= 0; i
< /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM
; i
++) {
327 if ((pExynosPort
->bufferStateAllocate
[i
] != BUFFER_STATE_FREE
) &&
328 (pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
!= NULL
)) {
329 pOMXBufferHdr
= pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
;
331 if (pOMXBufferHdr
->pBuffer
== pBufferHdr
->pBuffer
) {
332 if (pExynosPort
->bufferStateAllocate
[i
] & BUFFER_STATE_ALLOCATED
) {
333 if ((pVideoEnc
->bDRMPlayerMode
== OMX_TRUE
) &&
334 (nPortIndex
== OUTPUT_PORT_INDEX
)) {
335 OMX_PTR mapBuffer
= Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc
->hSharedMemory
, (int)pOMXBufferHdr
->pBuffer
);
336 Exynos_OSAL_SharedMemory_Free(pVideoEnc
->hSharedMemory
, mapBuffer
);
338 Exynos_OSAL_SharedMemory_Free(pVideoEnc
->hSharedMemory
, pOMXBufferHdr
->pBuffer
);
340 pOMXBufferHdr
->pBuffer
= NULL
;
341 pBufferHdr
->pBuffer
= NULL
;
342 } else if (pExynosPort
->bufferStateAllocate
[i
] & BUFFER_STATE_ASSIGNED
) {
345 pExynosPort
->assignedBufferNum
--;
347 if (pExynosPort
->bufferStateAllocate
[i
] & HEADER_STATE_ALLOCATED
) {
348 Exynos_OSAL_Free(pOMXBufferHdr
);
349 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
= NULL
;
353 pExynosPort
->bufferStateAllocate
[i
] = BUFFER_STATE_FREE
;
361 if ((ret
== OMX_ErrorNone
) &&
362 (pExynosPort
->assignedBufferNum
== 0)) {
363 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pExynosPort->unloadedResource signal set");
364 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
365 Exynos_OSAL_SemaphorePost(pExynosPort
->unloadedResource
);
366 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
367 pExynosPort
->portDefinition
.bPopulated
= OMX_FALSE
;
375 OMX_ERRORTYPE
Exynos_OMX_AllocateTunnelBuffer(
376 EXYNOS_OMX_BASEPORT
*pOMXBasePort
,
379 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
380 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
381 OMX_BUFFERHEADERTYPE
*pTempBufferHdr
= NULL
;
382 OMX_U8
*pTempBuffer
= NULL
;
383 OMX_U32 nBufferSize
= 0;
384 OMX_PARAM_PORTDEFINITIONTYPE portDefinition
;
386 ret
= OMX_ErrorTunnelingUnsupported
;
391 OMX_ERRORTYPE
Exynos_OMX_FreeTunnelBuffer(
392 EXYNOS_OMX_BASEPORT
*pOMXBasePort
,
395 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
396 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
397 OMX_BUFFERHEADERTYPE
*pTempBufferHdr
= NULL
;
398 OMX_U8
*pTempBuffer
= NULL
;
399 OMX_U32 nBufferSize
= 0;
401 ret
= OMX_ErrorTunnelingUnsupported
;
406 OMX_ERRORTYPE
Exynos_OMX_ComponentTunnelRequest(
407 OMX_IN OMX_HANDLETYPE hComp
,
408 OMX_IN OMX_U32 nPort
,
409 OMX_IN OMX_HANDLETYPE hTunneledComp
,
410 OMX_IN OMX_U32 nTunneledPort
,
411 OMX_INOUT OMX_TUNNELSETUPTYPE
*pTunnelSetup
)
413 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
415 ret
= OMX_ErrorTunnelingUnsupported
;
420 OMX_ERRORTYPE
Exynos_OMX_GetFlushBuffer(
421 EXYNOS_OMX_BASEPORT
*pExynosPort
,
422 EXYNOS_OMX_DATABUFFER
*pDataBuffer
[])
424 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
430 if (pExynosPort
->portWayType
== WAY1_PORT
) {
431 *pDataBuffer
= &pExynosPort
->way
.port1WayDataBuffer
.dataBuffer
;
432 } else if (pExynosPort
->portWayType
== WAY2_PORT
) {
433 pDataBuffer
[0] = &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
434 pDataBuffer
[1] = &(pExynosPort
->way
.port2WayDataBuffer
.outputDataBuffer
);
443 OMX_ERRORTYPE
Exynos_OMX_FlushPort(
444 OMX_COMPONENTTYPE
*pOMXComponent
,
447 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
448 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
449 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
450 OMX_BUFFERHEADERTYPE
*pBufferHdr
= NULL
;
451 EXYNOS_OMX_DATABUFFER
*pDataBuffer
[2] = {NULL
, NULL
};
452 EXYNOS_OMX_MESSAGE
*pMessage
= NULL
;
453 OMX_S32 nSemaCnt
= 0;
458 if (pOMXComponent
== NULL
) {
459 ret
= OMX_ErrorBadParameter
;
463 if (pOMXComponent
->pComponentPrivate
== NULL
) {
464 ret
= OMX_ErrorBadParameter
;
467 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
469 if ((nPortIndex
< 0) ||
470 (nPortIndex
>= pExynosComponent
->portParam
.nPorts
)) {
471 ret
= OMX_ErrorBadPortIndex
;
474 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
476 while (Exynos_OSAL_GetElemNum(&pExynosPort
->bufferQ
) > 0) {
477 Exynos_OSAL_Get_SemaphoreCount(pExynosPort
->bufferSemID
, &nSemaCnt
);
479 Exynos_OSAL_SemaphorePost(pExynosPort
->bufferSemID
);
481 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
482 pMessage
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
483 if ((pMessage
!= NULL
) &&
484 (pMessage
->messageType
!= EXYNOS_OMX_CommandFakeBuffer
)) {
485 pBufferHdr
= (OMX_BUFFERHEADERTYPE
*)pMessage
->pCmdData
;
486 pBufferHdr
->nFilledLen
= 0;
488 if (nPortIndex
== OUTPUT_PORT_INDEX
) {
489 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pBufferHdr
);
490 } else if (nPortIndex
== INPUT_PORT_INDEX
) {
491 Exynos_OMX_InputBufferReturn(pOMXComponent
, pBufferHdr
);
494 Exynos_OSAL_Free(pMessage
);
498 Exynos_OMX_GetFlushBuffer(pExynosPort
, pDataBuffer
);
499 if ((pDataBuffer
[0] != NULL
) &&
500 (pDataBuffer
[0]->dataValid
== OMX_TRUE
)) {
501 if (nPortIndex
== INPUT_PORT_INDEX
)
502 Exynos_FlushInputBufferReturn(pOMXComponent
, pDataBuffer
[0]);
503 else if (nPortIndex
== OUTPUT_PORT_INDEX
)
504 Exynos_FlushOutputBufferReturn(pOMXComponent
, pDataBuffer
[0]);
506 if ((pDataBuffer
[1] != NULL
) &&
507 (pDataBuffer
[1]->dataValid
== OMX_TRUE
)) {
508 if (nPortIndex
== INPUT_PORT_INDEX
)
509 Exynos_FlushInputBufferReturn(pOMXComponent
, pDataBuffer
[1]);
510 else if (nPortIndex
== OUTPUT_PORT_INDEX
)
511 Exynos_FlushOutputBufferReturn(pOMXComponent
, pDataBuffer
[1]);
514 if (pExynosComponent
->bMultiThreadProcess
== OMX_TRUE
) {
515 if (pExynosPort
->bufferProcessType
& BUFFER_SHARE
) {
516 if (pExynosPort
->processData
.bufferHeader
!= NULL
) {
517 if (nPortIndex
== INPUT_PORT_INDEX
) {
518 #ifdef USE_METADATABUFFERTYPE
519 if ((pExynosPort
->bStoreMetaData
== OMX_TRUE
) &&
520 (pExynosPort
->portDefinition
.format
.video
.eColorFormat
== OMX_COLOR_FormatAndroidOpaque
)) {
521 OMX_PTR ppBuf
[MAX_BUFFER_PLANE
];
522 Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE
)pExynosPort
->processData
.bufferHeader
->pBuffer
, ppBuf
);
523 Exynos_OSAL_UnlockANBHandle(ppBuf
[0]);
526 Exynos_OMX_InputBufferReturn(pOMXComponent
, pExynosPort
->processData
.bufferHeader
);
527 } else if (nPortIndex
== OUTPUT_PORT_INDEX
) {
528 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pExynosPort
->processData
.bufferHeader
);
531 Exynos_ResetCodecData(&pExynosPort
->processData
);
533 for (i
= 0; i
< pExynosPort
->portDefinition
.nBufferCountActual
; i
++) {
534 if (pExynosPort
->extendBufferHeader
[i
].bBufferInOMX
== OMX_TRUE
) {
535 if (nPortIndex
== OUTPUT_PORT_INDEX
) {
536 Exynos_OMX_OutputBufferReturn(pOMXComponent
,
537 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
);
538 } else if (nPortIndex
== INPUT_PORT_INDEX
) {
539 #ifdef USE_METADATABUFFERTYPE
540 if ((pExynosPort
->bStoreMetaData
== OMX_TRUE
) &&
541 (pExynosPort
->portDefinition
.format
.video
.eColorFormat
== OMX_COLOR_FormatAndroidOpaque
)) {
542 OMX_PTR ppBuf
[MAX_BUFFER_PLANE
];
543 Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE
)pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
, ppBuf
);
544 Exynos_OSAL_UnlockANBHandle(ppBuf
[0]);
547 Exynos_OMX_InputBufferReturn(pOMXComponent
,
548 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
);
554 Exynos_ResetCodecData(&pExynosPort
->processData
);
559 Exynos_OSAL_Get_SemaphoreCount(pExynosPort
->bufferSemID
, &cnt
);
562 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
564 Exynos_OSAL_ResetQueue(&pExynosPort
->bufferQ
);
572 OMX_ERRORTYPE
Exynos_OMX_BufferFlush(
573 OMX_COMPONENTTYPE
*pOMXComponent
,
577 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
578 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
579 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
580 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
581 EXYNOS_OMX_DATABUFFER
*pDataBuffer
[2] = {NULL
, NULL
};
586 if (pOMXComponent
== NULL
) {
587 ret
= OMX_ErrorBadParameter
;
591 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
592 if (ret
!= OMX_ErrorNone
) {
596 if (pOMXComponent
->pComponentPrivate
== NULL
) {
597 ret
= OMX_ErrorBadParameter
;
600 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
602 if (pExynosComponent
->hComponentHandle
== NULL
) {
603 ret
= OMX_ErrorBadParameter
;
606 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
608 if ((nPortIndex
< 0) ||
609 (nPortIndex
>= pExynosComponent
->portParam
.nPorts
)) {
610 ret
= OMX_ErrorBadPortIndex
;
613 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
615 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,"OMX_CommandFlush start, port:%d", nPortIndex
);
617 pExynosPort
->bIsPortFlushed
= OMX_TRUE
;
619 if (pExynosComponent
->bMultiThreadProcess
== OMX_FALSE
) {
620 Exynos_OSAL_SignalSet(pExynosComponent
->pauseEvent
);
622 Exynos_OSAL_SignalSet(pExynosPort
->pauseEvent
);
625 Exynos_OMX_GetFlushBuffer(pExynosPort
, pDataBuffer
);
626 if (pDataBuffer
[0] == NULL
) {
627 ret
= OMX_ErrorBadParameter
;
631 if (pExynosPort
->bufferProcessType
& BUFFER_COPY
)
632 Exynos_OSAL_SemaphorePost(pExynosPort
->codecSemID
);
633 Exynos_OSAL_SemaphorePost(pExynosPort
->bufferSemID
);
635 pVideoEnc
->exynos_codec_bufferProcessRun(pOMXComponent
, nPortIndex
);
637 Exynos_OSAL_MutexLock(pDataBuffer
[0]->bufferMutex
);
638 pVideoEnc
->exynos_codec_stop(pOMXComponent
, nPortIndex
);
640 if (pDataBuffer
[1] != NULL
)
641 Exynos_OSAL_MutexLock(pDataBuffer
[1]->bufferMutex
);
643 ret
= Exynos_OMX_FlushPort(pOMXComponent
, nPortIndex
);
644 if (ret
!= OMX_ErrorNone
)
647 if (pExynosPort
->bufferProcessType
& BUFFER_COPY
)
648 pVideoEnc
->exynos_codec_enqueueAllBuffer(pOMXComponent
, nPortIndex
);
649 Exynos_ResetCodecData(&pExynosPort
->processData
);
651 if (ret
== OMX_ErrorNone
) {
652 if (nPortIndex
== INPUT_PORT_INDEX
) {
653 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_TRUE
;
654 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_FALSE
;
655 Exynos_OSAL_Memset(pExynosComponent
->timeStamp
, -19771003, sizeof(OMX_TICKS
) * MAX_TIMESTAMP
);
656 Exynos_OSAL_Memset(pExynosComponent
->nFlags
, 0, sizeof(OMX_U32
) * MAX_FLAGS
);
657 pExynosComponent
->getAllDelayBuffer
= OMX_FALSE
;
658 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
659 pExynosComponent
->reInputData
= OMX_FALSE
;
662 pExynosPort
->bIsPortFlushed
= OMX_FALSE
;
663 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,"OMX_CommandFlush EventCmdComplete, port:%d", nPortIndex
);
664 if (bEvent
== OMX_TRUE
)
665 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
666 pExynosComponent
->callbackData
,
667 OMX_EventCmdComplete
,
668 OMX_CommandFlush
, nPortIndex
, NULL
);
671 if (pDataBuffer
[1] != NULL
)
672 Exynos_OSAL_MutexUnlock(pDataBuffer
[1]->bufferMutex
);
674 Exynos_OSAL_MutexUnlock(pDataBuffer
[0]->bufferMutex
);
677 if ((ret
!= OMX_ErrorNone
) && (pOMXComponent
!= NULL
) && (pExynosComponent
!= NULL
)) {
678 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
,"%s : %d", __FUNCTION__
, __LINE__
);
679 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
680 pExynosComponent
->callbackData
,
690 OMX_ERRORTYPE
Exynos_InputBufferReturn(
691 OMX_COMPONENTTYPE
*pOMXComponent
)
693 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
694 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
695 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
696 EXYNOS_OMX_DATABUFFER
*pDataBuffer
= NULL
;
697 OMX_BUFFERHEADERTYPE
*pBufferHdr
= NULL
;
701 if (pOMXComponent
== NULL
) {
702 ret
= OMX_ErrorBadParameter
;
706 if (pOMXComponent
->pComponentPrivate
== NULL
) {
707 ret
= OMX_ErrorBadParameter
;
710 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
711 pExynosPort
= &(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
]);
713 if (pExynosPort
->bufferProcessType
& BUFFER_COPY
) {
714 pDataBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
715 } else if (pExynosPort
->bufferProcessType
& BUFFER_SHARE
) {
716 pDataBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.outputDataBuffer
);
719 if (pDataBuffer
!= NULL
)
720 pBufferHdr
= pDataBuffer
->bufferHeader
;
722 if (pBufferHdr
!= NULL
) {
723 if (pExynosPort
->markType
.hMarkTargetComponent
!= NULL
) {
724 pBufferHdr
->hMarkTargetComponent
= pExynosPort
->markType
.hMarkTargetComponent
;
725 pBufferHdr
->pMarkData
= pExynosPort
->markType
.pMarkData
;
726 pExynosPort
->markType
.hMarkTargetComponent
= NULL
;
727 pExynosPort
->markType
.pMarkData
= NULL
;
730 if (pBufferHdr
->hMarkTargetComponent
!= NULL
) {
731 if (pBufferHdr
->hMarkTargetComponent
== pOMXComponent
) {
732 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
733 pExynosComponent
->callbackData
,
735 0, 0, pBufferHdr
->pMarkData
);
737 pExynosComponent
->propagateMarkType
.hMarkTargetComponent
= pBufferHdr
->hMarkTargetComponent
;
738 pExynosComponent
->propagateMarkType
.pMarkData
= pBufferHdr
->pMarkData
;
742 pBufferHdr
->nFilledLen
= 0;
743 pBufferHdr
->nOffset
= 0;
744 Exynos_OMX_InputBufferReturn(pOMXComponent
, pBufferHdr
);
747 /* reset dataBuffer */
748 Exynos_ResetDataBuffer(pDataBuffer
);
756 OMX_ERRORTYPE
Exynos_FlushInputBufferReturn(
757 OMX_COMPONENTTYPE
*pOMXComponent
,
758 EXYNOS_OMX_DATABUFFER
*pDataBuffer
)
760 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
761 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
762 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
763 OMX_BUFFERHEADERTYPE
*pBufferHdr
= NULL
;
767 if (pOMXComponent
== NULL
) {
768 ret
= OMX_ErrorBadParameter
;
772 if (pOMXComponent
->pComponentPrivate
== NULL
) {
773 ret
= OMX_ErrorBadParameter
;
776 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
777 pExynosPort
= &(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
]);
779 pBufferHdr
= pDataBuffer
->bufferHeader
;
781 if (pBufferHdr
!= NULL
) {
782 if (pExynosPort
->markType
.hMarkTargetComponent
!= NULL
) {
783 pBufferHdr
->hMarkTargetComponent
= pExynosPort
->markType
.hMarkTargetComponent
;
784 pBufferHdr
->pMarkData
= pExynosPort
->markType
.pMarkData
;
785 pExynosPort
->markType
.hMarkTargetComponent
= NULL
;
786 pExynosPort
->markType
.pMarkData
= NULL
;
789 if (pBufferHdr
->hMarkTargetComponent
!= NULL
) {
790 if (pBufferHdr
->hMarkTargetComponent
== pOMXComponent
) {
791 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
792 pExynosComponent
->callbackData
,
794 0, 0, pBufferHdr
->pMarkData
);
796 pExynosComponent
->propagateMarkType
.hMarkTargetComponent
= pBufferHdr
->hMarkTargetComponent
;
797 pExynosComponent
->propagateMarkType
.pMarkData
= pBufferHdr
->pMarkData
;
801 pBufferHdr
->nFilledLen
= 0;
802 pBufferHdr
->nOffset
= 0;
803 Exynos_OMX_InputBufferReturn(pOMXComponent
, pBufferHdr
);
806 /* reset dataBuffer */
807 Exynos_ResetDataBuffer(pDataBuffer
);
815 OMX_ERRORTYPE
Exynos_InputBufferGetQueue(
816 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
818 OMX_ERRORTYPE ret
= OMX_ErrorUndefined
;
819 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
820 EXYNOS_OMX_MESSAGE
*pMessage
= NULL
;
821 EXYNOS_OMX_DATABUFFER
*pDataBuffer
= NULL
;
825 if (pExynosComponent
== NULL
) {
826 ret
= OMX_ErrorBadParameter
;
829 pExynosPort
= &(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
]);
830 pDataBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
832 if (pExynosComponent
->currentState
!= OMX_StateExecuting
) {
833 ret
= OMX_ErrorUndefined
;
835 } else if ((pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
836 (!CHECK_PORT_BEING_FLUSHED(pExynosPort
))) {
837 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
838 if (pDataBuffer
->dataValid
!= OMX_TRUE
) {
839 pMessage
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
840 if (pMessage
== NULL
) {
841 ret
= OMX_ErrorUndefined
;
844 if (pMessage
->messageType
== EXYNOS_OMX_CommandFakeBuffer
) {
845 Exynos_OSAL_Free(pMessage
);
846 ret
= OMX_ErrorCodecFlush
;
850 pDataBuffer
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)(pMessage
->pCmdData
);
851 pDataBuffer
->allocSize
= pDataBuffer
->bufferHeader
->nAllocLen
;
852 pDataBuffer
->dataLen
= pDataBuffer
->bufferHeader
->nFilledLen
;
853 pDataBuffer
->remainDataLen
= pDataBuffer
->dataLen
;
854 pDataBuffer
->usedDataLen
= 0;
855 pDataBuffer
->dataValid
= OMX_TRUE
;
856 pDataBuffer
->nFlags
= pDataBuffer
->bufferHeader
->nFlags
;
857 pDataBuffer
->timeStamp
= pDataBuffer
->bufferHeader
->nTimeStamp
;
859 Exynos_OSAL_Free(pMessage
);
861 if (pDataBuffer
->allocSize
<= pDataBuffer
->dataLen
)
862 Exynos_OSAL_Log(EXYNOS_LOG_WARNING
, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", pDataBuffer
->allocSize
, pDataBuffer
->dataLen
);
872 OMX_ERRORTYPE
Exynos_OutputBufferReturn(
873 OMX_COMPONENTTYPE
*pOMXComponent
)
875 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
876 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
877 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
878 EXYNOS_OMX_DATABUFFER
*pDataBuffer
= NULL
;
879 OMX_BUFFERHEADERTYPE
*pBufferHdr
= NULL
;
883 if (pOMXComponent
== NULL
) {
884 ret
= OMX_ErrorBadParameter
;
888 if (pOMXComponent
->pComponentPrivate
== NULL
) {
889 ret
= OMX_ErrorBadParameter
;
892 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
893 pExynosPort
= &(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
]);
895 pDataBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.outputDataBuffer
);
896 pBufferHdr
= pDataBuffer
->bufferHeader
;
898 if (pBufferHdr
!= NULL
) {
899 pBufferHdr
->nFilledLen
= pDataBuffer
->remainDataLen
;
900 pBufferHdr
->nOffset
= 0;
901 pBufferHdr
->nFlags
= pDataBuffer
->nFlags
;
902 pBufferHdr
->nTimeStamp
= pDataBuffer
->timeStamp
;
904 if (pExynosComponent
->propagateMarkType
.hMarkTargetComponent
!= NULL
) {
905 pBufferHdr
->hMarkTargetComponent
= pExynosComponent
->propagateMarkType
.hMarkTargetComponent
;
906 pBufferHdr
->pMarkData
= pExynosComponent
->propagateMarkType
.pMarkData
;
907 pExynosComponent
->propagateMarkType
.hMarkTargetComponent
= NULL
;
908 pExynosComponent
->propagateMarkType
.pMarkData
= NULL
;
911 if ((pBufferHdr
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) {
912 pBufferHdr
->nFilledLen
= 0;
913 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "event OMX_BUFFERFLAG_EOS!!!");
914 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
915 pExynosComponent
->callbackData
,
918 pBufferHdr
->nFlags
, NULL
);
921 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pBufferHdr
);
924 /* reset dataBuffer */
925 Exynos_ResetDataBuffer(pDataBuffer
);
933 OMX_ERRORTYPE
Exynos_FlushOutputBufferReturn(
934 OMX_COMPONENTTYPE
*pOMXComponent
,
935 EXYNOS_OMX_DATABUFFER
*pDataBuffer
)
937 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
938 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
939 OMX_BUFFERHEADERTYPE
*pBufferHdr
= NULL
;
943 if (pOMXComponent
== NULL
) {
944 ret
= OMX_ErrorBadParameter
;
948 if (pOMXComponent
->pComponentPrivate
== NULL
) {
949 ret
= OMX_ErrorBadParameter
;
952 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
953 pBufferHdr
= pDataBuffer
->bufferHeader
;
955 if (pBufferHdr
!= NULL
) {
956 pBufferHdr
->nFilledLen
= pDataBuffer
->remainDataLen
;
957 pBufferHdr
->nOffset
= 0;
958 pBufferHdr
->nFlags
= pDataBuffer
->nFlags
;
959 pBufferHdr
->nTimeStamp
= pDataBuffer
->timeStamp
;
961 if (pExynosComponent
->propagateMarkType
.hMarkTargetComponent
!= NULL
) {
962 pBufferHdr
->hMarkTargetComponent
= pExynosComponent
->propagateMarkType
.hMarkTargetComponent
;
963 pBufferHdr
->pMarkData
= pExynosComponent
->propagateMarkType
.pMarkData
;
964 pExynosComponent
->propagateMarkType
.hMarkTargetComponent
= NULL
;
965 pExynosComponent
->propagateMarkType
.pMarkData
= NULL
;
968 if ((pBufferHdr
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) {
969 pBufferHdr
->nFilledLen
= 0;
970 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "event OMX_BUFFERFLAG_EOS!!!");
971 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
972 pExynosComponent
->callbackData
,
975 pBufferHdr
->nFlags
, NULL
);
977 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pBufferHdr
);
980 /* reset dataBuffer */
981 Exynos_ResetDataBuffer(pDataBuffer
);
989 OMX_ERRORTYPE
Exynos_OutputBufferGetQueue(
990 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
992 OMX_ERRORTYPE ret
= OMX_ErrorUndefined
;
993 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
994 EXYNOS_OMX_MESSAGE
*pMessage
= NULL
;
995 EXYNOS_OMX_DATABUFFER
*pDataBuffer
= NULL
;
999 if (pExynosComponent
== NULL
) {
1000 ret
= OMX_ErrorBadParameter
;
1003 pExynosPort
= &(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
]);
1005 if (pExynosPort
->bufferProcessType
& BUFFER_COPY
) {
1006 pDataBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.outputDataBuffer
);
1007 } else if (pExynosPort
->bufferProcessType
& BUFFER_SHARE
) {
1008 pDataBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
1011 if (pExynosComponent
->currentState
!= OMX_StateExecuting
) {
1012 ret
= OMX_ErrorUndefined
;
1014 } else if ((pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
1015 (!CHECK_PORT_BEING_FLUSHED(pExynosPort
))) {
1016 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
1017 if ((pDataBuffer
!= NULL
) &&
1018 (pDataBuffer
->dataValid
!= OMX_TRUE
)) {
1019 pMessage
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
1020 if (pMessage
== NULL
) {
1021 ret
= OMX_ErrorUndefined
;
1024 if (pMessage
->messageType
== EXYNOS_OMX_CommandFakeBuffer
) {
1025 Exynos_OSAL_Free(pMessage
);
1026 ret
= OMX_ErrorCodecFlush
;
1030 pDataBuffer
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)(pMessage
->pCmdData
);
1031 pDataBuffer
->allocSize
= pDataBuffer
->bufferHeader
->nAllocLen
;
1032 pDataBuffer
->dataLen
= 0; //dataBuffer->bufferHeader->nFilledLen;
1033 pDataBuffer
->remainDataLen
= pDataBuffer
->dataLen
;
1034 pDataBuffer
->usedDataLen
= 0; //dataBuffer->bufferHeader->nOffset;
1035 pDataBuffer
->dataValid
= OMX_TRUE
;
1036 /* pDataBuffer->nFlags = pDataBuffer->bufferHeader->nFlags; */
1037 /* pDtaBuffer->nTimeStamp = pDataBuffer->bufferHeader->nTimeStamp; */
1039 if (pExynosPort->bufferProcessType & BUFFER_SHARE)
1040 pDataBuffer->pPrivate = pDataBuffer->bufferHeader->pOutputPortPrivate;
1041 else if (pExynosPort->bufferProcessType & BUFFER_COPY) {
1042 pExynosPort->processData.dataBuffer = pDataBuffer->bufferHeader->pBuffer;
1043 pExynosPort->processData.allocSize = pDataBuffer->bufferHeader->nAllocLen;
1046 Exynos_OSAL_Free(pMessage
);
1048 ret
= OMX_ErrorNone
;
1056 OMX_BUFFERHEADERTYPE
*Exynos_OutputBufferGetQueue_Direct(
1057 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
1059 OMX_BUFFERHEADERTYPE
*pBufferHdr
= NULL
;
1060 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1061 EXYNOS_OMX_MESSAGE
*pMessage
= NULL
;
1065 if (pExynosComponent
== NULL
) {
1069 pExynosPort
= &(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
]);
1071 if (pExynosComponent
->currentState
!= OMX_StateExecuting
) {
1074 } else if ((pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
1075 (!CHECK_PORT_BEING_FLUSHED(pExynosPort
))) {
1076 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
1078 pMessage
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
1079 if (pMessage
== NULL
) {
1083 if (pMessage
->messageType
== EXYNOS_OMX_CommandFakeBuffer
) {
1084 Exynos_OSAL_Free(pMessage
);
1089 pBufferHdr
= (OMX_BUFFERHEADERTYPE
*)(pMessage
->pCmdData
);
1090 Exynos_OSAL_Free(pMessage
);
1099 OMX_ERRORTYPE
Exynos_CodecBufferEnqueue(
1100 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
,
1104 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1105 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1109 if (pExynosComponent
== NULL
) {
1110 ret
= OMX_ErrorBadParameter
;
1114 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1115 ret
= OMX_ErrorBadPortIndex
;
1118 pExynosPort
= &(pExynosComponent
->pExynosPort
[nPortIndex
]);
1120 if (pData
== NULL
) {
1121 ret
= OMX_ErrorInsufficientResources
;
1125 ret
= Exynos_OSAL_Queue(&pExynosPort
->codecBufferQ
, (void *)pData
);
1127 ret
= OMX_ErrorUndefined
;
1130 Exynos_OSAL_SemaphorePost(pExynosPort
->codecSemID
);
1132 ret
= OMX_ErrorNone
;
1140 OMX_ERRORTYPE
Exynos_CodecBufferDequeue(
1141 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
,
1145 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1146 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1147 OMX_PTR pTempData
= NULL
;
1151 if (pExynosComponent
== NULL
) {
1152 ret
= OMX_ErrorBadParameter
;
1156 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1157 ret
= OMX_ErrorBadPortIndex
;
1160 pExynosPort
= &(pExynosComponent
->pExynosPort
[nPortIndex
]);
1162 Exynos_OSAL_SemaphoreWait(pExynosPort
->codecSemID
);
1163 pTempData
= (OMX_PTR
)Exynos_OSAL_Dequeue(&pExynosPort
->codecBufferQ
);
1164 if (pTempData
!= NULL
) {
1165 *pData
= (OMX_PTR
)pTempData
;
1166 ret
= OMX_ErrorNone
;
1169 ret
= OMX_ErrorUndefined
;
1178 OMX_ERRORTYPE
Exynos_CodecBufferReset(
1179 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
,
1182 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1183 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1187 if (pExynosComponent
== NULL
) {
1188 ret
= OMX_ErrorBadParameter
;
1192 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1193 ret
= OMX_ErrorBadPortIndex
;
1196 pExynosPort
= &(pExynosComponent
->pExynosPort
[nPortIndex
]);
1198 ret
= Exynos_OSAL_ResetQueue(&pExynosPort
->codecBufferQ
);
1200 ret
= OMX_ErrorUndefined
;
1206 Exynos_OSAL_Get_SemaphoreCount(pExynosPort
->codecSemID
, &cnt
);
1208 Exynos_OSAL_SemaphoreWait(pExynosPort
->codecSemID
);
1212 ret
= OMX_ErrorNone
;
1220 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeGetParameter(
1221 OMX_IN OMX_HANDLETYPE hComponent
,
1222 OMX_IN OMX_INDEXTYPE nParamIndex
,
1223 OMX_INOUT OMX_PTR pComponentParameterStructure
)
1225 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1226 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1227 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1228 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1232 if (hComponent
== NULL
) {
1233 ret
= OMX_ErrorBadParameter
;
1236 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1238 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1239 if (ret
!= OMX_ErrorNone
) {
1243 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1244 ret
= OMX_ErrorBadParameter
;
1247 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1249 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1250 ret
= OMX_ErrorInvalidState
;
1254 if (pComponentParameterStructure
== NULL
) {
1255 ret
= OMX_ErrorBadParameter
;
1259 switch (nParamIndex
) {
1260 case OMX_IndexParamVideoInit
:
1262 OMX_PORT_PARAM_TYPE
*pPortParam
= (OMX_PORT_PARAM_TYPE
*)pComponentParameterStructure
;
1263 ret
= Exynos_OMX_Check_SizeVersion(pPortParam
, sizeof(OMX_PORT_PARAM_TYPE
));
1264 if (ret
!= OMX_ErrorNone
) {
1268 pPortParam
->nPorts
= pExynosComponent
->portParam
.nPorts
;
1269 pPortParam
->nStartPortNumber
= pExynosComponent
->portParam
.nStartPortNumber
;
1270 ret
= OMX_ErrorNone
;
1273 case OMX_IndexParamVideoPortFormat
:
1275 OMX_VIDEO_PARAM_PORTFORMATTYPE
*pPortFormat
= (OMX_VIDEO_PARAM_PORTFORMATTYPE
*)pComponentParameterStructure
;
1276 OMX_U32 nPortIndex
= pPortFormat
->nPortIndex
;
1277 OMX_U32 nIndex
= pPortFormat
->nIndex
;
1278 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1279 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= NULL
;
1280 OMX_U32 nSupportFormat
= 0;
1282 ret
= Exynos_OMX_Check_SizeVersion(pPortFormat
, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE
));
1283 if (ret
!= OMX_ErrorNone
) {
1287 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1288 ret
= OMX_ErrorBadPortIndex
;
1292 if (nPortIndex
== INPUT_PORT_INDEX
) {
1293 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1294 pPortDef
= &pExynosPort
->portDefinition
;
1297 case supportFormat_0
:
1298 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1299 pPortFormat
->eColorFormat
= OMX_COLOR_FormatYUV420Planar
;
1300 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1302 case supportFormat_1
:
1303 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1304 pPortFormat
->eColorFormat
= OMX_COLOR_FormatYUV420SemiPlanar
;
1305 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1307 case supportFormat_2
:
1308 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1309 pPortFormat
->eColorFormat
= OMX_SEC_COLOR_FormatNV12Tiled
;
1310 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1312 case supportFormat_3
:
1313 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1314 pPortFormat
->eColorFormat
= OMX_SEC_COLOR_FormatNV21Linear
;
1315 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1317 case supportFormat_4
:
1318 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1319 pPortFormat
->eColorFormat
= OMX_COLOR_FormatAndroidOpaque
;
1320 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1323 if (nIndex
> supportFormat_0
) {
1324 ret
= OMX_ErrorNoMore
;
1329 } else if (nPortIndex
== OUTPUT_PORT_INDEX
) {
1330 nSupportFormat
= OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX
- 1;
1331 if (nIndex
> nSupportFormat
) {
1332 ret
= OMX_ErrorNoMore
;
1336 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1337 pPortDef
= &pExynosPort
->portDefinition
;
1339 pPortFormat
->eCompressionFormat
= pPortDef
->format
.video
.eCompressionFormat
;
1340 pPortFormat
->eColorFormat
= pPortDef
->format
.video
.eColorFormat
;
1341 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1343 ret
= OMX_ErrorNone
;
1346 case OMX_IndexParamVideoBitrate
:
1348 OMX_VIDEO_PARAM_BITRATETYPE
*pVideoBitrate
= (OMX_VIDEO_PARAM_BITRATETYPE
*)pComponentParameterStructure
;
1349 OMX_U32 nPortIndex
= pVideoBitrate
->nPortIndex
;
1350 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1351 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1352 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= NULL
;
1354 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1355 ret
= OMX_ErrorBadPortIndex
;
1358 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1359 if (pVideoEnc
== NULL
) {
1360 ret
= OMX_ErrorBadParameter
;
1363 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1364 pPortDef
= &pExynosPort
->portDefinition
;
1366 pVideoBitrate
->eControlRate
= pVideoEnc
->eControlRate
[nPortIndex
];
1367 pVideoBitrate
->nTargetBitrate
= pPortDef
->format
.video
.nBitrate
;
1369 ret
= OMX_ErrorNone
;
1372 case OMX_IndexParamVideoQuantization
:
1374 OMX_VIDEO_PARAM_QUANTIZATIONTYPE
*pVideoQuantization
= (OMX_VIDEO_PARAM_QUANTIZATIONTYPE
*)pComponentParameterStructure
;
1375 OMX_U32 nPortIndex
= pVideoQuantization
->nPortIndex
;
1376 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1377 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1378 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= NULL
;
1380 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1381 ret
= OMX_ErrorBadPortIndex
;
1384 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1385 if (pVideoEnc
== NULL
) {
1386 ret
= OMX_ErrorBadParameter
;
1389 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1390 pPortDef
= &pExynosPort
->portDefinition
;
1392 pVideoQuantization
->nQpI
= pVideoEnc
->quantization
.nQpI
;
1393 pVideoQuantization
->nQpP
= pVideoEnc
->quantization
.nQpP
;
1394 pVideoQuantization
->nQpB
= pVideoEnc
->quantization
.nQpB
;
1396 ret
= OMX_ErrorNone
;
1399 case OMX_IndexParamPortDefinition
:
1401 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= (OMX_PARAM_PORTDEFINITIONTYPE
*)pComponentParameterStructure
;
1402 OMX_U32 nPortIndex
= pPortDef
->nPortIndex
;
1403 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1405 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1406 ret
= OMX_ErrorBadPortIndex
;
1410 ret
= Exynos_OMX_Check_SizeVersion(pPortDef
, sizeof(OMX_PARAM_PORTDEFINITIONTYPE
));
1411 if (ret
!= OMX_ErrorNone
) {
1415 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1416 Exynos_OSAL_Memcpy(pPortDef
, &pExynosPort
->portDefinition
, pPortDef
->nSize
);
1418 #ifdef USE_STOREMETADATA
1419 if ((nPortIndex
== 0) &&
1420 (pExynosPort
->bStoreMetaData
== OMX_TRUE
)) {
1421 pPortDef
->nBufferSize
= MAX_INPUT_METADATA_BUFFER_SIZE
;
1426 case OMX_IndexVendorNeedContigMemory
:
1428 EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
*pPortMemType
= (EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
*)pComponentParameterStructure
;
1429 OMX_U32 nPortIndex
= pPortMemType
->nPortIndex
;
1430 EXYNOS_OMX_BASEPORT
*pExynosPort
;
1432 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1433 ret
= OMX_ErrorBadPortIndex
;
1437 ret
= Exynos_OMX_Check_SizeVersion(pPortMemType
, sizeof(EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
));
1438 if (ret
!= OMX_ErrorNone
)
1441 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1443 pPortMemType
->bNeedContigMem
= pExynosPort
->bNeedContigMem
;
1448 ret
= Exynos_OMX_GetParameter(hComponent
, nParamIndex
, pComponentParameterStructure
);
1458 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeSetParameter(
1459 OMX_IN OMX_HANDLETYPE hComponent
,
1460 OMX_IN OMX_INDEXTYPE nParamIndex
,
1461 OMX_IN OMX_PTR pComponentParameterStructure
)
1463 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1464 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1465 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1466 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1470 if (hComponent
== NULL
) {
1471 ret
= OMX_ErrorBadParameter
;
1474 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1476 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1477 if (ret
!= OMX_ErrorNone
) {
1481 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1482 ret
= OMX_ErrorBadParameter
;
1485 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1487 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1488 ret
= OMX_ErrorInvalidState
;
1492 if (pComponentParameterStructure
== NULL
) {
1493 ret
= OMX_ErrorBadParameter
;
1497 switch (nParamIndex
) {
1498 case OMX_IndexParamVideoPortFormat
:
1500 OMX_VIDEO_PARAM_PORTFORMATTYPE
*pPortFormat
= (OMX_VIDEO_PARAM_PORTFORMATTYPE
*)pComponentParameterStructure
;
1501 OMX_U32 nPortIndex
= pPortFormat
->nPortIndex
;
1502 OMX_U32 nIndex
= pPortFormat
->nIndex
;
1503 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= NULL
;
1504 OMX_U32 nSupportFormat
= 0;
1506 ret
= Exynos_OMX_Check_SizeVersion(pPortFormat
, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE
));
1507 if (ret
!= OMX_ErrorNone
) {
1511 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1512 ret
= OMX_ErrorBadPortIndex
;
1515 pPortDef
= &(pExynosComponent
->pExynosPort
[nPortIndex
].portDefinition
);
1517 pPortDef
->format
.video
.eColorFormat
= pPortFormat
->eColorFormat
;
1518 pPortDef
->format
.video
.eCompressionFormat
= pPortFormat
->eCompressionFormat
;
1519 pPortDef
->format
.video
.xFramerate
= pPortFormat
->xFramerate
;
1522 case OMX_IndexParamVideoBitrate
:
1524 OMX_VIDEO_PARAM_BITRATETYPE
*pVideoBitrate
= (OMX_VIDEO_PARAM_BITRATETYPE
*)pComponentParameterStructure
;
1525 OMX_U32 nPortIndex
= pVideoBitrate
->nPortIndex
;
1526 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1527 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1528 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= NULL
;
1530 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1531 ret
= OMX_ErrorBadPortIndex
;
1534 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1535 if (pVideoEnc
== NULL
) {
1536 ret
= OMX_ErrorBadParameter
;
1539 pPortDef
= &(pExynosComponent
->pExynosPort
[nPortIndex
].portDefinition
);
1541 pVideoEnc
->eControlRate
[nPortIndex
] = pVideoBitrate
->eControlRate
;
1542 pPortDef
->format
.video
.nBitrate
= pVideoBitrate
->nTargetBitrate
;
1544 ret
= OMX_ErrorNone
;
1547 case OMX_IndexParamVideoQuantization
:
1549 OMX_VIDEO_PARAM_QUANTIZATIONTYPE
*pVideoQuantization
= (OMX_VIDEO_PARAM_QUANTIZATIONTYPE
*)pComponentParameterStructure
;
1550 OMX_U32 nPortIndex
= pVideoQuantization
->nPortIndex
;
1551 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1552 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1553 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= NULL
;
1555 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1556 ret
= OMX_ErrorBadPortIndex
;
1559 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1560 if (pVideoEnc
== NULL
) {
1561 ret
= OMX_ErrorBadParameter
;
1564 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1565 pPortDef
= &pExynosPort
->portDefinition
;
1567 pVideoEnc
->quantization
.nQpI
= pVideoQuantization
->nQpI
;
1568 pVideoEnc
->quantization
.nQpP
= pVideoQuantization
->nQpP
;
1569 pVideoEnc
->quantization
.nQpB
= pVideoQuantization
->nQpB
;
1571 ret
= OMX_ErrorNone
;
1574 case OMX_IndexParamPortDefinition
:
1576 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= (OMX_PARAM_PORTDEFINITIONTYPE
*)pComponentParameterStructure
;
1577 OMX_U32 nPortIndex
= pPortDef
->nPortIndex
;
1578 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1579 OMX_U32 width
, height
, size
;
1581 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1582 ret
= OMX_ErrorBadPortIndex
;
1586 ret
= Exynos_OMX_Check_SizeVersion(pPortDef
, sizeof(OMX_PARAM_PORTDEFINITIONTYPE
));
1587 if (ret
!= OMX_ErrorNone
) {
1591 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1593 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) &&
1594 (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
1595 if (pExynosPort
->portDefinition
.bEnabled
== OMX_TRUE
) {
1596 ret
= OMX_ErrorIncorrectStateOperation
;
1601 if (pPortDef
->nBufferCountActual
< pExynosPort
->portDefinition
.nBufferCountMin
) {
1602 ret
= OMX_ErrorBadParameter
;
1606 Exynos_OSAL_Memcpy(&pExynosPort
->portDefinition
, pPortDef
, pPortDef
->nSize
);
1607 if (nPortIndex
== INPUT_PORT_INDEX
) {
1608 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1609 Exynos_UpdateFrameSize(pOMXComponent
);
1610 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pExynosOutputPort->portDefinition.nBufferSize: %d",
1611 pExynosPort
->portDefinition
.nBufferSize
);
1613 ret
= OMX_ErrorNone
;
1616 #ifdef USE_STOREMETADATA
1617 case OMX_IndexParamStoreMetaDataBuffer
:
1619 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1620 if (pVideoEnc
== NULL
) {
1621 ret
= OMX_ErrorBadParameter
;
1625 ret
= Exynos_OSAL_SetANBParameter(hComponent
, nParamIndex
, pComponentParameterStructure
);
1626 if (ret
== OMX_ErrorNone
)
1627 pVideoEnc
->bFirstInput
= OMX_TRUE
;
1631 case OMX_IndexVendorNeedContigMemory
:
1633 EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
*pPortMemType
= (EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
*)pComponentParameterStructure
;
1634 OMX_U32 nPortIndex
= pPortMemType
->nPortIndex
;
1635 EXYNOS_OMX_BASEPORT
*pExynosPort
;
1637 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1638 ret
= OMX_ErrorBadPortIndex
;
1642 ret
= Exynos_OMX_Check_SizeVersion(pPortMemType
, sizeof(EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
));
1643 if (ret
!= OMX_ErrorNone
)
1646 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1648 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) && (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
1649 if (pExynosPort
->portDefinition
.bEnabled
== OMX_TRUE
) {
1650 ret
= OMX_ErrorIncorrectStateOperation
;
1655 pExynosPort
->bNeedContigMem
= pPortMemType
->bNeedContigMem
;
1660 ret
= Exynos_OMX_SetParameter(hComponent
, nParamIndex
, pComponentParameterStructure
);
1670 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeGetConfig(
1671 OMX_HANDLETYPE hComponent
,
1672 OMX_INDEXTYPE nParamIndex
,
1673 OMX_PTR pComponentConfigStructure
)
1675 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1676 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1677 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1681 if ((hComponent
== NULL
) ||
1682 (pComponentConfigStructure
== NULL
)) {
1683 ret
= OMX_ErrorBadParameter
;
1686 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1688 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1689 if (ret
!= OMX_ErrorNone
) {
1693 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1694 ret
= OMX_ErrorBadParameter
;
1697 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1699 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1700 ret
= OMX_ErrorInvalidState
;
1704 switch (nParamIndex
) {
1705 case OMX_IndexConfigVideoBitrate
:
1707 OMX_VIDEO_CONFIG_BITRATETYPE
*pConfigBitrate
= (OMX_VIDEO_CONFIG_BITRATETYPE
*)pComponentConfigStructure
;
1708 OMX_U32 nPortIndex
= pConfigBitrate
->nPortIndex
;
1709 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1711 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1712 ret
= OMX_ErrorBadPortIndex
;
1715 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1716 pConfigBitrate
->nEncodeBitrate
= pExynosPort
->portDefinition
.format
.video
.nBitrate
;
1720 case OMX_IndexConfigVideoFramerate
:
1722 OMX_CONFIG_FRAMERATETYPE
*pConfigFramerate
= (OMX_CONFIG_FRAMERATETYPE
*)pComponentConfigStructure
;
1723 OMX_U32 nPortIndex
= pConfigFramerate
->nPortIndex
;
1724 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1726 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1727 ret
= OMX_ErrorBadPortIndex
;
1730 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1731 pConfigFramerate
->xEncodeFramerate
= pExynosPort
->portDefinition
.format
.video
.xFramerate
;
1735 case OMX_IndexVendorGetBufferFD
:
1737 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1738 EXYNOS_OMX_VIDEO_CONFIG_BUFFERINFO
*pBufferInfo
= (EXYNOS_OMX_VIDEO_CONFIG_BUFFERINFO
*)pComponentConfigStructure
;
1740 ret
= Exynos_OMX_Check_SizeVersion(pBufferInfo
, sizeof(EXYNOS_OMX_VIDEO_CONFIG_BUFFERINFO
));
1741 if (ret
!= OMX_ErrorNone
)
1744 pBufferInfo
->fd
= Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc
->hSharedMemory
, pBufferInfo
->pVirAddr
);
1749 ret
= Exynos_OMX_GetConfig(hComponent
, nParamIndex
, pComponentConfigStructure
);
1759 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeSetConfig(
1760 OMX_HANDLETYPE hComponent
,
1761 OMX_INDEXTYPE nParamIndex
,
1762 OMX_PTR pComponentConfigStructure
)
1764 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1765 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1766 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1770 if ((hComponent
== NULL
) ||
1771 (pComponentConfigStructure
== NULL
)) {
1772 ret
= OMX_ErrorBadParameter
;
1775 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1777 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1778 if (ret
!= OMX_ErrorNone
) {
1782 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1783 ret
= OMX_ErrorBadParameter
;
1786 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1788 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1789 ret
= OMX_ErrorInvalidState
;
1793 switch (nParamIndex
) {
1794 case OMX_IndexConfigVideoBitrate
:
1796 OMX_VIDEO_CONFIG_BITRATETYPE
*pConfigBitrate
= (OMX_VIDEO_CONFIG_BITRATETYPE
*)pComponentConfigStructure
;
1797 OMX_U32 nPortIndex
= pConfigBitrate
->nPortIndex
;
1798 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1800 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1801 ret
= OMX_ErrorBadPortIndex
;
1804 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1805 pExynosPort
->portDefinition
.format
.video
.nBitrate
= pConfigBitrate
->nEncodeBitrate
;
1809 case OMX_IndexConfigVideoFramerate
:
1811 OMX_CONFIG_FRAMERATETYPE
*pConfigFramerate
= (OMX_CONFIG_FRAMERATETYPE
*)pComponentConfigStructure
;
1812 OMX_U32 nPortIndex
= pConfigFramerate
->nPortIndex
;
1813 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1815 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1816 ret
= OMX_ErrorBadPortIndex
;
1819 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1820 pExynosPort
->portDefinition
.format
.video
.xFramerate
= pConfigFramerate
->xEncodeFramerate
;
1824 case OMX_IndexConfigVideoIntraVOPRefresh
:
1826 OMX_CONFIG_INTRAREFRESHVOPTYPE
*pIntraRefreshVOP
= (OMX_CONFIG_INTRAREFRESHVOPTYPE
*)pComponentConfigStructure
;
1827 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1828 OMX_U32 nPortIndex
= pIntraRefreshVOP
->nPortIndex
;
1830 if (pExynosComponent
->hComponentHandle
== NULL
) {
1831 ret
= OMX_ErrorBadParameter
;
1834 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1836 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1837 ret
= OMX_ErrorBadPortIndex
;
1840 pVideoEnc
->IntraRefreshVOP
= pIntraRefreshVOP
->IntraRefreshVOP
;
1846 ret
= Exynos_OMX_SetConfig(hComponent
, nParamIndex
, pComponentConfigStructure
);
1856 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeGetExtensionIndex(
1857 OMX_IN OMX_HANDLETYPE hComponent
,
1858 OMX_IN OMX_STRING szParamName
,
1859 OMX_OUT OMX_INDEXTYPE
*pIndexType
)
1861 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1862 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1863 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1867 if (hComponent
== NULL
) {
1868 ret
= OMX_ErrorBadParameter
;
1871 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1873 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1874 if (ret
!= OMX_ErrorNone
) {
1878 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1879 ret
= OMX_ErrorBadParameter
;
1882 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1884 if ((szParamName
== NULL
) || (pIndexType
== NULL
)) {
1885 ret
= OMX_ErrorBadParameter
;
1889 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1890 ret
= OMX_ErrorInvalidState
;
1894 if (Exynos_OSAL_Strcmp(szParamName
, EXYNOS_INDEX_PARAM_NEED_CONTIG_MEMORY
) == 0) {
1895 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexVendorNeedContigMemory
;
1896 ret
= OMX_ErrorNone
;
1898 } else if (Exynos_OSAL_Strcmp(szParamName
, EXYNOS_INDEX_CONFIG_GET_BUFFER_FD
) == 0) {
1899 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexVendorGetBufferFD
;
1900 ret
= OMX_ErrorNone
;
1904 #ifdef USE_STOREMETADATA
1905 if (Exynos_OSAL_Strcmp(szParamName
, EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER
) == 0) {
1906 *pIndexType
= (OMX_INDEXTYPE
)OMX_IndexParamStoreMetaDataBuffer
;
1908 ret
= Exynos_OMX_GetExtensionIndex(hComponent
, szParamName
, pIndexType
);
1911 ret
= Exynos_OMX_GetExtensionIndex(hComponent
, szParamName
, pIndexType
);
1919 OMX_ERRORTYPE
Exynos_Shared_DataToBuffer(EXYNOS_OMX_DATA
*pData
, EXYNOS_OMX_DATABUFFER
*pUseBuffer
, OMX_BOOL bNeedUnlock
)
1921 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1923 pUseBuffer
->bufferHeader
= pData
->bufferHeader
;
1924 pUseBuffer
->allocSize
= pData
->allocSize
;
1925 pUseBuffer
->dataLen
= pData
->dataLen
;
1926 pUseBuffer
->usedDataLen
= pData
->usedDataLen
;
1927 pUseBuffer
->remainDataLen
= pData
->remainDataLen
;
1928 pUseBuffer
->timeStamp
= pData
->timeStamp
;
1929 pUseBuffer
->nFlags
= pData
->nFlags
;
1930 pUseBuffer
->pPrivate
= pData
->pPrivate
;
1932 if ((bNeedUnlock
== OMX_TRUE
) && (pUseBuffer
->bufferHeader
!= NULL
)) {
1933 OMX_PTR ppBuf
[MAX_BUFFER_PLANE
];
1934 Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE
)pUseBuffer
->bufferHeader
->pBuffer
, ppBuf
);
1935 Exynos_OSAL_UnlockANBHandle(ppBuf
[0]);