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 (pExynosPort
->portDefinition
.bEnabled
!= OMX_FALSE
)) {
320 (*(pExynosComponent
->pCallbacks
->EventHandler
)) (pOMXComponent
,
321 pExynosComponent
->callbackData
,
322 (OMX_U32
)OMX_EventError
,
323 (OMX_U32
)OMX_ErrorPortUnpopulated
,
325 ret
= OMX_ErrorInvalidState
;
329 for (i
= 0; i
< /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM
; i
++) {
330 if ((pExynosPort
->bufferStateAllocate
[i
] != BUFFER_STATE_FREE
) &&
331 (pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
!= NULL
)) {
332 pOMXBufferHdr
= pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
;
334 if (pOMXBufferHdr
->pBuffer
== pBufferHdr
->pBuffer
) {
335 if (pExynosPort
->bufferStateAllocate
[i
] & BUFFER_STATE_ALLOCATED
) {
336 if ((pVideoEnc
->bDRMPlayerMode
== OMX_TRUE
) &&
337 (nPortIndex
== OUTPUT_PORT_INDEX
)) {
338 OMX_PTR mapBuffer
= Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc
->hSharedMemory
, (int)pOMXBufferHdr
->pBuffer
);
339 Exynos_OSAL_SharedMemory_Free(pVideoEnc
->hSharedMemory
, mapBuffer
);
341 Exynos_OSAL_SharedMemory_Free(pVideoEnc
->hSharedMemory
, pOMXBufferHdr
->pBuffer
);
343 pOMXBufferHdr
->pBuffer
= NULL
;
344 pBufferHdr
->pBuffer
= NULL
;
345 } else if (pExynosPort
->bufferStateAllocate
[i
] & BUFFER_STATE_ASSIGNED
) {
348 pExynosPort
->assignedBufferNum
--;
350 if (pExynosPort
->bufferStateAllocate
[i
] & HEADER_STATE_ALLOCATED
) {
351 Exynos_OSAL_Free(pOMXBufferHdr
);
352 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
= NULL
;
356 pExynosPort
->bufferStateAllocate
[i
] = BUFFER_STATE_FREE
;
364 if ((ret
== OMX_ErrorNone
) &&
365 (pExynosPort
->assignedBufferNum
== 0)) {
366 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pExynosPort->unloadedResource signal set");
367 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
368 Exynos_OSAL_SemaphorePost(pExynosPort
->unloadedResource
);
369 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
370 pExynosPort
->portDefinition
.bPopulated
= OMX_FALSE
;
378 OMX_ERRORTYPE
Exynos_OMX_AllocateTunnelBuffer(
379 EXYNOS_OMX_BASEPORT
*pOMXBasePort
,
382 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
383 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
384 OMX_BUFFERHEADERTYPE
*pTempBufferHdr
= NULL
;
385 OMX_U8
*pTempBuffer
= NULL
;
386 OMX_U32 nBufferSize
= 0;
387 OMX_PARAM_PORTDEFINITIONTYPE portDefinition
;
389 ret
= OMX_ErrorTunnelingUnsupported
;
394 OMX_ERRORTYPE
Exynos_OMX_FreeTunnelBuffer(
395 EXYNOS_OMX_BASEPORT
*pOMXBasePort
,
398 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
399 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
400 OMX_BUFFERHEADERTYPE
*pTempBufferHdr
= NULL
;
401 OMX_U8
*pTempBuffer
= NULL
;
402 OMX_U32 nBufferSize
= 0;
404 ret
= OMX_ErrorTunnelingUnsupported
;
409 OMX_ERRORTYPE
Exynos_OMX_ComponentTunnelRequest(
410 OMX_IN OMX_HANDLETYPE hComp
,
411 OMX_IN OMX_U32 nPort
,
412 OMX_IN OMX_HANDLETYPE hTunneledComp
,
413 OMX_IN OMX_U32 nTunneledPort
,
414 OMX_INOUT OMX_TUNNELSETUPTYPE
*pTunnelSetup
)
416 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
418 ret
= OMX_ErrorTunnelingUnsupported
;
423 OMX_ERRORTYPE
Exynos_OMX_GetFlushBuffer(
424 EXYNOS_OMX_BASEPORT
*pExynosPort
,
425 EXYNOS_OMX_DATABUFFER
*pDataBuffer
[])
427 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
433 if (pExynosPort
->portWayType
== WAY1_PORT
) {
434 *pDataBuffer
= &pExynosPort
->way
.port1WayDataBuffer
.dataBuffer
;
435 } else if (pExynosPort
->portWayType
== WAY2_PORT
) {
436 pDataBuffer
[0] = &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
437 pDataBuffer
[1] = &(pExynosPort
->way
.port2WayDataBuffer
.outputDataBuffer
);
446 OMX_ERRORTYPE
Exynos_OMX_FlushPort(
447 OMX_COMPONENTTYPE
*pOMXComponent
,
450 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
451 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
452 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
453 OMX_BUFFERHEADERTYPE
*pBufferHdr
= NULL
;
454 EXYNOS_OMX_DATABUFFER
*pDataBuffer
[2] = {NULL
, NULL
};
455 EXYNOS_OMX_MESSAGE
*pMessage
= NULL
;
456 OMX_S32 nSemaCnt
= 0;
461 if (pOMXComponent
== NULL
) {
462 ret
= OMX_ErrorBadParameter
;
466 if (pOMXComponent
->pComponentPrivate
== NULL
) {
467 ret
= OMX_ErrorBadParameter
;
470 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
472 if ((nPortIndex
< 0) ||
473 (nPortIndex
>= pExynosComponent
->portParam
.nPorts
)) {
474 ret
= OMX_ErrorBadPortIndex
;
477 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
479 while (Exynos_OSAL_GetElemNum(&pExynosPort
->bufferQ
) > 0) {
480 Exynos_OSAL_Get_SemaphoreCount(pExynosPort
->bufferSemID
, &nSemaCnt
);
482 Exynos_OSAL_SemaphorePost(pExynosPort
->bufferSemID
);
484 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
485 pMessage
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
486 if ((pMessage
!= NULL
) &&
487 (pMessage
->messageType
!= EXYNOS_OMX_CommandFakeBuffer
)) {
488 pBufferHdr
= (OMX_BUFFERHEADERTYPE
*)pMessage
->pCmdData
;
489 pBufferHdr
->nFilledLen
= 0;
491 if (nPortIndex
== OUTPUT_PORT_INDEX
) {
492 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pBufferHdr
);
493 } else if (nPortIndex
== INPUT_PORT_INDEX
) {
494 Exynos_OMX_InputBufferReturn(pOMXComponent
, pBufferHdr
);
497 Exynos_OSAL_Free(pMessage
);
501 Exynos_OMX_GetFlushBuffer(pExynosPort
, pDataBuffer
);
502 if ((pDataBuffer
[0] != NULL
) &&
503 (pDataBuffer
[0]->dataValid
== OMX_TRUE
)) {
504 if (nPortIndex
== INPUT_PORT_INDEX
)
505 Exynos_InputBufferReturn(pOMXComponent
, pDataBuffer
[0]);
506 else if (nPortIndex
== OUTPUT_PORT_INDEX
)
507 Exynos_OutputBufferReturn(pOMXComponent
, pDataBuffer
[0]);
509 if ((pDataBuffer
[1] != NULL
) &&
510 (pDataBuffer
[1]->dataValid
== OMX_TRUE
)) {
511 if (nPortIndex
== INPUT_PORT_INDEX
)
512 Exynos_InputBufferReturn(pOMXComponent
, pDataBuffer
[1]);
513 else if (nPortIndex
== OUTPUT_PORT_INDEX
)
514 Exynos_OutputBufferReturn(pOMXComponent
, pDataBuffer
[1]);
517 if (pExynosComponent
->bMultiThreadProcess
== OMX_TRUE
) {
518 if (pExynosPort
->bufferProcessType
& BUFFER_SHARE
) {
519 if (pExynosPort
->processData
.bufferHeader
!= NULL
) {
520 if (nPortIndex
== INPUT_PORT_INDEX
) {
521 #ifdef USE_METADATABUFFERTYPE
522 if ((pExynosPort
->bStoreMetaData
== OMX_TRUE
) &&
523 (pExynosPort
->portDefinition
.format
.video
.eColorFormat
== OMX_COLOR_FormatAndroidOpaque
)) {
524 OMX_PTR ppBuf
[MAX_BUFFER_PLANE
];
526 Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE
)pExynosPort
->processData
.bufferHeader
->pBuffer
, ppBuf
))
527 Exynos_OSAL_UnlockANBHandle(ppBuf
[0]);
530 Exynos_OMX_InputBufferReturn(pOMXComponent
, pExynosPort
->processData
.bufferHeader
);
531 } else if (nPortIndex
== OUTPUT_PORT_INDEX
) {
532 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pExynosPort
->processData
.bufferHeader
);
535 Exynos_ResetCodecData(&pExynosPort
->processData
);
537 for (i
= 0; i
< pExynosPort
->portDefinition
.nBufferCountActual
; i
++) {
538 if (pExynosPort
->extendBufferHeader
[i
].bBufferInOMX
== OMX_TRUE
) {
539 if (nPortIndex
== OUTPUT_PORT_INDEX
) {
540 Exynos_OMX_OutputBufferReturn(pOMXComponent
,
541 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
);
542 } else if (nPortIndex
== INPUT_PORT_INDEX
) {
543 #ifdef USE_METADATABUFFERTYPE
544 if ((pExynosPort
->bStoreMetaData
== OMX_TRUE
) &&
545 (pExynosPort
->portDefinition
.format
.video
.eColorFormat
== OMX_COLOR_FormatAndroidOpaque
)) {
546 OMX_PTR ppBuf
[MAX_BUFFER_PLANE
];
548 Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE
)pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
, ppBuf
))
549 Exynos_OSAL_UnlockANBHandle(ppBuf
[0]);
552 Exynos_OMX_InputBufferReturn(pOMXComponent
,
553 pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
);
559 Exynos_ResetCodecData(&pExynosPort
->processData
);
562 if (pExynosPort
->bufferSemID
!= NULL
) {
565 Exynos_OSAL_Get_SemaphoreCount(pExynosPort
->bufferSemID
, &cnt
);
569 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
571 Exynos_OSAL_SemaphorePost(pExynosPort
->bufferSemID
);
572 Exynos_OSAL_SleepMillisec(0);
575 Exynos_OSAL_ResetQueue(&pExynosPort
->bufferQ
);
583 OMX_ERRORTYPE
Exynos_OMX_BufferFlush(
584 OMX_COMPONENTTYPE
*pOMXComponent
,
588 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
589 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
590 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
591 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
592 EXYNOS_OMX_DATABUFFER
*pDataBuffer
[2] = {NULL
, NULL
};
597 if (pOMXComponent
== NULL
) {
598 ret
= OMX_ErrorBadParameter
;
602 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
603 if (ret
!= OMX_ErrorNone
) {
607 if (pOMXComponent
->pComponentPrivate
== NULL
) {
608 ret
= OMX_ErrorBadParameter
;
611 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
613 if (pExynosComponent
->hComponentHandle
== NULL
) {
614 ret
= OMX_ErrorBadParameter
;
617 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
619 if ((nPortIndex
< 0) ||
620 (nPortIndex
>= pExynosComponent
->portParam
.nPorts
)) {
621 ret
= OMX_ErrorBadPortIndex
;
624 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
626 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,"OMX_CommandFlush start, port:%d", nPortIndex
);
628 pExynosPort
->bIsPortFlushed
= OMX_TRUE
;
630 if (pExynosComponent
->bMultiThreadProcess
== OMX_FALSE
) {
631 Exynos_OSAL_SignalSet(pExynosComponent
->pauseEvent
);
633 Exynos_OSAL_SignalSet(pExynosPort
->pauseEvent
);
636 Exynos_OMX_GetFlushBuffer(pExynosPort
, pDataBuffer
);
637 if (pDataBuffer
[0] == NULL
) {
638 ret
= OMX_ErrorBadParameter
;
642 if (pExynosPort
->bufferProcessType
& BUFFER_COPY
)
643 Exynos_OSAL_SemaphorePost(pExynosPort
->codecSemID
);
645 if (pExynosPort
->bufferSemID
!= NULL
) {
648 Exynos_OSAL_Get_SemaphoreCount(pExynosPort
->bufferSemID
, &cnt
);
652 Exynos_OSAL_SemaphorePost(pExynosPort
->bufferSemID
);
653 Exynos_OSAL_SleepMillisec(0);
657 pVideoEnc
->exynos_codec_bufferProcessRun(pOMXComponent
, nPortIndex
);
659 Exynos_OSAL_MutexLock(pDataBuffer
[0]->bufferMutex
);
660 pVideoEnc
->exynos_codec_stop(pOMXComponent
, nPortIndex
);
662 if (pDataBuffer
[1] != NULL
)
663 Exynos_OSAL_MutexLock(pDataBuffer
[1]->bufferMutex
);
665 ret
= Exynos_OMX_FlushPort(pOMXComponent
, nPortIndex
);
666 if (ret
!= OMX_ErrorNone
)
669 if (pExynosPort
->bufferProcessType
& BUFFER_COPY
)
670 pVideoEnc
->exynos_codec_enqueueAllBuffer(pOMXComponent
, nPortIndex
);
671 Exynos_ResetCodecData(&pExynosPort
->processData
);
673 if (ret
== OMX_ErrorNone
) {
674 if (nPortIndex
== INPUT_PORT_INDEX
) {
675 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_TRUE
;
676 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_FALSE
;
677 Exynos_OSAL_Memset(pExynosComponent
->timeStamp
, -19771003, sizeof(OMX_TICKS
) * MAX_TIMESTAMP
);
678 Exynos_OSAL_Memset(pExynosComponent
->nFlags
, 0, sizeof(OMX_U32
) * MAX_FLAGS
);
679 pExynosComponent
->getAllDelayBuffer
= OMX_FALSE
;
680 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
681 pExynosComponent
->bBehaviorEOS
= OMX_FALSE
;
682 pExynosComponent
->reInputData
= OMX_FALSE
;
685 pExynosPort
->bIsPortFlushed
= OMX_FALSE
;
686 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,"OMX_CommandFlush EventCmdComplete, port:%d", nPortIndex
);
687 if (bEvent
== OMX_TRUE
)
688 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
689 pExynosComponent
->callbackData
,
690 OMX_EventCmdComplete
,
691 OMX_CommandFlush
, nPortIndex
, NULL
);
694 if (pDataBuffer
[1] != NULL
)
695 Exynos_OSAL_MutexUnlock(pDataBuffer
[1]->bufferMutex
);
697 Exynos_OSAL_MutexUnlock(pDataBuffer
[0]->bufferMutex
);
700 if ((ret
!= OMX_ErrorNone
) && (pOMXComponent
!= NULL
) && (pExynosComponent
!= NULL
)) {
701 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
,"%s : %d", __FUNCTION__
, __LINE__
);
702 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
703 pExynosComponent
->callbackData
,
713 OMX_ERRORTYPE
Exynos_InputBufferReturn(
714 OMX_COMPONENTTYPE
*pOMXComponent
,
715 EXYNOS_OMX_DATABUFFER
*pDataBuffer
)
717 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
718 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
719 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
720 OMX_BUFFERHEADERTYPE
*pBufferHdr
= NULL
;
724 if (pOMXComponent
== NULL
) {
725 ret
= OMX_ErrorBadParameter
;
729 if (pOMXComponent
->pComponentPrivate
== NULL
) {
730 ret
= OMX_ErrorBadParameter
;
733 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
734 pExynosPort
= &(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
]);
736 if (pDataBuffer
!= NULL
)
737 pBufferHdr
= pDataBuffer
->bufferHeader
;
739 if (pBufferHdr
!= NULL
) {
740 if (pExynosPort
->markType
.hMarkTargetComponent
!= NULL
) {
741 pBufferHdr
->hMarkTargetComponent
= pExynosPort
->markType
.hMarkTargetComponent
;
742 pBufferHdr
->pMarkData
= pExynosPort
->markType
.pMarkData
;
743 pExynosPort
->markType
.hMarkTargetComponent
= NULL
;
744 pExynosPort
->markType
.pMarkData
= NULL
;
747 if (pBufferHdr
->hMarkTargetComponent
!= NULL
) {
748 if (pBufferHdr
->hMarkTargetComponent
== pOMXComponent
) {
749 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
750 pExynosComponent
->callbackData
,
752 0, 0, pBufferHdr
->pMarkData
);
754 pExynosComponent
->propagateMarkType
.hMarkTargetComponent
= pBufferHdr
->hMarkTargetComponent
;
755 pExynosComponent
->propagateMarkType
.pMarkData
= pBufferHdr
->pMarkData
;
759 pBufferHdr
->nFilledLen
= 0;
760 pBufferHdr
->nOffset
= 0;
761 Exynos_OMX_InputBufferReturn(pOMXComponent
, pBufferHdr
);
764 /* reset dataBuffer */
765 Exynos_ResetDataBuffer(pDataBuffer
);
773 OMX_ERRORTYPE
Exynos_InputBufferGetQueue(
774 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
776 OMX_ERRORTYPE ret
= OMX_ErrorUndefined
;
777 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
778 EXYNOS_OMX_MESSAGE
*pMessage
= NULL
;
779 EXYNOS_OMX_DATABUFFER
*pDataBuffer
= NULL
;
783 if (pExynosComponent
== NULL
) {
784 ret
= OMX_ErrorBadParameter
;
787 pExynosPort
= &(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
]);
788 pDataBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
790 if (pExynosComponent
->currentState
!= OMX_StateExecuting
) {
791 ret
= OMX_ErrorUndefined
;
793 } else if ((pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
794 (!CHECK_PORT_BEING_FLUSHED(pExynosPort
))) {
795 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
796 if (pDataBuffer
->dataValid
!= OMX_TRUE
) {
797 pMessage
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
798 if (pMessage
== NULL
) {
799 ret
= OMX_ErrorUndefined
;
802 if (pMessage
->messageType
== EXYNOS_OMX_CommandFakeBuffer
) {
803 Exynos_OSAL_Free(pMessage
);
804 ret
= OMX_ErrorCodecFlush
;
808 pDataBuffer
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)(pMessage
->pCmdData
);
809 pDataBuffer
->allocSize
= pDataBuffer
->bufferHeader
->nAllocLen
;
810 pDataBuffer
->dataLen
= pDataBuffer
->bufferHeader
->nFilledLen
;
811 pDataBuffer
->remainDataLen
= pDataBuffer
->dataLen
;
812 pDataBuffer
->usedDataLen
= 0;
813 pDataBuffer
->dataValid
= OMX_TRUE
;
814 pDataBuffer
->nFlags
= pDataBuffer
->bufferHeader
->nFlags
;
815 pDataBuffer
->timeStamp
= pDataBuffer
->bufferHeader
->nTimeStamp
;
817 Exynos_OSAL_Free(pMessage
);
819 if (pDataBuffer
->allocSize
<= pDataBuffer
->dataLen
)
820 Exynos_OSAL_Log(EXYNOS_LOG_WARNING
, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", pDataBuffer
->allocSize
, pDataBuffer
->dataLen
);
830 OMX_ERRORTYPE
Exynos_OutputBufferReturn(
831 OMX_COMPONENTTYPE
*pOMXComponent
,
832 EXYNOS_OMX_DATABUFFER
*pDataBuffer
)
834 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
835 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
836 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
837 OMX_BUFFERHEADERTYPE
*pBufferHdr
= NULL
;
841 if (pOMXComponent
== NULL
) {
842 ret
= OMX_ErrorBadParameter
;
846 if (pOMXComponent
->pComponentPrivate
== NULL
) {
847 ret
= OMX_ErrorBadParameter
;
850 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
851 pExynosPort
= &(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
]);
853 if (pDataBuffer
!= NULL
)
854 pBufferHdr
= pDataBuffer
->bufferHeader
;
856 if (pBufferHdr
!= NULL
) {
857 pBufferHdr
->nFilledLen
= pDataBuffer
->remainDataLen
;
858 pBufferHdr
->nOffset
= 0;
859 pBufferHdr
->nFlags
= pDataBuffer
->nFlags
;
860 pBufferHdr
->nTimeStamp
= pDataBuffer
->timeStamp
;
862 if (pExynosComponent
->propagateMarkType
.hMarkTargetComponent
!= NULL
) {
863 pBufferHdr
->hMarkTargetComponent
= pExynosComponent
->propagateMarkType
.hMarkTargetComponent
;
864 pBufferHdr
->pMarkData
= pExynosComponent
->propagateMarkType
.pMarkData
;
865 pExynosComponent
->propagateMarkType
.hMarkTargetComponent
= NULL
;
866 pExynosComponent
->propagateMarkType
.pMarkData
= NULL
;
869 if ((pBufferHdr
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) {
870 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "event OMX_BUFFERFLAG_EOS!!!");
871 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
872 pExynosComponent
->callbackData
,
875 pBufferHdr
->nFlags
, NULL
);
878 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pBufferHdr
);
881 /* reset dataBuffer */
882 Exynos_ResetDataBuffer(pDataBuffer
);
890 OMX_ERRORTYPE
Exynos_OutputBufferGetQueue(
891 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
893 OMX_ERRORTYPE ret
= OMX_ErrorUndefined
;
894 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
895 EXYNOS_OMX_MESSAGE
*pMessage
= NULL
;
896 EXYNOS_OMX_DATABUFFER
*pDataBuffer
= NULL
;
900 if (pExynosComponent
== NULL
) {
901 ret
= OMX_ErrorBadParameter
;
904 pExynosPort
= &(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
]);
906 if (pExynosPort
->bufferProcessType
& BUFFER_COPY
) {
907 pDataBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.outputDataBuffer
);
908 } else if (pExynosPort
->bufferProcessType
& BUFFER_SHARE
) {
909 pDataBuffer
= &(pExynosPort
->way
.port2WayDataBuffer
.inputDataBuffer
);
911 ret
= OMX_ErrorUndefined
;
915 if (pExynosComponent
->currentState
!= OMX_StateExecuting
) {
916 ret
= OMX_ErrorUndefined
;
918 } else if ((pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
919 (!CHECK_PORT_BEING_FLUSHED(pExynosPort
))) {
920 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
921 if (pDataBuffer
->dataValid
!= OMX_TRUE
) {
922 pMessage
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
923 if (pMessage
== NULL
) {
924 ret
= OMX_ErrorUndefined
;
927 if (pMessage
->messageType
== EXYNOS_OMX_CommandFakeBuffer
) {
928 Exynos_OSAL_Free(pMessage
);
929 ret
= OMX_ErrorCodecFlush
;
933 pDataBuffer
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)(pMessage
->pCmdData
);
934 pDataBuffer
->allocSize
= pDataBuffer
->bufferHeader
->nAllocLen
;
935 pDataBuffer
->dataLen
= 0; //dataBuffer->bufferHeader->nFilledLen;
936 pDataBuffer
->remainDataLen
= pDataBuffer
->dataLen
;
937 pDataBuffer
->usedDataLen
= 0; //dataBuffer->bufferHeader->nOffset;
938 pDataBuffer
->dataValid
= OMX_TRUE
;
939 /* pDataBuffer->nFlags = pDataBuffer->bufferHeader->nFlags; */
940 /* pDtaBuffer->nTimeStamp = pDataBuffer->bufferHeader->nTimeStamp; */
942 if (pExynosPort->bufferProcessType & BUFFER_SHARE)
943 pDataBuffer->pPrivate = pDataBuffer->bufferHeader->pOutputPortPrivate;
944 else if (pExynosPort->bufferProcessType & BUFFER_COPY) {
945 pExynosPort->processData.dataBuffer = pDataBuffer->bufferHeader->pBuffer;
946 pExynosPort->processData.allocSize = pDataBuffer->bufferHeader->nAllocLen;
949 Exynos_OSAL_Free(pMessage
);
959 OMX_BUFFERHEADERTYPE
*Exynos_OutputBufferGetQueue_Direct(
960 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
962 OMX_BUFFERHEADERTYPE
*pBufferHdr
= NULL
;
963 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
964 EXYNOS_OMX_MESSAGE
*pMessage
= NULL
;
968 if (pExynosComponent
== NULL
) {
972 pExynosPort
= &(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
]);
974 if (pExynosComponent
->currentState
!= OMX_StateExecuting
) {
977 } else if ((pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
978 (!CHECK_PORT_BEING_FLUSHED(pExynosPort
))) {
979 Exynos_OSAL_SemaphoreWait(pExynosPort
->bufferSemID
);
981 pMessage
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
982 if (pMessage
== NULL
) {
986 if (pMessage
->messageType
== EXYNOS_OMX_CommandFakeBuffer
) {
987 Exynos_OSAL_Free(pMessage
);
992 pBufferHdr
= (OMX_BUFFERHEADERTYPE
*)(pMessage
->pCmdData
);
993 Exynos_OSAL_Free(pMessage
);
1002 OMX_ERRORTYPE
Exynos_CodecBufferEnqueue(
1003 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
,
1007 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1008 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1012 if (pExynosComponent
== NULL
) {
1013 ret
= OMX_ErrorBadParameter
;
1017 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1018 ret
= OMX_ErrorBadPortIndex
;
1021 pExynosPort
= &(pExynosComponent
->pExynosPort
[nPortIndex
]);
1023 if (pData
== NULL
) {
1024 ret
= OMX_ErrorInsufficientResources
;
1028 ret
= Exynos_OSAL_Queue(&pExynosPort
->codecBufferQ
, (void *)pData
);
1030 ret
= OMX_ErrorUndefined
;
1033 Exynos_OSAL_SemaphorePost(pExynosPort
->codecSemID
);
1035 ret
= OMX_ErrorNone
;
1043 OMX_ERRORTYPE
Exynos_CodecBufferDequeue(
1044 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
,
1048 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1049 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1050 OMX_PTR pTempData
= NULL
;
1054 if (pExynosComponent
== NULL
) {
1055 ret
= OMX_ErrorBadParameter
;
1059 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1060 ret
= OMX_ErrorBadPortIndex
;
1063 pExynosPort
= &(pExynosComponent
->pExynosPort
[nPortIndex
]);
1065 Exynos_OSAL_SemaphoreWait(pExynosPort
->codecSemID
);
1066 pTempData
= (OMX_PTR
)Exynos_OSAL_Dequeue(&pExynosPort
->codecBufferQ
);
1067 if (pTempData
!= NULL
) {
1068 *pData
= (OMX_PTR
)pTempData
;
1069 ret
= OMX_ErrorNone
;
1072 ret
= OMX_ErrorUndefined
;
1081 OMX_ERRORTYPE
Exynos_CodecBufferReset(
1082 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
,
1085 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1086 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1090 if (pExynosComponent
== NULL
) {
1091 ret
= OMX_ErrorBadParameter
;
1095 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1096 ret
= OMX_ErrorBadPortIndex
;
1099 pExynosPort
= &(pExynosComponent
->pExynosPort
[nPortIndex
]);
1101 ret
= Exynos_OSAL_ResetQueue(&pExynosPort
->codecBufferQ
);
1103 ret
= OMX_ErrorUndefined
;
1109 Exynos_OSAL_Get_SemaphoreCount(pExynosPort
->codecSemID
, &cnt
);
1111 Exynos_OSAL_SemaphoreWait(pExynosPort
->codecSemID
);
1115 ret
= OMX_ErrorNone
;
1123 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeGetParameter(
1124 OMX_IN OMX_HANDLETYPE hComponent
,
1125 OMX_IN OMX_INDEXTYPE nParamIndex
,
1126 OMX_INOUT OMX_PTR pComponentParameterStructure
)
1128 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1129 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1130 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1131 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1135 if (hComponent
== NULL
) {
1136 ret
= OMX_ErrorBadParameter
;
1139 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1141 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1142 if (ret
!= OMX_ErrorNone
) {
1146 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1147 ret
= OMX_ErrorBadParameter
;
1150 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1152 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1153 ret
= OMX_ErrorInvalidState
;
1157 if (pComponentParameterStructure
== NULL
) {
1158 ret
= OMX_ErrorBadParameter
;
1162 switch (nParamIndex
) {
1163 case OMX_IndexParamVideoInit
:
1165 OMX_PORT_PARAM_TYPE
*pPortParam
= (OMX_PORT_PARAM_TYPE
*)pComponentParameterStructure
;
1166 ret
= Exynos_OMX_Check_SizeVersion(pPortParam
, sizeof(OMX_PORT_PARAM_TYPE
));
1167 if (ret
!= OMX_ErrorNone
) {
1171 pPortParam
->nPorts
= pExynosComponent
->portParam
.nPorts
;
1172 pPortParam
->nStartPortNumber
= pExynosComponent
->portParam
.nStartPortNumber
;
1173 ret
= OMX_ErrorNone
;
1176 case OMX_IndexParamVideoPortFormat
:
1178 OMX_VIDEO_PARAM_PORTFORMATTYPE
*pPortFormat
= (OMX_VIDEO_PARAM_PORTFORMATTYPE
*)pComponentParameterStructure
;
1179 OMX_U32 nPortIndex
= pPortFormat
->nPortIndex
;
1180 OMX_U32 nIndex
= pPortFormat
->nIndex
;
1181 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1182 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= NULL
;
1183 OMX_U32 nSupportFormat
= 0;
1185 ret
= Exynos_OMX_Check_SizeVersion(pPortFormat
, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE
));
1186 if (ret
!= OMX_ErrorNone
) {
1190 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1191 ret
= OMX_ErrorBadPortIndex
;
1195 if (nPortIndex
== INPUT_PORT_INDEX
) {
1196 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1197 pPortDef
= &pExynosPort
->portDefinition
;
1200 case supportFormat_0
:
1201 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1202 pPortFormat
->eColorFormat
= OMX_COLOR_FormatYUV420Planar
;
1203 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1205 case supportFormat_1
:
1206 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1207 pPortFormat
->eColorFormat
= OMX_COLOR_FormatYUV420SemiPlanar
;
1208 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1210 case supportFormat_2
:
1211 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1212 pPortFormat
->eColorFormat
= (OMX_COLOR_FORMATTYPE
)OMX_SEC_COLOR_FormatNV12Tiled
;
1213 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1215 case supportFormat_3
:
1216 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1217 pPortFormat
->eColorFormat
= (OMX_COLOR_FORMATTYPE
)OMX_SEC_COLOR_FormatNV21Linear
;
1218 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1220 case supportFormat_4
:
1221 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1222 pPortFormat
->eColorFormat
= OMX_COLOR_FormatAndroidOpaque
;
1223 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1225 #ifdef USE_ENCODER_RGBINPUT_SUPPORT
1226 case supportFormat_5
:
1227 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1228 pPortFormat
->eColorFormat
= (OMX_COLOR_FORMATTYPE
)OMX_SEC_COLOR_FormatYVU420Planar
;
1229 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1231 case supportFormat_6
:
1232 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1233 pPortFormat
->eColorFormat
= OMX_COLOR_Format32bitARGB8888
;
1234 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1236 case supportFormat_7
:
1237 pPortFormat
->eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1238 pPortFormat
->eColorFormat
= OMX_COLOR_Format32bitBGRA8888
;
1239 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1243 if (nIndex
> supportFormat_0
) {
1244 ret
= OMX_ErrorNoMore
;
1249 } else if (nPortIndex
== OUTPUT_PORT_INDEX
) {
1250 nSupportFormat
= OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX
- 1;
1251 if (nIndex
> nSupportFormat
) {
1252 ret
= OMX_ErrorNoMore
;
1256 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1257 pPortDef
= &pExynosPort
->portDefinition
;
1259 pPortFormat
->eCompressionFormat
= pPortDef
->format
.video
.eCompressionFormat
;
1260 pPortFormat
->eColorFormat
= pPortDef
->format
.video
.eColorFormat
;
1261 pPortFormat
->xFramerate
= pPortDef
->format
.video
.xFramerate
;
1263 ret
= OMX_ErrorNone
;
1266 case OMX_IndexParamVideoBitrate
:
1268 OMX_VIDEO_PARAM_BITRATETYPE
*pVideoBitrate
= (OMX_VIDEO_PARAM_BITRATETYPE
*)pComponentParameterStructure
;
1269 OMX_U32 nPortIndex
= pVideoBitrate
->nPortIndex
;
1270 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1271 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1272 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= NULL
;
1274 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1275 ret
= OMX_ErrorBadPortIndex
;
1278 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1279 if (pVideoEnc
== NULL
) {
1280 ret
= OMX_ErrorBadParameter
;
1283 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1284 pPortDef
= &pExynosPort
->portDefinition
;
1286 pVideoBitrate
->eControlRate
= pVideoEnc
->eControlRate
[nPortIndex
];
1287 pVideoBitrate
->nTargetBitrate
= pPortDef
->format
.video
.nBitrate
;
1289 ret
= OMX_ErrorNone
;
1292 case OMX_IndexParamVideoQuantization
:
1294 OMX_VIDEO_PARAM_QUANTIZATIONTYPE
*pVideoQuantization
= (OMX_VIDEO_PARAM_QUANTIZATIONTYPE
*)pComponentParameterStructure
;
1295 OMX_U32 nPortIndex
= pVideoQuantization
->nPortIndex
;
1296 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1297 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1298 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= NULL
;
1300 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1301 ret
= OMX_ErrorBadPortIndex
;
1304 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1305 if (pVideoEnc
== NULL
) {
1306 ret
= OMX_ErrorBadParameter
;
1309 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1310 pPortDef
= &pExynosPort
->portDefinition
;
1312 pVideoQuantization
->nQpI
= pVideoEnc
->quantization
.nQpI
;
1313 pVideoQuantization
->nQpP
= pVideoEnc
->quantization
.nQpP
;
1314 pVideoQuantization
->nQpB
= pVideoEnc
->quantization
.nQpB
;
1316 ret
= OMX_ErrorNone
;
1319 case OMX_IndexParamPortDefinition
:
1321 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= (OMX_PARAM_PORTDEFINITIONTYPE
*)pComponentParameterStructure
;
1322 OMX_U32 nPortIndex
= pPortDef
->nPortIndex
;
1323 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1325 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1326 ret
= OMX_ErrorBadPortIndex
;
1330 ret
= Exynos_OMX_Check_SizeVersion(pPortDef
, sizeof(OMX_PARAM_PORTDEFINITIONTYPE
));
1331 if (ret
!= OMX_ErrorNone
) {
1335 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1336 Exynos_OSAL_Memcpy(pPortDef
, &pExynosPort
->portDefinition
, pPortDef
->nSize
);
1338 #ifdef USE_STOREMETADATA
1339 if ((nPortIndex
== 0) &&
1340 (pExynosPort
->bStoreMetaData
== OMX_TRUE
)) {
1341 pPortDef
->nBufferSize
= MAX_INPUT_METADATA_BUFFER_SIZE
;
1346 case OMX_IndexVendorNeedContigMemory
:
1348 EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
*pPortMemType
= (EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
*)pComponentParameterStructure
;
1349 OMX_U32 nPortIndex
= pPortMemType
->nPortIndex
;
1350 EXYNOS_OMX_BASEPORT
*pExynosPort
;
1352 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1353 ret
= OMX_ErrorBadPortIndex
;
1357 ret
= Exynos_OMX_Check_SizeVersion(pPortMemType
, sizeof(EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
));
1358 if (ret
!= OMX_ErrorNone
)
1361 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1363 pPortMemType
->bNeedContigMem
= pExynosPort
->bNeedContigMem
;
1366 case OMX_IndexParamVideoIntraRefresh
:
1368 OMX_VIDEO_PARAM_INTRAREFRESHTYPE
*pIntraRefresh
= (OMX_VIDEO_PARAM_INTRAREFRESHTYPE
*)pComponentParameterStructure
;
1369 OMX_U32 nPortIndex
= pIntraRefresh
->nPortIndex
;
1370 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1372 ret
= Exynos_OMX_Check_SizeVersion(pIntraRefresh
, sizeof(OMX_VIDEO_PARAM_INTRAREFRESHTYPE
));
1373 if (ret
!= OMX_ErrorNone
)
1376 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1377 ret
= OMX_ErrorBadPortIndex
;
1381 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1382 pIntraRefresh
->eRefreshMode
= pVideoEnc
->intraRefresh
.eRefreshMode
;
1383 pIntraRefresh
->nAirMBs
= pVideoEnc
->intraRefresh
.nAirMBs
;
1384 pIntraRefresh
->nAirRef
= pVideoEnc
->intraRefresh
.nAirRef
;
1385 pIntraRefresh
->nCirMBs
= pVideoEnc
->intraRefresh
.nCirMBs
;
1387 ret
= OMX_ErrorNone
;
1392 ret
= Exynos_OMX_GetParameter(hComponent
, nParamIndex
, pComponentParameterStructure
);
1402 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeSetParameter(
1403 OMX_IN OMX_HANDLETYPE hComponent
,
1404 OMX_IN OMX_INDEXTYPE nParamIndex
,
1405 OMX_IN OMX_PTR pComponentParameterStructure
)
1407 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1408 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1409 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1410 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1414 if (hComponent
== NULL
) {
1415 ret
= OMX_ErrorBadParameter
;
1418 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1420 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1421 if (ret
!= OMX_ErrorNone
) {
1425 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1426 ret
= OMX_ErrorBadParameter
;
1429 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1431 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1432 ret
= OMX_ErrorInvalidState
;
1436 if (pComponentParameterStructure
== NULL
) {
1437 ret
= OMX_ErrorBadParameter
;
1441 switch (nParamIndex
) {
1442 case OMX_IndexParamVideoPortFormat
:
1444 OMX_VIDEO_PARAM_PORTFORMATTYPE
*pPortFormat
= (OMX_VIDEO_PARAM_PORTFORMATTYPE
*)pComponentParameterStructure
;
1445 OMX_U32 nPortIndex
= pPortFormat
->nPortIndex
;
1446 OMX_U32 nIndex
= pPortFormat
->nIndex
;
1447 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= NULL
;
1448 OMX_U32 nSupportFormat
= 0;
1450 ret
= Exynos_OMX_Check_SizeVersion(pPortFormat
, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE
));
1451 if (ret
!= OMX_ErrorNone
) {
1455 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1456 ret
= OMX_ErrorBadPortIndex
;
1459 pPortDef
= &(pExynosComponent
->pExynosPort
[nPortIndex
].portDefinition
);
1461 pPortDef
->format
.video
.eColorFormat
= pPortFormat
->eColorFormat
;
1462 pPortDef
->format
.video
.eCompressionFormat
= pPortFormat
->eCompressionFormat
;
1463 pPortDef
->format
.video
.xFramerate
= pPortFormat
->xFramerate
;
1466 case OMX_IndexParamVideoBitrate
:
1468 OMX_VIDEO_PARAM_BITRATETYPE
*pVideoBitrate
= (OMX_VIDEO_PARAM_BITRATETYPE
*)pComponentParameterStructure
;
1469 OMX_U32 nPortIndex
= pVideoBitrate
->nPortIndex
;
1470 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1471 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1472 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= NULL
;
1474 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1475 ret
= OMX_ErrorBadPortIndex
;
1478 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1479 if (pVideoEnc
== NULL
) {
1480 ret
= OMX_ErrorBadParameter
;
1483 pPortDef
= &(pExynosComponent
->pExynosPort
[nPortIndex
].portDefinition
);
1485 pVideoEnc
->eControlRate
[nPortIndex
] = pVideoBitrate
->eControlRate
;
1486 pPortDef
->format
.video
.nBitrate
= pVideoBitrate
->nTargetBitrate
;
1488 ret
= OMX_ErrorNone
;
1491 case OMX_IndexParamVideoQuantization
:
1493 OMX_VIDEO_PARAM_QUANTIZATIONTYPE
*pVideoQuantization
= (OMX_VIDEO_PARAM_QUANTIZATIONTYPE
*)pComponentParameterStructure
;
1494 OMX_U32 nPortIndex
= pVideoQuantization
->nPortIndex
;
1495 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1496 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1497 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= NULL
;
1499 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1500 ret
= OMX_ErrorBadPortIndex
;
1503 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1504 if (pVideoEnc
== NULL
) {
1505 ret
= OMX_ErrorBadParameter
;
1508 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1509 pPortDef
= &pExynosPort
->portDefinition
;
1511 pVideoEnc
->quantization
.nQpI
= pVideoQuantization
->nQpI
;
1512 pVideoEnc
->quantization
.nQpP
= pVideoQuantization
->nQpP
;
1513 pVideoEnc
->quantization
.nQpB
= pVideoQuantization
->nQpB
;
1515 ret
= OMX_ErrorNone
;
1518 case OMX_IndexParamPortDefinition
:
1520 OMX_PARAM_PORTDEFINITIONTYPE
*pPortDef
= (OMX_PARAM_PORTDEFINITIONTYPE
*)pComponentParameterStructure
;
1521 OMX_U32 nPortIndex
= pPortDef
->nPortIndex
;
1522 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1523 OMX_U32 width
, height
, size
;
1525 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1526 ret
= OMX_ErrorBadPortIndex
;
1530 ret
= Exynos_OMX_Check_SizeVersion(pPortDef
, sizeof(OMX_PARAM_PORTDEFINITIONTYPE
));
1531 if (ret
!= OMX_ErrorNone
) {
1535 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1537 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) &&
1538 (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
1539 if (pExynosPort
->portDefinition
.bEnabled
== OMX_TRUE
) {
1540 ret
= OMX_ErrorIncorrectStateOperation
;
1545 if (pPortDef
->nBufferCountActual
< pExynosPort
->portDefinition
.nBufferCountMin
) {
1546 ret
= OMX_ErrorBadParameter
;
1550 Exynos_OSAL_Memcpy(&pExynosPort
->portDefinition
, pPortDef
, pPortDef
->nSize
);
1551 if (nPortIndex
== INPUT_PORT_INDEX
) {
1552 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1553 Exynos_UpdateFrameSize(pOMXComponent
);
1554 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pExynosOutputPort->portDefinition.nBufferSize: %d",
1555 pExynosPort
->portDefinition
.nBufferSize
);
1557 ret
= OMX_ErrorNone
;
1560 #ifdef USE_STOREMETADATA
1561 case OMX_IndexParamStoreMetaDataBuffer
:
1563 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1564 if (pVideoEnc
== NULL
) {
1565 ret
= OMX_ErrorBadParameter
;
1569 ret
= Exynos_OSAL_SetANBParameter(hComponent
, nParamIndex
, pComponentParameterStructure
);
1570 if (ret
== OMX_ErrorNone
)
1571 pVideoEnc
->bFirstInput
= OMX_TRUE
;
1575 case OMX_IndexVendorNeedContigMemory
:
1577 EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
*pPortMemType
= (EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
*)pComponentParameterStructure
;
1578 OMX_U32 nPortIndex
= pPortMemType
->nPortIndex
;
1579 EXYNOS_OMX_BASEPORT
*pExynosPort
;
1581 if (nPortIndex
>= pExynosComponent
->portParam
.nPorts
) {
1582 ret
= OMX_ErrorBadPortIndex
;
1586 ret
= Exynos_OMX_Check_SizeVersion(pPortMemType
, sizeof(EXYNOS_OMX_VIDEO_PARAM_PORTMEMTYPE
));
1587 if (ret
!= OMX_ErrorNone
)
1590 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1592 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) && (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
1593 if (pExynosPort
->portDefinition
.bEnabled
== OMX_TRUE
) {
1594 ret
= OMX_ErrorIncorrectStateOperation
;
1599 pExynosPort
->bNeedContigMem
= pPortMemType
->bNeedContigMem
;
1602 case OMX_IndexParamVideoIntraRefresh
:
1604 OMX_VIDEO_PARAM_INTRAREFRESHTYPE
*pIntraRefresh
= (OMX_VIDEO_PARAM_INTRAREFRESHTYPE
*)pComponentParameterStructure
;
1605 OMX_U32 nPortIndex
= pIntraRefresh
->nPortIndex
;
1606 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1608 ret
= Exynos_OMX_Check_SizeVersion(pIntraRefresh
, sizeof(OMX_VIDEO_PARAM_INTRAREFRESHTYPE
));
1609 if (ret
!= OMX_ErrorNone
)
1612 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1613 ret
= OMX_ErrorBadPortIndex
;
1617 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1618 if (pIntraRefresh
->eRefreshMode
== OMX_VIDEO_IntraRefreshCyclic
) {
1619 pVideoEnc
->intraRefresh
.eRefreshMode
= pIntraRefresh
->eRefreshMode
;
1620 pVideoEnc
->intraRefresh
.nCirMBs
= pIntraRefresh
->nCirMBs
;
1621 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "OMX_VIDEO_IntraRefreshCyclic Enable, nCirMBs: %d",
1622 pVideoEnc
->intraRefresh
.nCirMBs
);
1624 ret
= OMX_ErrorUnsupportedSetting
;
1628 ret
= OMX_ErrorNone
;
1633 ret
= Exynos_OMX_SetParameter(hComponent
, nParamIndex
, pComponentParameterStructure
);
1643 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeGetConfig(
1644 OMX_HANDLETYPE hComponent
,
1645 OMX_INDEXTYPE nParamIndex
,
1646 OMX_PTR pComponentConfigStructure
)
1648 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1649 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1650 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1654 if ((hComponent
== NULL
) ||
1655 (pComponentConfigStructure
== NULL
)) {
1656 ret
= OMX_ErrorBadParameter
;
1659 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1661 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1662 if (ret
!= OMX_ErrorNone
) {
1666 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1667 ret
= OMX_ErrorBadParameter
;
1670 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1672 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1673 ret
= OMX_ErrorInvalidState
;
1677 switch (nParamIndex
) {
1678 case OMX_IndexConfigVideoBitrate
:
1680 OMX_VIDEO_CONFIG_BITRATETYPE
*pConfigBitrate
= (OMX_VIDEO_CONFIG_BITRATETYPE
*)pComponentConfigStructure
;
1681 OMX_U32 nPortIndex
= pConfigBitrate
->nPortIndex
;
1682 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1684 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1685 ret
= OMX_ErrorBadPortIndex
;
1688 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1689 pConfigBitrate
->nEncodeBitrate
= pExynosPort
->portDefinition
.format
.video
.nBitrate
;
1693 case OMX_IndexConfigVideoFramerate
:
1695 OMX_CONFIG_FRAMERATETYPE
*pConfigFramerate
= (OMX_CONFIG_FRAMERATETYPE
*)pComponentConfigStructure
;
1696 OMX_U32 nPortIndex
= pConfigFramerate
->nPortIndex
;
1697 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1699 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1700 ret
= OMX_ErrorBadPortIndex
;
1703 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1704 pConfigFramerate
->xEncodeFramerate
= pExynosPort
->portDefinition
.format
.video
.xFramerate
;
1708 case OMX_IndexVendorGetBufferFD
:
1710 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1711 EXYNOS_OMX_VIDEO_CONFIG_BUFFERINFO
*pBufferInfo
= (EXYNOS_OMX_VIDEO_CONFIG_BUFFERINFO
*)pComponentConfigStructure
;
1713 ret
= Exynos_OMX_Check_SizeVersion(pBufferInfo
, sizeof(EXYNOS_OMX_VIDEO_CONFIG_BUFFERINFO
));
1714 if (ret
!= OMX_ErrorNone
)
1717 pBufferInfo
->fd
= Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc
->hSharedMemory
, pBufferInfo
->pVirAddr
);
1722 ret
= Exynos_OMX_GetConfig(hComponent
, nParamIndex
, pComponentConfigStructure
);
1732 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeSetConfig(
1733 OMX_HANDLETYPE hComponent
,
1734 OMX_INDEXTYPE nParamIndex
,
1735 OMX_PTR pComponentConfigStructure
)
1737 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1738 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1739 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1743 if ((hComponent
== NULL
) ||
1744 (pComponentConfigStructure
== NULL
)) {
1745 ret
= OMX_ErrorBadParameter
;
1748 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1750 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1751 if (ret
!= OMX_ErrorNone
) {
1755 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1756 ret
= OMX_ErrorBadParameter
;
1759 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1761 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1762 ret
= OMX_ErrorInvalidState
;
1766 switch (nParamIndex
) {
1767 case OMX_IndexConfigVideoBitrate
:
1769 OMX_VIDEO_CONFIG_BITRATETYPE
*pConfigBitrate
= (OMX_VIDEO_CONFIG_BITRATETYPE
*)pComponentConfigStructure
;
1770 OMX_U32 nPortIndex
= pConfigBitrate
->nPortIndex
;
1771 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1773 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1774 ret
= OMX_ErrorBadPortIndex
;
1777 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1778 pExynosPort
->portDefinition
.format
.video
.nBitrate
= pConfigBitrate
->nEncodeBitrate
;
1782 case OMX_IndexConfigVideoFramerate
:
1784 OMX_CONFIG_FRAMERATETYPE
*pConfigFramerate
= (OMX_CONFIG_FRAMERATETYPE
*)pComponentConfigStructure
;
1785 OMX_U32 nPortIndex
= pConfigFramerate
->nPortIndex
;
1786 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1788 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1789 ret
= OMX_ErrorBadPortIndex
;
1792 pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
1793 pExynosPort
->portDefinition
.format
.video
.xFramerate
= pConfigFramerate
->xEncodeFramerate
;
1797 case OMX_IndexConfigVideoIntraVOPRefresh
:
1799 OMX_CONFIG_INTRAREFRESHVOPTYPE
*pIntraRefreshVOP
= (OMX_CONFIG_INTRAREFRESHVOPTYPE
*)pComponentConfigStructure
;
1800 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1801 OMX_U32 nPortIndex
= pIntraRefreshVOP
->nPortIndex
;
1803 if (pExynosComponent
->hComponentHandle
== NULL
) {
1804 ret
= OMX_ErrorBadParameter
;
1807 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1809 if (nPortIndex
!= OUTPUT_PORT_INDEX
) {
1810 ret
= OMX_ErrorBadPortIndex
;
1813 pVideoEnc
->IntraRefreshVOP
= pIntraRefreshVOP
->IntraRefreshVOP
;
1818 case OMX_IndexVendorSetQosRatio
:
1820 EXYNOS_OMX_VIDEO_CONFIG_QOSINFO
*pQosInfo
= (EXYNOS_OMX_VIDEO_CONFIG_QOSINFO
*)pComponentConfigStructure
;
1821 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1823 if (pExynosComponent
->hComponentHandle
== NULL
) {
1824 ret
= OMX_ErrorBadParameter
;
1827 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1829 ret
= Exynos_OMX_Check_SizeVersion(pQosInfo
, sizeof(EXYNOS_OMX_VIDEO_CONFIG_QOSINFO
));
1830 if (ret
!= OMX_ErrorNone
)
1833 pVideoEnc
->nQosRatio
= pQosInfo
->nQosRatio
;
1834 pVideoEnc
->bQosChanged
= OMX_TRUE
;
1836 ret
= OMX_ErrorNone
;
1842 ret
= Exynos_OMX_SetConfig(hComponent
, nParamIndex
, pComponentConfigStructure
);
1852 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeGetExtensionIndex(
1853 OMX_IN OMX_HANDLETYPE hComponent
,
1854 OMX_IN OMX_STRING szParamName
,
1855 OMX_OUT OMX_INDEXTYPE
*pIndexType
)
1857 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1858 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1859 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1863 if (hComponent
== NULL
) {
1864 ret
= OMX_ErrorBadParameter
;
1867 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1869 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1870 if (ret
!= OMX_ErrorNone
) {
1874 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1875 ret
= OMX_ErrorBadParameter
;
1878 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1880 if ((szParamName
== NULL
) || (pIndexType
== NULL
)) {
1881 ret
= OMX_ErrorBadParameter
;
1885 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1886 ret
= OMX_ErrorInvalidState
;
1890 if (Exynos_OSAL_Strcmp(szParamName
, EXYNOS_INDEX_PARAM_NEED_CONTIG_MEMORY
) == 0) {
1891 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexVendorNeedContigMemory
;
1892 ret
= OMX_ErrorNone
;
1894 } else if (Exynos_OSAL_Strcmp(szParamName
, EXYNOS_INDEX_CONFIG_GET_BUFFER_FD
) == 0) {
1895 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexVendorGetBufferFD
;
1896 ret
= OMX_ErrorNone
;
1900 else if (Exynos_OSAL_Strcmp(szParamName
, EXYNOS_INDEX_CONFIG_SET_QOS_RATIO
) == 0) {
1901 *pIndexType
= (OMX_INDEXTYPE
) OMX_IndexVendorSetQosRatio
;
1902 ret
= OMX_ErrorNone
;
1907 #ifdef USE_STOREMETADATA
1908 if (Exynos_OSAL_Strcmp(szParamName
, EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER
) == 0) {
1909 *pIndexType
= (OMX_INDEXTYPE
)OMX_IndexParamStoreMetaDataBuffer
;
1911 ret
= Exynos_OMX_GetExtensionIndex(hComponent
, szParamName
, pIndexType
);
1914 ret
= Exynos_OMX_GetExtensionIndex(hComponent
, szParamName
, pIndexType
);
1922 OMX_ERRORTYPE
Exynos_Shared_DataToBuffer(EXYNOS_OMX_DATA
*pData
, EXYNOS_OMX_DATABUFFER
*pUseBuffer
, OMX_BOOL bNeedUnlock
)
1924 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1926 pUseBuffer
->bufferHeader
= pData
->bufferHeader
;
1927 pUseBuffer
->allocSize
= pData
->allocSize
;
1928 pUseBuffer
->dataLen
= pData
->dataLen
;
1929 pUseBuffer
->usedDataLen
= pData
->usedDataLen
;
1930 pUseBuffer
->remainDataLen
= pData
->remainDataLen
;
1931 pUseBuffer
->timeStamp
= pData
->timeStamp
;
1932 pUseBuffer
->nFlags
= pData
->nFlags
;
1933 pUseBuffer
->pPrivate
= pData
->pPrivate
;
1935 if ((bNeedUnlock
== OMX_TRUE
) && (pUseBuffer
->bufferHeader
!= NULL
)) {
1936 OMX_PTR ppBuf
[MAX_BUFFER_PLANE
];
1937 if (OMX_ErrorNone
==
1938 Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE
)pUseBuffer
->bufferHeader
->pBuffer
, ppBuf
))
1939 Exynos_OSAL_UnlockANBHandle(ppBuf
[0]);