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_Platform_Specific.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_VIDEOENC_COMPONENT *pVideoEnc = NULL;
64 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
65 OMX_BUFFERHEADERTYPE *pTempBufferHdr = NULL;
70 if (hComponent == NULL) {
71 ret = OMX_ErrorBadParameter;
74 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
76 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
77 if (ret != OMX_ErrorNone) {
81 if (pOMXComponent->pComponentPrivate == NULL) {
82 ret = OMX_ErrorBadParameter;
85 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
87 if (pExynosComponent->hComponentHandle == NULL) {
88 ret = OMX_ErrorBadParameter;
91 pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
93 if ((nPortIndex < 0) ||
94 (nPortIndex >= pExynosComponent->portParam.nPorts)) {
95 ret = OMX_ErrorBadPortIndex;
98 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
100 if (pExynosPort->portState != OMX_StateIdle) {
101 ret = OMX_ErrorIncorrectStateOperation;
105 if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
106 ret = OMX_ErrorBadPortIndex;
110 pTempBufferHdr = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
111 if (pTempBufferHdr == NULL) {
112 ret = OMX_ErrorInsufficientResources;
115 Exynos_OSAL_Memset(pTempBufferHdr, 0, sizeof(OMX_BUFFERHEADERTYPE));
117 for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
118 if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
119 pExynosPort->extendBufferHeader[i].OMXBufferHeader = pTempBufferHdr;
120 pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ASSIGNED | HEADER_STATE_ALLOCATED);
121 INIT_SET_SIZE_VERSION(pTempBufferHdr, OMX_BUFFERHEADERTYPE);
122 pTempBufferHdr->pBuffer = pBuffer;
123 pTempBufferHdr->nAllocLen = nSizeBytes;
124 pTempBufferHdr->pAppPrivate = pAppPrivate;
125 if (nPortIndex == INPUT_PORT_INDEX)
126 pTempBufferHdr->nInputPortIndex = INPUT_PORT_INDEX;
128 pTempBufferHdr->nOutputPortIndex = OUTPUT_PORT_INDEX;
130 if (nPortIndex == OUTPUT_PORT_INDEX && pVideoEnc->bSharedOutputFD == OMX_TRUE)
131 pExynosPort->extendBufferHeader[i].buf_fd[0] = (int)(pBuffer); /*IL Client provides only FD value*/
133 pExynosPort->assignedBufferNum++;
134 if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
135 pExynosPort->portDefinition.bPopulated = OMX_TRUE;
136 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
137 Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
138 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
140 *ppBufferHdr = pTempBufferHdr;
146 Exynos_OSAL_Free(pTempBufferHdr);
147 ret = OMX_ErrorInsufficientResources;
155 OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
156 OMX_IN OMX_HANDLETYPE hComponent,
157 OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,
158 OMX_IN OMX_U32 nPortIndex,
159 OMX_IN OMX_PTR pAppPrivate,
160 OMX_IN OMX_U32 nSizeBytes)
162 OMX_ERRORTYPE ret = OMX_ErrorNone;
163 OMX_COMPONENTTYPE *pOMXComponent = NULL;
164 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
165 EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
166 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
167 OMX_BUFFERHEADERTYPE *pTempBufferHdr = NULL;
168 OMX_U8 *pTempBuffer = NULL;
169 int fdTempBuffer = -1;
170 MEMORY_TYPE eMemType;
175 if (hComponent == NULL) {
176 ret = OMX_ErrorBadParameter;
179 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
181 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
182 if (ret != OMX_ErrorNone) {
186 if (pOMXComponent->pComponentPrivate == NULL) {
187 ret = OMX_ErrorBadParameter;
190 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
192 if (pExynosComponent->hComponentHandle == NULL) {
193 ret = OMX_ErrorBadParameter;
196 pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
198 if ((nPortIndex < 0) ||
199 (nPortIndex >= pExynosComponent->portParam.nPorts)) {
200 ret = OMX_ErrorBadPortIndex;
203 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
205 if (pExynosPort->portState != OMX_StateIdle ) {
206 ret = OMX_ErrorIncorrectStateOperation;
210 if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
211 ret = OMX_ErrorBadPortIndex;
215 if (pExynosPort->bufferProcessType & BUFFER_SHARE)
216 eMemType = NORMAL_MEMORY;
218 eMemType = SYSTEM_MEMORY;
220 pTempBuffer = Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, nSizeBytes, eMemType);
221 if (pTempBuffer == NULL) {
222 ret = OMX_ErrorInsufficientResources;
225 fdTempBuffer = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pTempBuffer);
227 pTempBufferHdr = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
228 if (pTempBufferHdr == NULL) {
229 Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pTempBuffer);
230 ret = OMX_ErrorInsufficientResources;
233 Exynos_OSAL_Memset(pTempBufferHdr, 0, sizeof(OMX_BUFFERHEADERTYPE));
235 for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
236 if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
237 pExynosPort->extendBufferHeader[i].OMXBufferHeader = pTempBufferHdr;
238 pExynosPort->extendBufferHeader[i].buf_fd[0] = fdTempBuffer;
239 pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);
240 INIT_SET_SIZE_VERSION(pTempBufferHdr, OMX_BUFFERHEADERTYPE);
241 pTempBufferHdr->pBuffer = pTempBuffer;
242 pTempBufferHdr->nAllocLen = nSizeBytes;
243 pTempBufferHdr->pAppPrivate = pAppPrivate;
244 if (nPortIndex == INPUT_PORT_INDEX)
245 pTempBufferHdr->nInputPortIndex = INPUT_PORT_INDEX;
247 pTempBufferHdr->nOutputPortIndex = OUTPUT_PORT_INDEX;
248 pExynosPort->assignedBufferNum++;
249 if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
250 pExynosPort->portDefinition.bPopulated = OMX_TRUE;
251 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
252 Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
253 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
255 *ppBufferHdr = pTempBufferHdr;
261 Exynos_OSAL_Free(pTempBufferHdr);
262 Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pTempBuffer);
263 ret = OMX_ErrorInsufficientResources;
271 OMX_ERRORTYPE Exynos_OMX_FreeBuffer(
272 OMX_IN OMX_HANDLETYPE hComponent,
273 OMX_IN OMX_U32 nPortIndex,
274 OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr)
276 OMX_ERRORTYPE ret = OMX_ErrorNone;
277 OMX_COMPONENTTYPE *pOMXComponent = NULL;
278 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
279 EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
280 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
281 OMX_BUFFERHEADERTYPE *pOMXBufferHdr = NULL;
286 if (hComponent == NULL) {
287 ret = OMX_ErrorBadParameter;
290 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
292 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
293 if (ret != OMX_ErrorNone) {
297 if (pOMXComponent->pComponentPrivate == NULL) {
298 ret = OMX_ErrorBadParameter;
301 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
303 if (pExynosComponent->hComponentHandle == NULL) {
304 ret = OMX_ErrorBadParameter;
307 pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
309 if ((nPortIndex < 0) ||
310 (nPortIndex >= pExynosComponent->portParam.nPorts)) {
311 ret = OMX_ErrorBadPortIndex;
314 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
316 if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
317 ret = OMX_ErrorBadPortIndex;
321 if ((pExynosPort->portState != OMX_StateLoaded) &&
322 (pExynosPort->portState != OMX_StateInvalid)) {
323 (*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent,
324 pExynosComponent->callbackData,
325 (OMX_U32)OMX_EventError,
326 (OMX_U32)OMX_ErrorPortUnpopulated,
330 for (i = 0; i < /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM; i++) {
331 if ((pExynosPort->bufferStateAllocate[i] != BUFFER_STATE_FREE) &&
332 (pExynosPort->extendBufferHeader[i].OMXBufferHeader != NULL)) {
333 pOMXBufferHdr = pExynosPort->extendBufferHeader[i].OMXBufferHeader;
335 if (pOMXBufferHdr->pBuffer == pBufferHdr->pBuffer) {
336 if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) {
337 Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pOMXBufferHdr->pBuffer);
338 pOMXBufferHdr->pBuffer = NULL;
339 pBufferHdr->pBuffer = NULL;
340 } else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) {
343 pExynosPort->assignedBufferNum--;
345 if (pExynosPort->bufferStateAllocate[i] & HEADER_STATE_ALLOCATED) {
346 Exynos_OSAL_Free(pOMXBufferHdr);
347 pExynosPort->extendBufferHeader[i].OMXBufferHeader = NULL;
351 pExynosPort->bufferStateAllocate[i] = BUFFER_STATE_FREE;
359 if ((ret == OMX_ErrorNone) &&
360 (pExynosPort->assignedBufferNum == 0)) {
361 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosPort->unloadedResource signal set");
362 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
363 Exynos_OSAL_SemaphorePost(pExynosPort->unloadedResource);
364 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
365 pExynosPort->portDefinition.bPopulated = OMX_FALSE;
373 OMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(
374 EXYNOS_OMX_BASEPORT *pOMXBasePort,
377 OMX_ERRORTYPE ret = OMX_ErrorNone;
378 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
379 OMX_BUFFERHEADERTYPE *pTempBufferHdr = NULL;
380 OMX_U8 *pTempBuffer = NULL;
381 OMX_U32 nBufferSize = 0;
382 OMX_PARAM_PORTDEFINITIONTYPE portDefinition;
384 ret = OMX_ErrorTunnelingUnsupported;
389 OMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(
390 EXYNOS_OMX_BASEPORT *pOMXBasePort,
393 OMX_ERRORTYPE ret = OMX_ErrorNone;
394 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
395 OMX_BUFFERHEADERTYPE *pTempBufferHdr = NULL;
396 OMX_U8 *pTempBuffer = NULL;
397 OMX_U32 nBufferSize = 0;
399 ret = OMX_ErrorTunnelingUnsupported;
404 OMX_ERRORTYPE Exynos_OMX_ComponentTunnelRequest(
405 OMX_IN OMX_HANDLETYPE hComp,
406 OMX_IN OMX_U32 nPort,
407 OMX_IN OMX_HANDLETYPE hTunneledComp,
408 OMX_IN OMX_U32 nTunneledPort,
409 OMX_INOUT OMX_TUNNELSETUPTYPE *pTunnelSetup)
411 OMX_ERRORTYPE ret = OMX_ErrorNone;
413 ret = OMX_ErrorTunnelingUnsupported;
418 OMX_ERRORTYPE Exynos_OMX_GetFlushBuffer(
419 EXYNOS_OMX_BASEPORT *pExynosPort,
420 EXYNOS_OMX_DATABUFFER *pDataBuffer[])
422 OMX_ERRORTYPE ret = OMX_ErrorNone;
428 if (pExynosPort->portWayType == WAY1_PORT) {
429 *pDataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
430 } else if (pExynosPort->portWayType == WAY2_PORT) {
431 pDataBuffer[0] = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
432 pDataBuffer[1] = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
441 OMX_ERRORTYPE Exynos_OMX_FlushPort(
442 OMX_COMPONENTTYPE *pOMXComponent,
445 OMX_ERRORTYPE ret = OMX_ErrorNone;
446 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
447 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
448 OMX_BUFFERHEADERTYPE *pBufferHdr = NULL;
449 EXYNOS_OMX_DATABUFFER *pDataBuffer[2] = {NULL, NULL};
450 EXYNOS_OMX_MESSAGE *pMessage = NULL;
451 OMX_S32 nSemaCnt = 0;
456 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "flushPort idx:%d", nPortIndex);
459 if (pOMXComponent == NULL) {
460 ret = OMX_ErrorBadParameter;
464 if (pOMXComponent->pComponentPrivate == NULL) {
465 ret = OMX_ErrorBadParameter;
468 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
470 if ((nPortIndex < 0) ||
471 (nPortIndex >= pExynosComponent->portParam.nPorts)) {
472 ret = OMX_ErrorBadPortIndex;
475 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
477 while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
478 Exynos_OSAL_Get_SemaphoreCount(pExynosPort->bufferSemID, &nSemaCnt);
480 Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
482 Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
483 pMessage = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
484 if ((pMessage != NULL) &&
485 (pMessage->messageType != EXYNOS_OMX_CommandFakeBuffer)) {
486 pBufferHdr = (OMX_BUFFERHEADERTYPE *)pMessage->pCmdData;
487 pBufferHdr->nFilledLen = 0;
489 if (nPortIndex == OUTPUT_PORT_INDEX) {
490 Exynos_OMX_OutputBufferReturn(pOMXComponent, pBufferHdr);
491 } else if (nPortIndex == INPUT_PORT_INDEX) {
492 Exynos_OMX_InputBufferReturn(pOMXComponent, pBufferHdr);
495 Exynos_OSAL_Free(pMessage);
499 Exynos_OMX_GetFlushBuffer(pExynosPort, pDataBuffer);
500 if ((pDataBuffer[0] != NULL) &&
501 (pDataBuffer[0]->dataValid == OMX_TRUE)) {
502 if (nPortIndex == INPUT_PORT_INDEX)
503 Exynos_FlushInputBufferReturn(pOMXComponent, pDataBuffer[0]);
504 else if (nPortIndex == OUTPUT_PORT_INDEX)
505 Exynos_FlushOutputBufferReturn(pOMXComponent, pDataBuffer[0]);
507 if ((pDataBuffer[1] != NULL) &&
508 (pDataBuffer[1]->dataValid == OMX_TRUE)) {
509 if (nPortIndex == INPUT_PORT_INDEX)
510 Exynos_FlushInputBufferReturn(pOMXComponent, pDataBuffer[1]);
511 else if (nPortIndex == OUTPUT_PORT_INDEX)
512 Exynos_FlushOutputBufferReturn(pOMXComponent, pDataBuffer[1]);
515 if (pExynosComponent->bMultiThreadProcess == OMX_TRUE) {
516 if (pExynosPort->bufferProcessType & BUFFER_SHARE) {
517 if (pExynosPort->processData.bufferHeader != NULL) {
518 if (nPortIndex == INPUT_PORT_INDEX) {
519 Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);
520 } else if (nPortIndex == OUTPUT_PORT_INDEX) {
521 Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);
524 Exynos_ResetCodecData(&pExynosPort->processData);
526 for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
527 if (pExynosPort->extendBufferHeader[i].bBufferInOMX == OMX_TRUE) {
528 if (nPortIndex == OUTPUT_PORT_INDEX) {
529 Exynos_OMX_OutputBufferReturn(pOMXComponent,
530 pExynosPort->extendBufferHeader[i].OMXBufferHeader);
531 } else if (nPortIndex == INPUT_PORT_INDEX) {
532 Exynos_OMX_InputBufferReturn(pOMXComponent,
533 pExynosPort->extendBufferHeader[i].OMXBufferHeader);
539 Exynos_ResetCodecData(&pExynosPort->processData);
544 Exynos_OSAL_Get_SemaphoreCount(pExynosPort->bufferSemID, &cnt);
547 Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
549 Exynos_OSAL_ResetQueue(&pExynosPort->bufferQ);
557 OMX_ERRORTYPE Exynos_OMX_BufferFlush(
558 OMX_COMPONENTTYPE *pOMXComponent,
562 OMX_ERRORTYPE ret = OMX_ErrorNone;
563 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
564 EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
565 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
566 EXYNOS_OMX_DATABUFFER *pDataBuffer[2] = {NULL, NULL};
571 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "bufferFlush idx:%d", nPortIndex);
574 if (pOMXComponent == NULL) {
575 ret = OMX_ErrorBadParameter;
579 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
580 if (ret != OMX_ErrorNone) {
584 if (pOMXComponent->pComponentPrivate == NULL) {
585 ret = OMX_ErrorBadParameter;
588 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
590 if (pExynosComponent->hComponentHandle == NULL) {
591 ret = OMX_ErrorBadParameter;
594 pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
596 if ((nPortIndex < 0) ||
597 (nPortIndex >= pExynosComponent->portParam.nPorts)) {
598 ret = OMX_ErrorBadPortIndex;
601 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
603 Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush start, port:%d", nPortIndex);
605 pExynosPort->bIsPortFlushed = OMX_TRUE;
607 if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
608 Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
610 Exynos_OSAL_SignalSet(pExynosPort->pauseEvent);
613 Exynos_OMX_GetFlushBuffer(pExynosPort, pDataBuffer);
614 if (pDataBuffer[0] == NULL) {
615 ret = OMX_ErrorBadParameter;
619 if (pExynosPort->bufferProcessType & BUFFER_COPY)
620 Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
621 Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
623 pVideoEnc->exynos_codec_bufferProcessRun(pOMXComponent, nPortIndex);
625 Exynos_OSAL_MutexLock(pDataBuffer[0]->bufferMutex);
626 pVideoEnc->exynos_codec_stop(pOMXComponent, nPortIndex);
628 if (pDataBuffer[1] != NULL)
629 Exynos_OSAL_MutexLock(pDataBuffer[1]->bufferMutex);
631 ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex);
632 if (ret != OMX_ErrorNone)
635 if (pExynosPort->bufferProcessType & BUFFER_COPY)
636 pVideoEnc->exynos_codec_enqueueAllBuffer(pOMXComponent, nPortIndex);
637 Exynos_ResetCodecData(&pExynosPort->processData);
639 if (ret == OMX_ErrorNone) {
640 if (nPortIndex == INPUT_PORT_INDEX) {
641 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_TRUE;
642 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
643 Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
644 Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
645 pExynosComponent->getAllDelayBuffer = OMX_FALSE;
646 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
647 pExynosComponent->reInputData = OMX_FALSE;
650 pExynosPort->bIsPortFlushed = OMX_FALSE;
651 Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush EventCmdComplete, port:%d", nPortIndex);
652 if (bEvent == OMX_TRUE)
653 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
654 pExynosComponent->callbackData,
655 OMX_EventCmdComplete,
656 OMX_CommandFlush, nPortIndex, NULL);
659 if (pDataBuffer[1] != NULL)
660 Exynos_OSAL_MutexUnlock(pDataBuffer[1]->bufferMutex);
662 Exynos_OSAL_MutexUnlock(pDataBuffer[0]->bufferMutex);
665 if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
666 Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);
667 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
668 pExynosComponent->callbackData,
678 OMX_ERRORTYPE Exynos_InputBufferReturn(
679 OMX_COMPONENTTYPE *pOMXComponent)
681 OMX_ERRORTYPE ret = OMX_ErrorNone;
682 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
683 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
684 EXYNOS_OMX_DATABUFFER *pDataBuffer = NULL;
685 OMX_BUFFERHEADERTYPE *pBufferHdr = NULL;
689 if (pOMXComponent == NULL) {
690 ret = OMX_ErrorBadParameter;
694 if (pOMXComponent->pComponentPrivate == NULL) {
695 ret = OMX_ErrorBadParameter;
698 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
699 pExynosPort = &(pExynosComponent->pExynosPort[INPUT_PORT_INDEX]);
701 if (pExynosPort->bufferProcessType & BUFFER_COPY) {
702 pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
703 } else if (pExynosPort->bufferProcessType & BUFFER_SHARE) {
704 pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
707 pBufferHdr = pDataBuffer->bufferHeader;
709 if (pBufferHdr != NULL) {
710 if (pExynosPort->markType.hMarkTargetComponent != NULL) {
711 pBufferHdr->hMarkTargetComponent = pExynosPort->markType.hMarkTargetComponent;
712 pBufferHdr->pMarkData = pExynosPort->markType.pMarkData;
713 pExynosPort->markType.hMarkTargetComponent = NULL;
714 pExynosPort->markType.pMarkData = NULL;
717 if (pBufferHdr->hMarkTargetComponent != NULL) {
718 if (pBufferHdr->hMarkTargetComponent == pOMXComponent) {
719 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
720 pExynosComponent->callbackData,
722 0, 0, pBufferHdr->pMarkData);
724 pExynosComponent->propagateMarkType.hMarkTargetComponent = pBufferHdr->hMarkTargetComponent;
725 pExynosComponent->propagateMarkType.pMarkData = pBufferHdr->pMarkData;
729 pBufferHdr->nFilledLen = 0;
730 pBufferHdr->nOffset = 0;
731 Exynos_OMX_InputBufferReturn(pOMXComponent, pBufferHdr);
734 /* reset dataBuffer */
735 Exynos_ResetDataBuffer(pDataBuffer);
743 OMX_ERRORTYPE Exynos_FlushInputBufferReturn(
744 OMX_COMPONENTTYPE *pOMXComponent,
745 EXYNOS_OMX_DATABUFFER *pDataBuffer)
747 OMX_ERRORTYPE ret = OMX_ErrorNone;
748 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
749 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
750 OMX_BUFFERHEADERTYPE *pBufferHdr = NULL;
754 if (pOMXComponent == NULL) {
755 ret = OMX_ErrorBadParameter;
759 if (pOMXComponent->pComponentPrivate == NULL) {
760 ret = OMX_ErrorBadParameter;
763 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
764 pExynosPort = &(pExynosComponent->pExynosPort[INPUT_PORT_INDEX]);
766 pBufferHdr = pDataBuffer->bufferHeader;
768 if (pBufferHdr != NULL) {
769 if (pExynosPort->markType.hMarkTargetComponent != NULL) {
770 pBufferHdr->hMarkTargetComponent = pExynosPort->markType.hMarkTargetComponent;
771 pBufferHdr->pMarkData = pExynosPort->markType.pMarkData;
772 pExynosPort->markType.hMarkTargetComponent = NULL;
773 pExynosPort->markType.pMarkData = NULL;
776 if (pBufferHdr->hMarkTargetComponent != NULL) {
777 if (pBufferHdr->hMarkTargetComponent == pOMXComponent) {
778 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
779 pExynosComponent->callbackData,
781 0, 0, pBufferHdr->pMarkData);
783 pExynosComponent->propagateMarkType.hMarkTargetComponent = pBufferHdr->hMarkTargetComponent;
784 pExynosComponent->propagateMarkType.pMarkData = pBufferHdr->pMarkData;
788 pBufferHdr->nFilledLen = 0;
789 pBufferHdr->nOffset = 0;
790 Exynos_OMX_InputBufferReturn(pOMXComponent, pBufferHdr);
793 /* reset dataBuffer */
794 Exynos_ResetDataBuffer(pDataBuffer);
802 OMX_ERRORTYPE Exynos_InputBufferGetQueue(
803 EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
805 OMX_ERRORTYPE ret = OMX_ErrorUndefined;
806 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
807 EXYNOS_OMX_MESSAGE *pMessage = NULL;
808 EXYNOS_OMX_DATABUFFER *pDataBuffer = NULL;
812 if (pExynosComponent == NULL) {
813 ret = OMX_ErrorBadParameter;
816 pExynosPort = &(pExynosComponent->pExynosPort[INPUT_PORT_INDEX]);
817 pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
819 if (pExynosComponent->currentState != OMX_StateExecuting) {
820 ret = OMX_ErrorUndefined;
822 } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
823 (!CHECK_PORT_BEING_FLUSHED(pExynosPort))) {
824 Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
825 if (pDataBuffer->dataValid != OMX_TRUE) {
826 pMessage = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
827 if (pMessage == NULL) {
828 ret = OMX_ErrorUndefined;
831 if (pMessage->messageType == EXYNOS_OMX_CommandFakeBuffer) {
832 Exynos_OSAL_Free(pMessage);
833 ret = OMX_ErrorCodecFlush;
837 pDataBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(pMessage->pCmdData);
838 pDataBuffer->allocSize = pDataBuffer->bufferHeader->nAllocLen;
839 pDataBuffer->dataLen = pDataBuffer->bufferHeader->nFilledLen;
840 pDataBuffer->remainDataLen = pDataBuffer->dataLen;
841 pDataBuffer->usedDataLen = 0;
842 pDataBuffer->dataValid = OMX_TRUE;
843 pDataBuffer->nFlags = pDataBuffer->bufferHeader->nFlags;
844 pDataBuffer->timeStamp = pDataBuffer->bufferHeader->nTimeStamp;
846 Exynos_OSAL_Free(pMessage);
849 if (pDataBuffer->allocSize <= pDataBuffer->dataLen)
850 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", pDataBuffer->allocSize, pDataBuffer->dataLen);
861 OMX_ERRORTYPE Exynos_OutputBufferReturn(
862 OMX_COMPONENTTYPE *pOMXComponent)
864 OMX_ERRORTYPE ret = OMX_ErrorNone;
865 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
866 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
867 EXYNOS_OMX_DATABUFFER *pDataBuffer = NULL;
868 OMX_BUFFERHEADERTYPE *pBufferHdr = NULL;
872 if (pOMXComponent == NULL) {
873 ret = OMX_ErrorBadParameter;
877 if (pOMXComponent->pComponentPrivate == NULL) {
878 ret = OMX_ErrorBadParameter;
881 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
882 pExynosPort = &(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]);
884 pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
885 pBufferHdr = pDataBuffer->bufferHeader;
887 if (pBufferHdr != NULL) {
888 pBufferHdr->nFilledLen = pDataBuffer->remainDataLen;
889 pBufferHdr->nOffset = 0;
890 pBufferHdr->nFlags = pDataBuffer->nFlags;
891 pBufferHdr->nTimeStamp = pDataBuffer->timeStamp;
893 if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
894 pBufferHdr->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
895 pBufferHdr->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
896 pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
897 pExynosComponent->propagateMarkType.pMarkData = NULL;
900 if ((pBufferHdr->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
901 pBufferHdr->nFilledLen = 0;
902 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "event OMX_BUFFERFLAG_EOS!!!");
903 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
904 pExynosComponent->callbackData,
907 pBufferHdr->nFlags, NULL);
910 Exynos_OMX_OutputBufferReturn(pOMXComponent, pBufferHdr);
913 /* reset dataBuffer */
914 Exynos_ResetDataBuffer(pDataBuffer);
922 OMX_ERRORTYPE Exynos_FlushOutputBufferReturn(
923 OMX_COMPONENTTYPE *pOMXComponent,
924 EXYNOS_OMX_DATABUFFER *pDataBuffer)
926 OMX_ERRORTYPE ret = OMX_ErrorNone;
927 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
928 OMX_BUFFERHEADERTYPE *pBufferHdr = NULL;
932 if (pOMXComponent == NULL) {
933 ret = OMX_ErrorBadParameter;
937 if (pOMXComponent->pComponentPrivate == NULL) {
938 ret = OMX_ErrorBadParameter;
941 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
942 pBufferHdr = pDataBuffer->bufferHeader;
944 if (pBufferHdr != NULL) {
945 pBufferHdr->nFilledLen = pDataBuffer->remainDataLen;
946 pBufferHdr->nOffset = 0;
947 pBufferHdr->nFlags = pDataBuffer->nFlags;
948 pBufferHdr->nTimeStamp = pDataBuffer->timeStamp;
950 if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
951 pBufferHdr->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
952 pBufferHdr->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
953 pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
954 pExynosComponent->propagateMarkType.pMarkData = NULL;
957 if ((pBufferHdr->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
958 pBufferHdr->nFilledLen = 0;
959 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "event OMX_BUFFERFLAG_EOS!!!");
960 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
961 pExynosComponent->callbackData,
964 pBufferHdr->nFlags, NULL);
966 Exynos_OMX_OutputBufferReturn(pOMXComponent, pBufferHdr);
969 /* reset dataBuffer */
970 Exynos_ResetDataBuffer(pDataBuffer);
978 OMX_ERRORTYPE Exynos_OutputBufferGetQueue(
979 EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
981 OMX_ERRORTYPE ret = OMX_ErrorUndefined;
982 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
983 EXYNOS_OMX_MESSAGE *pMessage = NULL;
984 EXYNOS_OMX_DATABUFFER *pDataBuffer = NULL;
988 if (pExynosComponent == NULL) {
989 ret = OMX_ErrorBadParameter;
992 pExynosPort = &(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]);
994 if (pExynosPort->bufferProcessType & BUFFER_COPY) {
995 pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
996 } else if (pExynosPort->bufferProcessType & BUFFER_SHARE) {
997 pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
1000 if (pExynosComponent->currentState != OMX_StateExecuting) {
1001 ret = OMX_ErrorUndefined;
1003 } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
1004 (!CHECK_PORT_BEING_FLUSHED(pExynosPort))) {
1005 Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
1006 if (pDataBuffer->dataValid != OMX_TRUE) {
1007 pMessage = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
1008 if (pMessage == NULL) {
1009 ret = OMX_ErrorUndefined;
1012 if (pMessage->messageType == EXYNOS_OMX_CommandFakeBuffer) {
1013 Exynos_OSAL_Free(pMessage);
1014 ret = OMX_ErrorCodecFlush;
1018 pDataBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(pMessage->pCmdData);
1019 pDataBuffer->allocSize = pDataBuffer->bufferHeader->nAllocLen;
1020 pDataBuffer->dataLen = 0; //dataBuffer->bufferHeader->nFilledLen;
1021 pDataBuffer->remainDataLen = pDataBuffer->dataLen;
1022 pDataBuffer->usedDataLen = 0; //dataBuffer->bufferHeader->nOffset;
1023 pDataBuffer->dataValid = OMX_TRUE;
1024 /* pDataBuffer->nFlags = pDataBuffer->bufferHeader->nFlags; */
1025 /* pDtaBuffer->nTimeStamp = pDataBuffer->bufferHeader->nTimeStamp; */
1027 if (pExynosPort->bufferProcessType & BUFFER_SHARE)
1028 pDataBuffer->pPrivate = pDataBuffer->bufferHeader->pOutputPortPrivate;
1029 else if (pExynosPort->bufferProcessType & BUFFER_COPY) {
1030 pExynosPort->processData.dataBuffer = pDataBuffer->bufferHeader->pBuffer;
1031 pExynosPort->processData.allocSize = pDataBuffer->bufferHeader->nAllocLen;
1034 Exynos_OSAL_Free(pMessage);
1036 ret = OMX_ErrorNone;
1044 OMX_BUFFERHEADERTYPE *Exynos_OutputBufferGetQueue_Direct(
1045 EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
1047 OMX_BUFFERHEADERTYPE *pBufferHdr = NULL;
1048 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1049 EXYNOS_OMX_MESSAGE *pMessage = NULL;
1053 if (pExynosComponent == NULL) {
1057 pExynosPort = &(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]);
1059 if (pExynosComponent->currentState != OMX_StateExecuting) {
1062 } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
1063 (!CHECK_PORT_BEING_FLUSHED(pExynosPort))) {
1064 Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
1066 pMessage = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
1067 if (pMessage == NULL) {
1071 if (pMessage->messageType == EXYNOS_OMX_CommandFakeBuffer) {
1072 Exynos_OSAL_Free(pMessage);
1077 pBufferHdr = (OMX_BUFFERHEADERTYPE *)(pMessage->pCmdData);
1078 Exynos_OSAL_Free(pMessage);
1087 OMX_ERRORTYPE Exynos_CodecBufferEnqueue(
1088 EXYNOS_OMX_BASECOMPONENT *pExynosComponent,
1092 OMX_ERRORTYPE ret = OMX_ErrorNone;
1093 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1097 if (pExynosComponent == NULL) {
1098 ret = OMX_ErrorBadParameter;
1102 if ((nPortIndex < 0) ||
1103 (nPortIndex >= pExynosComponent->portParam.nPorts)) {
1104 ret = OMX_ErrorBadPortIndex;
1107 pExynosPort = &(pExynosComponent->pExynosPort[nPortIndex]);
1109 if (pData == NULL) {
1110 ret = OMX_ErrorInsufficientResources;
1114 ret = Exynos_OSAL_Queue(&pExynosPort->codecBufferQ, (void *)pData);
1116 ret = OMX_ErrorUndefined;
1119 Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
1121 ret = OMX_ErrorNone;
1129 OMX_ERRORTYPE Exynos_CodecBufferDequeue(
1130 EXYNOS_OMX_BASECOMPONENT *pExynosComponent,
1134 OMX_ERRORTYPE ret = OMX_ErrorNone;
1135 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1136 OMX_PTR pTempData = NULL;
1140 if (pExynosComponent == NULL) {
1141 ret = OMX_ErrorBadParameter;
1145 if ((nPortIndex < 0) ||
1146 (nPortIndex >= pExynosComponent->portParam.nPorts)) {
1147 ret = OMX_ErrorBadPortIndex;
1150 pExynosPort = &(pExynosComponent->pExynosPort[nPortIndex]);
1152 Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);
1153 pTempData = (OMX_PTR)Exynos_OSAL_Dequeue(&pExynosPort->codecBufferQ);
1154 if (pTempData != NULL) {
1155 *pData = (OMX_PTR)pTempData;
1156 ret = OMX_ErrorNone;
1159 ret = OMX_ErrorUndefined;
1168 OMX_ERRORTYPE Exynos_CodecBufferReset(
1169 EXYNOS_OMX_BASECOMPONENT *pExynosComponent,
1172 OMX_ERRORTYPE ret = OMX_ErrorNone;
1173 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1177 if (pExynosComponent == NULL) {
1178 ret = OMX_ErrorBadParameter;
1182 if ((nPortIndex < 0) ||
1183 (nPortIndex >= pExynosComponent->portParam.nPorts)) {
1184 ret = OMX_ErrorBadPortIndex;
1187 pExynosPort = &(pExynosComponent->pExynosPort[nPortIndex]);
1189 ret = Exynos_OSAL_ResetQueue(&pExynosPort->codecBufferQ);
1191 ret = OMX_ErrorUndefined;
1197 Exynos_OSAL_Get_SemaphoreCount(pExynosPort->codecSemID, &cnt);
1199 Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);
1203 ret = OMX_ErrorNone;
1211 OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetParameter(
1212 OMX_IN OMX_HANDLETYPE hComponent,
1213 OMX_IN OMX_INDEXTYPE nParamIndex,
1214 OMX_INOUT OMX_PTR pComponentParameterStructure)
1216 OMX_ERRORTYPE ret = OMX_ErrorNone;
1217 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1218 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1219 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1223 if (hComponent == NULL) {
1224 ret = OMX_ErrorBadParameter;
1227 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1229 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1230 if (ret != OMX_ErrorNone) {
1234 if (pOMXComponent->pComponentPrivate == NULL) {
1235 ret = OMX_ErrorBadParameter;
1238 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1240 if (pExynosComponent->currentState == OMX_StateInvalid) {
1241 ret = OMX_ErrorInvalidState;
1245 if (pComponentParameterStructure == NULL) {
1246 ret = OMX_ErrorBadParameter;
1250 switch (nParamIndex) {
1251 case OMX_IndexParamVideoInit:
1253 OMX_PORT_PARAM_TYPE *pPortParam = (OMX_PORT_PARAM_TYPE *)pComponentParameterStructure;
1254 ret = Exynos_OMX_Check_SizeVersion(pPortParam, sizeof(OMX_PORT_PARAM_TYPE));
1255 if (ret != OMX_ErrorNone) {
1259 pPortParam->nPorts = pExynosComponent->portParam.nPorts;
1260 pPortParam->nStartPortNumber = pExynosComponent->portParam.nStartPortNumber;
1261 ret = OMX_ErrorNone;
1264 case OMX_IndexParamVideoPortFormat:
1266 OMX_VIDEO_PARAM_PORTFORMATTYPE *pPortFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pComponentParameterStructure;
1267 OMX_U32 nPortIndex = pPortFormat->nPortIndex;
1268 OMX_U32 nIndex = pPortFormat->nIndex;
1269 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1270 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL;
1271 OMX_U32 nSupportFormat = 0;
1273 ret = Exynos_OMX_Check_SizeVersion(pPortFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
1274 if (ret != OMX_ErrorNone) {
1278 if ((nPortIndex < 0) ||
1279 (nPortIndex >= pExynosComponent->portParam.nPorts)) {
1280 ret = OMX_ErrorBadPortIndex;
1284 if (nPortIndex == INPUT_PORT_INDEX) {
1285 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1286 pPortDef = &pExynosPort->portDefinition;
1289 case supportFormat_0:
1290 pPortFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
1291 pPortFormat->eColorFormat = OMX_COLOR_FormatYUV420Planar;
1292 pPortFormat->xFramerate = pPortDef->format.video.xFramerate;
1294 case supportFormat_1:
1295 pPortFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
1296 pPortFormat->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
1297 pPortFormat->xFramerate = pPortDef->format.video.xFramerate;
1299 case supportFormat_2:
1300 pPortFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
1301 pPortFormat->eColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
1302 pPortFormat->xFramerate = pPortDef->format.video.xFramerate;
1304 case supportFormat_3:
1305 pPortFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
1306 pPortFormat->eColorFormat = OMX_SEC_COLOR_FormatNV21Linear;
1307 pPortFormat->xFramerate = pPortDef->format.video.xFramerate;
1309 case supportFormat_4:
1311 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "can not support this format");
1313 pPortFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
1314 pPortFormat->eColorFormat = OMX_COLOR_FormatAndroidOpaque;
1315 pPortFormat->xFramerate = pPortDef->format.video.xFramerate;
1318 case supportFormat_5:
1319 pPortFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
1320 pPortFormat->eColorFormat = OMX_SEC_COLOR_FormatNV12L_DmaBuf_Fd;
1321 pPortFormat->xFramerate = pPortDef->format.video.xFramerate;
1323 case supportFormat_6:
1324 pPortFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
1325 pPortFormat->eColorFormat = OMX_SEC_COLOR_FormatNV12T_DmaBuf_Fd;
1326 pPortFormat->xFramerate = pPortDef->format.video.xFramerate;
1329 if (nIndex > supportFormat_0) {
1330 ret = OMX_ErrorNoMore;
1335 } else if (nPortIndex == OUTPUT_PORT_INDEX) {
1336 nSupportFormat = OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;
1337 if (nIndex > nSupportFormat) {
1338 ret = OMX_ErrorNoMore;
1342 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1343 pPortDef = &pExynosPort->portDefinition;
1345 pPortFormat->eCompressionFormat = pPortDef->format.video.eCompressionFormat;
1346 pPortFormat->eColorFormat = pPortDef->format.video.eColorFormat;
1347 pPortFormat->xFramerate = pPortDef->format.video.xFramerate;
1349 ret = OMX_ErrorNone;
1352 case OMX_IndexParamVideoBitrate:
1354 OMX_VIDEO_PARAM_BITRATETYPE *pVideoBitrate = (OMX_VIDEO_PARAM_BITRATETYPE *)pComponentParameterStructure;
1355 OMX_U32 nPortIndex = pVideoBitrate->nPortIndex;
1356 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1357 EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
1358 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL;
1360 if (nPortIndex != OUTPUT_PORT_INDEX) {
1361 ret = OMX_ErrorBadPortIndex;
1364 pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1365 if (pVideoEnc == NULL) {
1366 ret = OMX_ErrorBadParameter;
1369 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
1370 pPortDef = &pExynosPort->portDefinition;
1372 pVideoBitrate->eControlRate = pVideoEnc->eControlRate[nPortIndex];
1373 pVideoBitrate->nTargetBitrate = pPortDef->format.video.nBitrate;
1375 ret = OMX_ErrorNone;
1378 case OMX_IndexParamVideoQuantization:
1380 OMX_VIDEO_PARAM_QUANTIZATIONTYPE *pVideoQuantization = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)pComponentParameterStructure;
1381 OMX_U32 nPortIndex = pVideoQuantization->nPortIndex;
1382 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1383 EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
1384 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL;
1386 if (nPortIndex != OUTPUT_PORT_INDEX) {
1387 ret = OMX_ErrorBadPortIndex;
1390 pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1391 if (pVideoEnc == NULL) {
1392 ret = OMX_ErrorBadParameter;
1395 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
1396 pPortDef = &pExynosPort->portDefinition;
1398 pVideoQuantization->nQpI = pVideoEnc->quantization.nQpI;
1399 pVideoQuantization->nQpP = pVideoEnc->quantization.nQpP;
1400 pVideoQuantization->nQpB = pVideoEnc->quantization.nQpB;
1402 ret = OMX_ErrorNone;
1405 case OMX_IndexParamPortDefinition:
1407 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = (OMX_PARAM_PORTDEFINITIONTYPE *)pComponentParameterStructure;
1408 OMX_U32 nPortIndex = pPortDef->nPortIndex;
1409 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1411 if ((nPortIndex < 0) ||
1412 (nPortIndex >= pExynosComponent->portParam.nPorts)) {
1413 ret = OMX_ErrorBadPortIndex;
1417 ret = Exynos_OMX_Check_SizeVersion(pPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
1418 if (ret != OMX_ErrorNone) {
1422 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
1423 Exynos_OSAL_Memcpy(pPortDef, &pExynosPort->portDefinition, pPortDef->nSize);
1425 #ifdef USE_STOREMETADATA
1426 if ((nPortIndex == 0) &&
1427 (pExynosPort->bStoreMetaData == OMX_TRUE)) {
1428 pPortDef->nBufferSize = MAX_INPUT_METADATA_BUFFER_SIZE;
1435 ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, pComponentParameterStructure);
1445 OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetParameter(
1446 OMX_IN OMX_HANDLETYPE hComponent,
1447 OMX_IN OMX_INDEXTYPE nParamIndex,
1448 OMX_IN OMX_PTR pComponentParameterStructure)
1450 OMX_ERRORTYPE ret = OMX_ErrorNone;
1451 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1452 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1453 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1457 if (hComponent == NULL) {
1458 ret = OMX_ErrorBadParameter;
1461 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1463 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1464 if (ret != OMX_ErrorNone) {
1468 if (pOMXComponent->pComponentPrivate == NULL) {
1469 ret = OMX_ErrorBadParameter;
1472 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1474 if (pExynosComponent->currentState == OMX_StateInvalid) {
1475 ret = OMX_ErrorInvalidState;
1479 if (pComponentParameterStructure == NULL) {
1480 ret = OMX_ErrorBadParameter;
1484 switch (nParamIndex) {
1485 case OMX_IndexParamVideoPortFormat:
1487 OMX_VIDEO_PARAM_PORTFORMATTYPE *pPortFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pComponentParameterStructure;
1488 OMX_U32 nPortIndex = pPortFormat->nPortIndex;
1489 OMX_U32 nIndex = pPortFormat->nIndex;
1490 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL;
1491 OMX_U32 nSupportFormat = 0;
1493 ret = Exynos_OMX_Check_SizeVersion(pPortFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
1494 if (ret != OMX_ErrorNone) {
1498 if ((nPortIndex < 0) ||
1499 (nPortIndex >= pExynosComponent->portParam.nPorts)) {
1500 ret = OMX_ErrorBadPortIndex;
1503 pPortDef = &(pExynosComponent->pExynosPort[nPortIndex].portDefinition);
1505 pPortDef->format.video.eColorFormat = pPortFormat->eColorFormat;
1506 pPortDef->format.video.eCompressionFormat = pPortFormat->eCompressionFormat;
1507 pPortDef->format.video.xFramerate = pPortFormat->xFramerate;
1510 case OMX_IndexParamVideoBitrate:
1512 OMX_VIDEO_PARAM_BITRATETYPE *pVideoBitrate = (OMX_VIDEO_PARAM_BITRATETYPE *)pComponentParameterStructure;
1513 OMX_U32 nPortIndex = pVideoBitrate->nPortIndex;
1514 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1515 EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
1516 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL;
1518 if (nPortIndex != OUTPUT_PORT_INDEX) {
1519 ret = OMX_ErrorBadPortIndex;
1522 pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1523 if (pVideoEnc == NULL) {
1524 ret = OMX_ErrorBadParameter;
1527 pPortDef = &(pExynosComponent->pExynosPort[nPortIndex].portDefinition);
1529 pVideoEnc->eControlRate[nPortIndex] = pVideoBitrate->eControlRate;
1530 pPortDef->format.video.nBitrate = pVideoBitrate->nTargetBitrate;
1532 ret = OMX_ErrorNone;
1535 case OMX_IndexParamVideoQuantization:
1537 OMX_VIDEO_PARAM_QUANTIZATIONTYPE *pVideoQuantization = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)pComponentParameterStructure;
1538 OMX_U32 nPortIndex = pVideoQuantization->nPortIndex;
1539 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1540 EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
1541 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL;
1543 if (nPortIndex != OUTPUT_PORT_INDEX) {
1544 ret = OMX_ErrorBadPortIndex;
1547 pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1548 if (pVideoEnc == NULL) {
1549 ret = OMX_ErrorBadParameter;
1552 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
1553 pPortDef = &pExynosPort->portDefinition;
1555 pVideoEnc->quantization.nQpI = pVideoQuantization->nQpI;
1556 pVideoEnc->quantization.nQpP = pVideoQuantization->nQpP;
1557 pVideoEnc->quantization.nQpB = pVideoQuantization->nQpB;
1559 ret = OMX_ErrorNone;
1562 case OMX_IndexParamPortDefinition:
1564 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = (OMX_PARAM_PORTDEFINITIONTYPE *)pComponentParameterStructure;
1565 OMX_U32 nPortIndex = pPortDef->nPortIndex;
1566 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1567 OMX_U32 width, height, size;
1569 if ((nPortIndex < 0) ||
1570 (nPortIndex >= pExynosComponent->portParam.nPorts)) {
1571 ret = OMX_ErrorBadPortIndex;
1575 ret = Exynos_OMX_Check_SizeVersion(pPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
1576 if (ret != OMX_ErrorNone) {
1580 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
1582 if ((pExynosComponent->currentState != OMX_StateLoaded) &&
1583 (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1584 if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
1585 ret = OMX_ErrorIncorrectStateOperation;
1590 if (pPortDef->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {
1591 ret = OMX_ErrorBadParameter;
1595 Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, pPortDef, pPortDef->nSize);
1596 if (nPortIndex == INPUT_PORT_INDEX) {
1597 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1598 Exynos_UpdateFrameSize(pOMXComponent);
1599 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosOutputPort->portDefinition.nBufferSize: %d",
1600 pExynosPort->portDefinition.nBufferSize);
1602 ret = OMX_ErrorNone;
1605 #ifdef USE_STOREMETADATA
1606 case OMX_IndexParamStoreMetaDataBuffer:
1608 ret = Exynos_OSAL_SetANBParameter(hComponent, nParamIndex, pComponentParameterStructure);
1614 ret = Exynos_OMX_SetParameter(hComponent, nParamIndex, pComponentParameterStructure);
1624 OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetConfig(
1625 OMX_HANDLETYPE hComponent,
1626 OMX_INDEXTYPE nParamIndex,
1627 OMX_PTR pComponentConfigStructure)
1629 OMX_ERRORTYPE ret = OMX_ErrorNone;
1630 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1631 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1635 if ((hComponent == NULL) ||
1636 (pComponentConfigStructure == NULL)) {
1637 ret = OMX_ErrorBadParameter;
1640 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1642 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1643 if (ret != OMX_ErrorNone) {
1647 if (pOMXComponent->pComponentPrivate == NULL) {
1648 ret = OMX_ErrorBadParameter;
1651 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1653 if (pExynosComponent->currentState == OMX_StateInvalid) {
1654 ret = OMX_ErrorInvalidState;
1658 switch (nParamIndex) {
1659 case OMX_IndexConfigVideoBitrate:
1661 OMX_VIDEO_CONFIG_BITRATETYPE *pConfigBitrate = (OMX_VIDEO_CONFIG_BITRATETYPE *)pComponentConfigStructure;
1662 OMX_U32 nPortIndex = pConfigBitrate->nPortIndex;
1663 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1665 if (nPortIndex != OUTPUT_PORT_INDEX) {
1666 ret = OMX_ErrorBadPortIndex;
1669 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
1670 pConfigBitrate->nEncodeBitrate = pExynosPort->portDefinition.format.video.nBitrate;
1674 case OMX_IndexConfigVideoFramerate:
1676 OMX_CONFIG_FRAMERATETYPE *pConfigFramerate = (OMX_CONFIG_FRAMERATETYPE *)pComponentConfigStructure;
1677 OMX_U32 nPortIndex = pConfigFramerate->nPortIndex;
1678 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1680 if (nPortIndex != OUTPUT_PORT_INDEX) {
1681 ret = OMX_ErrorBadPortIndex;
1684 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
1685 pConfigFramerate->xEncodeFramerate = pExynosPort->portDefinition.format.video.xFramerate;
1691 ret = Exynos_OMX_GetConfig(hComponent, nParamIndex, pComponentConfigStructure);
1701 OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetConfig(
1702 OMX_HANDLETYPE hComponent,
1703 OMX_INDEXTYPE nParamIndex,
1704 OMX_PTR pComponentConfigStructure)
1706 OMX_ERRORTYPE ret = OMX_ErrorNone;
1707 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1708 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1712 if ((hComponent == NULL) ||
1713 (pComponentConfigStructure == NULL)) {
1714 ret = OMX_ErrorBadParameter;
1717 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1719 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1720 if (ret != OMX_ErrorNone) {
1724 if (pOMXComponent->pComponentPrivate == NULL) {
1725 ret = OMX_ErrorBadParameter;
1728 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1730 if (pExynosComponent->currentState == OMX_StateInvalid) {
1731 ret = OMX_ErrorInvalidState;
1735 switch (nParamIndex) {
1736 case OMX_IndexConfigVideoBitrate:
1738 OMX_VIDEO_CONFIG_BITRATETYPE *pConfigBitrate = (OMX_VIDEO_CONFIG_BITRATETYPE *)pComponentConfigStructure;
1739 OMX_U32 nPortIndex = pConfigBitrate->nPortIndex;
1740 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1742 if (nPortIndex != OUTPUT_PORT_INDEX) {
1743 ret = OMX_ErrorBadPortIndex;
1746 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
1747 pExynosPort->portDefinition.format.video.nBitrate = pConfigBitrate->nEncodeBitrate;
1751 case OMX_IndexConfigVideoFramerate:
1753 OMX_CONFIG_FRAMERATETYPE *pConfigFramerate = (OMX_CONFIG_FRAMERATETYPE *)pComponentConfigStructure;
1754 OMX_U32 nPortIndex = pConfigFramerate->nPortIndex;
1755 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1757 if (nPortIndex != OUTPUT_PORT_INDEX) {
1758 ret = OMX_ErrorBadPortIndex;
1761 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
1762 pExynosPort->portDefinition.format.video.xFramerate = pConfigFramerate->xEncodeFramerate;
1766 case OMX_IndexConfigVideoIntraVOPRefresh:
1768 OMX_CONFIG_INTRAREFRESHVOPTYPE *pIntraRefreshVOP = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)pComponentConfigStructure;
1769 EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
1770 OMX_U32 nPortIndex = pIntraRefreshVOP->nPortIndex;
1772 if (pExynosComponent->hComponentHandle == NULL) {
1773 ret = OMX_ErrorBadParameter;
1776 pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1778 if (nPortIndex != OUTPUT_PORT_INDEX) {
1779 ret = OMX_ErrorBadPortIndex;
1782 pVideoEnc->IntraRefreshVOP = pIntraRefreshVOP->IntraRefreshVOP;
1788 ret = Exynos_OMX_SetConfig(hComponent, nParamIndex, pComponentConfigStructure);
1798 OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetExtensionIndex(
1799 OMX_IN OMX_HANDLETYPE hComponent,
1800 OMX_IN OMX_STRING szParamName,
1801 OMX_OUT OMX_INDEXTYPE *pIndexType)
1803 OMX_ERRORTYPE ret = OMX_ErrorNone;
1804 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1805 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1809 if (hComponent == NULL) {
1810 ret = OMX_ErrorBadParameter;
1813 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1815 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1816 if (ret != OMX_ErrorNone) {
1820 if (pOMXComponent->pComponentPrivate == NULL) {
1821 ret = OMX_ErrorBadParameter;
1824 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1826 if ((szParamName == NULL) || (pIndexType == NULL)) {
1827 ret = OMX_ErrorBadParameter;
1831 if (pExynosComponent->currentState == OMX_StateInvalid) {
1832 ret = OMX_ErrorInvalidState;
1836 #ifdef USE_STOREMETADATA
1837 if (Exynos_OSAL_Strcmp(szParamName, EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER) == 0) {
1838 *pIndexType = (OMX_INDEXTYPE)OMX_IndexParamStoreMetaDataBuffer;
1840 ret = Exynos_OMX_GetExtensionIndex(hComponent, szParamName, pIndexType);
1843 ret = Exynos_OMX_GetExtensionIndex(hComponent, szParamName, pIndexType);