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_Adec.c
21 * @author Yunji Kim (yunji.kim@samsung.com)
31 #include "Exynos_OMX_Macros.h"
32 #include "Exynos_OSAL_Event.h"
33 #include "Exynos_OMX_Adec.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"
42 #define EXYNOS_LOG_TAG "EXYNOS_AUDIO_DEC"
43 #define EXYNOS_LOG_OFF
44 #include "Exynos_OSAL_Log.h"
46 OMX_ERRORTYPE Exynos_OMX_UseBuffer(
47 OMX_IN OMX_HANDLETYPE hComponent,
48 OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,
49 OMX_IN OMX_U32 nPortIndex,
50 OMX_IN OMX_PTR pAppPrivate,
51 OMX_IN OMX_U32 nSizeBytes,
52 OMX_IN OMX_U8 *pBuffer)
54 OMX_ERRORTYPE ret = OMX_ErrorNone;
55 OMX_COMPONENTTYPE *pOMXComponent = NULL;
56 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
57 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
58 OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;
63 if (hComponent == NULL) {
64 ret = OMX_ErrorBadParameter;
67 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
68 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
69 if (ret != OMX_ErrorNone) {
73 if (pOMXComponent->pComponentPrivate == NULL) {
74 ret = OMX_ErrorBadParameter;
77 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
79 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
80 if (nPortIndex >= pExynosComponent->portParam.nPorts) {
81 ret = OMX_ErrorBadPortIndex;
84 if (pExynosPort->portState != OMX_StateIdle) {
85 ret = OMX_ErrorIncorrectStateOperation;
89 if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
90 ret = OMX_ErrorBadPortIndex;
94 temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
95 if (temp_bufferHeader == NULL) {
96 ret = OMX_ErrorInsufficientResources;
99 Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
101 for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
102 if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
103 pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
104 pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ASSIGNED | HEADER_STATE_ALLOCATED);
105 INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
106 temp_bufferHeader->pBuffer = pBuffer;
107 temp_bufferHeader->nAllocLen = nSizeBytes;
108 temp_bufferHeader->pAppPrivate = pAppPrivate;
109 if (nPortIndex == INPUT_PORT_INDEX)
110 temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
112 temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
114 pExynosPort->assignedBufferNum++;
115 if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
116 pExynosPort->portDefinition.bPopulated = OMX_TRUE;
117 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
118 Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
119 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
121 *ppBufferHdr = temp_bufferHeader;
127 Exynos_OSAL_Free(temp_bufferHeader);
128 ret = OMX_ErrorInsufficientResources;
136 OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
137 OMX_IN OMX_HANDLETYPE hComponent,
138 OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer,
139 OMX_IN OMX_U32 nPortIndex,
140 OMX_IN OMX_PTR pAppPrivate,
141 OMX_IN OMX_U32 nSizeBytes)
143 OMX_ERRORTYPE ret = OMX_ErrorNone;
144 OMX_COMPONENTTYPE *pOMXComponent = NULL;
145 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
146 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
147 OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;
148 OMX_U8 *temp_buffer = NULL;
153 if (hComponent == NULL) {
154 ret = OMX_ErrorBadParameter;
157 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
158 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
159 if (ret != OMX_ErrorNone) {
163 if (pOMXComponent->pComponentPrivate == NULL) {
164 ret = OMX_ErrorBadParameter;
167 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
169 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
170 if (nPortIndex >= pExynosComponent->portParam.nPorts) {
171 ret = OMX_ErrorBadPortIndex;
175 if (pExynosPort->portState != OMX_StateIdle ) {
176 ret = OMX_ErrorIncorrectStateOperation;
180 if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
181 ret = OMX_ErrorBadPortIndex;
185 temp_buffer = Exynos_OSAL_Malloc(sizeof(OMX_U8) * nSizeBytes);
186 if (temp_buffer == NULL) {
187 ret = OMX_ErrorInsufficientResources;
191 temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
192 if (temp_bufferHeader == NULL) {
193 Exynos_OSAL_Free(temp_buffer);
195 ret = OMX_ErrorInsufficientResources;
198 Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
200 for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
201 if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
202 pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
203 pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);
204 INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
205 temp_bufferHeader->pBuffer = temp_buffer;
206 temp_bufferHeader->nAllocLen = nSizeBytes;
207 temp_bufferHeader->pAppPrivate = pAppPrivate;
208 if (nPortIndex == INPUT_PORT_INDEX)
209 temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
211 temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
212 pExynosPort->assignedBufferNum++;
213 if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
214 pExynosPort->portDefinition.bPopulated = OMX_TRUE;
215 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
216 Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
217 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
219 *ppBuffer = temp_bufferHeader;
225 Exynos_OSAL_Free(temp_bufferHeader);
226 Exynos_OSAL_Free(temp_buffer);
227 ret = OMX_ErrorInsufficientResources;
235 OMX_ERRORTYPE Exynos_OMX_FreeBuffer(
236 OMX_IN OMX_HANDLETYPE hComponent,
237 OMX_IN OMX_U32 nPortIndex,
238 OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr)
240 OMX_ERRORTYPE ret = OMX_ErrorNone;
241 OMX_COMPONENTTYPE *pOMXComponent = NULL;
242 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
243 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
244 OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;
245 OMX_U8 *temp_buffer = NULL;
250 if (hComponent == NULL) {
251 ret = OMX_ErrorBadParameter;
254 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
255 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
256 if (ret != OMX_ErrorNone) {
260 if (pOMXComponent->pComponentPrivate == NULL) {
261 ret = OMX_ErrorBadParameter;
264 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
265 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
267 if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
268 ret = OMX_ErrorBadPortIndex;
272 if ((pExynosPort->portState != OMX_StateLoaded) && (pExynosPort->portState != OMX_StateInvalid)) {
273 (*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent,
274 pExynosComponent->callbackData,
275 (OMX_U32)OMX_EventError,
276 (OMX_U32)OMX_ErrorPortUnpopulated,
280 for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
281 if (((pExynosPort->bufferStateAllocate[i] | BUFFER_STATE_FREE) != 0) && (pExynosPort->extendBufferHeader[i].OMXBufferHeader != NULL)) {
282 if (pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer == pBufferHdr->pBuffer) {
283 if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) {
284 Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
285 pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer = NULL;
286 pBufferHdr->pBuffer = NULL;
287 } else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) {
290 pExynosPort->assignedBufferNum--;
291 if (pExynosPort->bufferStateAllocate[i] & HEADER_STATE_ALLOCATED) {
292 Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader);
293 pExynosPort->extendBufferHeader[i].OMXBufferHeader = NULL;
296 pExynosPort->bufferStateAllocate[i] = BUFFER_STATE_FREE;
304 if (ret == OMX_ErrorNone) {
305 if (pExynosPort->assignedBufferNum == 0) {
306 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosPort->unloadedResource signal set");
307 /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
308 Exynos_OSAL_SemaphorePost(pExynosPort->unloadedResource);
309 /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
310 pExynosPort->portDefinition.bPopulated = OMX_FALSE;
319 OMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
321 OMX_ERRORTYPE ret = OMX_ErrorNone;
322 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
323 OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;
324 OMX_U8 *temp_buffer = NULL;
325 OMX_U32 bufferSize = 0;
326 OMX_PARAM_PORTDEFINITIONTYPE portDefinition;
328 ret = OMX_ErrorTunnelingUnsupported;
333 OMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
335 OMX_ERRORTYPE ret = OMX_ErrorNone;
336 EXYNOS_OMX_BASEPORT* pExynosPort = NULL;
337 OMX_BUFFERHEADERTYPE* temp_bufferHeader = NULL;
338 OMX_U8 *temp_buffer = NULL;
339 OMX_U32 bufferSize = 0;
341 ret = OMX_ErrorTunnelingUnsupported;
346 OMX_ERRORTYPE Exynos_OMX_ComponentTunnelRequest(
347 OMX_IN OMX_HANDLETYPE hComp,
348 OMX_IN OMX_U32 nPort,
349 OMX_IN OMX_HANDLETYPE hTunneledComp,
350 OMX_IN OMX_U32 nTunneledPort,
351 OMX_INOUT OMX_TUNNELSETUPTYPE *pTunnelSetup)
353 OMX_ERRORTYPE ret = OMX_ErrorNone;
355 ret = OMX_ErrorTunnelingUnsupported;
360 OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
362 if ((pExynosComponent->currentState == OMX_StateExecuting) &&
363 (pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portState == OMX_StateIdle) &&
364 (pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portState == OMX_StateIdle) &&
365 (pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
366 (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToExecuting)) {
373 OMX_ERRORTYPE Exynos_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent)
375 OMX_ERRORTYPE ret = OMX_ErrorNone;
376 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
377 EXYNOS_OMX_BASEPORT *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
378 EXYNOS_OMX_BASEPORT *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
379 EXYNOS_OMX_DATABUFFER *dataBuffer = &exynosOMXInputPort->way.port1WayDataBuffer.dataBuffer;
380 OMX_BUFFERHEADERTYPE *bufferHeader = dataBuffer->bufferHeader;
384 if (bufferHeader != NULL) {
385 if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {
386 bufferHeader->hMarkTargetComponent = exynosOMXInputPort->markType.hMarkTargetComponent;
387 bufferHeader->pMarkData = exynosOMXInputPort->markType.pMarkData;
388 exynosOMXInputPort->markType.hMarkTargetComponent = NULL;
389 exynosOMXInputPort->markType.pMarkData = NULL;
392 if (bufferHeader->hMarkTargetComponent != NULL) {
393 if (bufferHeader->hMarkTargetComponent == pOMXComponent) {
394 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
395 pExynosComponent->callbackData,
397 0, 0, bufferHeader->pMarkData);
399 pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;
400 pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;
404 bufferHeader->nFilledLen = 0;
405 pExynosComponent->pCallbacks->EmptyBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
408 if ((pExynosComponent->currentState == OMX_StatePause) &&
409 ((!CHECK_PORT_BEING_FLUSHED(exynosOMXInputPort) && !CHECK_PORT_BEING_FLUSHED(exynosOMXOutputPort)))) {
410 Exynos_OSAL_SignalWait(pExynosComponent->pauseEvent, DEF_MAX_WAIT_TIME);
411 Exynos_OSAL_SignalReset(pExynosComponent->pauseEvent);
414 dataBuffer->dataValid = OMX_FALSE;
415 dataBuffer->dataLen = 0;
416 dataBuffer->remainDataLen = 0;
417 dataBuffer->usedDataLen = 0;
418 dataBuffer->bufferHeader = NULL;
419 dataBuffer->nFlags = 0;
420 dataBuffer->timeStamp = 0;
428 OMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
430 OMX_ERRORTYPE ret = OMX_ErrorNone;
431 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
432 EXYNOS_OMX_DATABUFFER *dataBuffer = NULL;
433 EXYNOS_OMX_MESSAGE *message = NULL;
437 pExynosPort= &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
438 dataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
440 if (pExynosComponent->currentState != OMX_StateExecuting) {
441 ret = OMX_ErrorUndefined;
444 Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
445 Exynos_OSAL_MutexLock(dataBuffer->bufferMutex);
446 if (dataBuffer->dataValid != OMX_TRUE) {
447 message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
448 if (message == NULL) {
449 ret = OMX_ErrorUndefined;
450 Exynos_OSAL_MutexUnlock(dataBuffer->bufferMutex);
454 dataBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
455 dataBuffer->allocSize = dataBuffer->bufferHeader->nAllocLen;
456 dataBuffer->dataLen = dataBuffer->bufferHeader->nFilledLen;
457 dataBuffer->remainDataLen = dataBuffer->dataLen;
458 dataBuffer->usedDataLen = 0;
459 dataBuffer->dataValid = OMX_TRUE;
460 dataBuffer->nFlags = dataBuffer->bufferHeader->nFlags;
461 dataBuffer->timeStamp = dataBuffer->bufferHeader->nTimeStamp;
463 Exynos_OSAL_Free(message);
465 #ifndef TIZEN_FEATURE_E3250
466 if (dataBuffer->allocSize <= dataBuffer->dataLen)
467 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", dataBuffer->allocSize, dataBuffer->dataLen);
470 Exynos_OSAL_MutexUnlock(dataBuffer->bufferMutex);
479 OMX_ERRORTYPE Exynos_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent)
481 OMX_ERRORTYPE ret = OMX_ErrorNone;
482 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
483 EXYNOS_OMX_BASEPORT *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
484 EXYNOS_OMX_BASEPORT *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
485 EXYNOS_OMX_DATABUFFER *dataBuffer = &exynosOMXOutputPort->way.port1WayDataBuffer.dataBuffer;
486 OMX_BUFFERHEADERTYPE *bufferHeader = dataBuffer->bufferHeader;
490 if (bufferHeader != NULL) {
491 bufferHeader->nFilledLen = dataBuffer->remainDataLen;
492 bufferHeader->nOffset = 0;
493 bufferHeader->nFlags = dataBuffer->nFlags;
494 bufferHeader->nTimeStamp = dataBuffer->timeStamp;
496 if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
497 bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
498 bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
499 pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
500 pExynosComponent->propagateMarkType.pMarkData = NULL;
503 if (bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) {
504 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
505 pExynosComponent->callbackData,
508 bufferHeader->nFlags, NULL);
511 pExynosComponent->pCallbacks->FillBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
514 if ((pExynosComponent->currentState == OMX_StatePause) &&
515 ((!CHECK_PORT_BEING_FLUSHED(exynosOMXInputPort) && !CHECK_PORT_BEING_FLUSHED(exynosOMXOutputPort)))) {
516 Exynos_OSAL_SignalWait(pExynosComponent->pauseEvent, DEF_MAX_WAIT_TIME);
517 Exynos_OSAL_SignalReset(pExynosComponent->pauseEvent);
520 /* reset dataBuffer */
521 dataBuffer->dataValid = OMX_FALSE;
522 dataBuffer->dataLen = 0;
523 dataBuffer->remainDataLen = 0;
524 dataBuffer->usedDataLen = 0;
525 dataBuffer->bufferHeader = NULL;
526 dataBuffer->nFlags = 0;
527 dataBuffer->timeStamp = 0;
535 OMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
537 OMX_ERRORTYPE ret = OMX_ErrorNone;
538 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
539 EXYNOS_OMX_DATABUFFER *dataBuffer = NULL;
540 EXYNOS_OMX_MESSAGE *message = NULL;
544 pExynosPort= &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
545 dataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
547 if (pExynosComponent->currentState != OMX_StateExecuting) {
548 ret = OMX_ErrorUndefined;
551 Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
552 Exynos_OSAL_MutexLock(dataBuffer->bufferMutex);
553 if (dataBuffer->dataValid != OMX_TRUE) {
554 message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
555 if (message == NULL) {
556 ret = OMX_ErrorUndefined;
557 Exynos_OSAL_MutexUnlock(dataBuffer->bufferMutex);
561 dataBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
562 dataBuffer->allocSize = dataBuffer->bufferHeader->nAllocLen;
563 dataBuffer->dataLen = 0; //dataBuffer->bufferHeader->nFilledLen;
564 dataBuffer->remainDataLen = dataBuffer->dataLen;
565 dataBuffer->usedDataLen = 0; //dataBuffer->bufferHeader->nOffset;
566 dataBuffer->dataValid = OMX_TRUE;
567 /* dataBuffer->nFlags = dataBuffer->bufferHeader->nFlags; */
568 /* dataBuffer->nTimeStamp = dataBuffer->bufferHeader->nTimeStamp; */
569 pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer = dataBuffer->bufferHeader->pBuffer;
570 pExynosPort->processData.allocSize = dataBuffer->bufferHeader->nAllocLen;
572 Exynos_OSAL_Free(message);
574 Exynos_OSAL_MutexUnlock(dataBuffer->bufferMutex);
584 OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent)
586 OMX_BOOL ret = OMX_FALSE;
587 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
588 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
589 EXYNOS_OMX_DATABUFFER *inputUseBuffer = &exynosInputPort->way.port1WayDataBuffer.dataBuffer;
590 EXYNOS_OMX_DATA *inputData = &exynosInputPort->processData;
591 OMX_U32 copySize = 0;
592 OMX_BYTE checkInputStream = NULL;
593 OMX_U32 checkInputStreamLen = 0;
594 OMX_U32 checkedSize = 0;
595 OMX_BOOL flagEOF = OMX_FALSE;
596 OMX_BOOL previousFrameEOF = OMX_FALSE;
600 if (inputUseBuffer->dataValid == OMX_TRUE) {
601 checkInputStream = inputUseBuffer->bufferHeader->pBuffer + inputUseBuffer->usedDataLen;
602 checkInputStreamLen = inputUseBuffer->remainDataLen;
604 if (inputData->dataLen == 0) {
605 previousFrameEOF = OMX_TRUE;
607 previousFrameEOF = OMX_FALSE;
610 /* Audio extractor should parse into frame units. */
612 checkedSize = checkInputStreamLen;
613 copySize = checkedSize;
615 if (inputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS)
616 pExynosComponent->bSaveFlagEOS = OMX_TRUE;
618 if (((inputData->allocSize) - (inputData->dataLen)) >= copySize) {
620 Exynos_OSAL_Memcpy(inputData->buffer.singlePlaneBuffer.dataBuffer + inputData->dataLen, checkInputStream, copySize);
622 inputUseBuffer->dataLen -= copySize;
623 inputUseBuffer->remainDataLen -= copySize;
624 inputUseBuffer->usedDataLen += copySize;
626 inputData->dataLen += copySize;
627 inputData->remainDataLen += copySize;
629 if (previousFrameEOF == OMX_TRUE) {
630 inputData->timeStamp = inputUseBuffer->timeStamp;
631 inputData->nFlags = inputUseBuffer->nFlags;
634 if (pExynosComponent->bUseFlagEOF == OMX_TRUE) {
635 if (pExynosComponent->bSaveFlagEOS == OMX_TRUE) {
636 inputData->nFlags |= OMX_BUFFERFLAG_EOS;
638 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
640 inputData->nFlags = (inputData->nFlags & (~OMX_BUFFERFLAG_EOS));
643 if ((checkedSize == checkInputStreamLen) && (pExynosComponent->bSaveFlagEOS == OMX_TRUE)) {
644 if ((inputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) &&
645 ((inputData->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ||
646 (inputData->dataLen == 0))) {
647 inputData->nFlags |= OMX_BUFFERFLAG_EOS;
649 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
650 } else if ((inputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) &&
651 (!(inputData->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) &&
652 (inputData->dataLen != 0)) {
653 inputData->nFlags = (inputData->nFlags & (~OMX_BUFFERFLAG_EOS));
655 pExynosComponent->bSaveFlagEOS = OMX_TRUE;
658 inputData->nFlags = (inputUseBuffer->nFlags & (~OMX_BUFFERFLAG_EOS));
662 /*????????????????????????????????? Error ?????????????????????????????????*/
663 Exynos_ResetCodecData(inputData);
667 if ((inputUseBuffer->remainDataLen == 0) ||
668 (CHECK_PORT_BEING_FLUSHED(exynosInputPort)))
669 Exynos_InputBufferReturn(pOMXComponent);
671 inputUseBuffer->dataValid = OMX_TRUE;
674 if (flagEOF == OMX_TRUE) {
675 if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
676 /* Flush SRP buffers */
679 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_TRUE;
680 pExynosComponent->checkTimeStamp.startTimeStamp = inputData->timeStamp;
681 pExynosComponent->checkTimeStamp.nStartFlags = inputData->nFlags;
682 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
683 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "first frame timestamp after seeking %lld us (%.2f secs)",
684 inputData->timeStamp, inputData->timeStamp / 1E6);
697 OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent)
699 OMX_BOOL ret = OMX_FALSE;
700 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
701 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
702 EXYNOS_OMX_DATABUFFER *outputUseBuffer = &exynosOutputPort->way.port1WayDataBuffer.dataBuffer;
703 EXYNOS_OMX_DATA *outputData = &exynosOutputPort->processData;
704 OMX_U32 copySize = 0;
708 if (outputUseBuffer->dataValid == OMX_TRUE) {
709 if (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp == OMX_TRUE) {
710 if (pExynosComponent->checkTimeStamp.startTimeStamp == outputData->timeStamp) {
711 pExynosComponent->checkTimeStamp.startTimeStamp = -19761123;
712 pExynosComponent->checkTimeStamp.nStartFlags = 0x0;
713 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
714 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
716 Exynos_ResetCodecData(outputData);
720 } else if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
721 Exynos_ResetCodecData(outputData);
726 if (outputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) {
727 copySize = outputData->remainDataLen;
729 outputUseBuffer->dataLen += copySize;
730 outputUseBuffer->remainDataLen += copySize;
731 outputUseBuffer->nFlags = outputData->nFlags;
732 outputUseBuffer->timeStamp = outputData->timeStamp;
736 /* reset outputData */
737 Exynos_ResetCodecData(outputData);
739 if ((outputUseBuffer->remainDataLen > 0) ||
740 (outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) ||
741 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))
742 Exynos_OutputBufferReturn(pOMXComponent);
744 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "output buffer is smaller than decoded data size Out Length");
748 /* reset outputData */
749 Exynos_ResetCodecData(outputData);
761 OMX_ERRORTYPE Exynos_OMX_BufferProcess(OMX_HANDLETYPE hComponent)
763 OMX_ERRORTYPE ret = OMX_ErrorNone;
764 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
765 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
766 EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
767 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
768 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
769 EXYNOS_OMX_DATABUFFER *inputUseBuffer = &exynosInputPort->way.port1WayDataBuffer.dataBuffer;
770 EXYNOS_OMX_DATABUFFER *outputUseBuffer = &exynosOutputPort->way.port1WayDataBuffer.dataBuffer;
771 EXYNOS_OMX_DATA *inputData = &exynosInputPort->processData;
772 EXYNOS_OMX_DATA *outputData = &exynosOutputPort->processData;
773 OMX_U32 copySize = 0;
775 pExynosComponent->reInputData = OMX_FALSE;
779 while (!pAudioDec->bExitBufferProcessThread) {
780 Exynos_OSAL_SleepMillisec(0);
782 if (((pExynosComponent->currentState == OMX_StatePause) ||
783 (pExynosComponent->currentState == OMX_StateIdle) ||
784 (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) ||
785 (pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle)) &&
786 (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToLoaded)&&
787 ((!CHECK_PORT_BEING_FLUSHED(exynosInputPort) && !CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))) {
788 Exynos_OSAL_SignalWait(pExynosComponent->pauseEvent, DEF_MAX_WAIT_TIME);
789 Exynos_OSAL_SignalReset(pExynosComponent->pauseEvent);
792 while ((Exynos_Check_BufferProcess_State(pExynosComponent)) && (!pAudioDec->bExitBufferProcessThread)) {
793 Exynos_OSAL_SleepMillisec(0);
795 Exynos_OSAL_MutexLock(outputUseBuffer->bufferMutex);
796 if ((outputUseBuffer->dataValid != OMX_TRUE) &&
797 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
798 Exynos_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
799 ret = Exynos_OutputBufferGetQueue(pExynosComponent);
800 if ((ret == OMX_ErrorUndefined) ||
801 (exynosInputPort->portState != OMX_StateIdle) ||
802 (exynosOutputPort->portState != OMX_StateIdle)) {
806 Exynos_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
809 if (pExynosComponent->reInputData == OMX_FALSE) {
810 Exynos_OSAL_MutexLock(inputUseBuffer->bufferMutex);
811 if ((Exynos_Preprocessor_InputData(pOMXComponent) == OMX_FALSE) &&
812 (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) {
813 Exynos_OSAL_MutexUnlock(inputUseBuffer->bufferMutex);
814 ret = Exynos_InputBufferGetQueue(pExynosComponent);
818 Exynos_OSAL_MutexUnlock(inputUseBuffer->bufferMutex);
821 Exynos_OSAL_MutexLock(inputUseBuffer->bufferMutex);
822 Exynos_OSAL_MutexLock(outputUseBuffer->bufferMutex);
823 ret = pAudioDec->exynos_codec_bufferProcess(pOMXComponent, inputData, outputData);
824 Exynos_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
825 Exynos_OSAL_MutexUnlock(inputUseBuffer->bufferMutex);
827 if (ret == OMX_ErrorInputDataDecodeYet)
828 pExynosComponent->reInputData = OMX_TRUE;
830 pExynosComponent->reInputData = OMX_FALSE;
832 Exynos_OSAL_MutexLock(outputUseBuffer->bufferMutex);
833 Exynos_Postprocess_OutputData(pOMXComponent);
834 Exynos_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
845 OMX_ERRORTYPE Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_DATABUFFER **pDataBuffer)
847 OMX_ERRORTYPE ret = OMX_ErrorNone;
851 if (pExynosPort->portWayType == WAY2_PORT) {
853 ret = OMX_ErrorBadParameter;
857 *pDataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
865 OMX_ERRORTYPE Exynos_OMX_FlushPort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
867 OMX_ERRORTYPE ret = OMX_ErrorNone;
868 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
869 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
870 EXYNOS_OMX_DATABUFFER *flushPortBuffer = NULL;
871 OMX_BUFFERHEADERTYPE *bufferHeader = NULL;
872 EXYNOS_OMX_MESSAGE *message = NULL;
873 OMX_U32 flushNum = 0;
874 OMX_S32 semValue = 0;
877 #ifdef TIZEN_FEATURE_E3250
878 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "flushPort idx:%d", portIndex);
881 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
882 while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
883 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &semValue);
885 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[portIndex].bufferSemID);
886 Exynos_OSAL_SemaphoreTryWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
888 message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
889 if (message != NULL) {
890 bufferHeader = (OMX_BUFFERHEADERTYPE *)message->pCmdData;
891 bufferHeader->nFilledLen = 0;
893 if (portIndex == OUTPUT_PORT_INDEX) {
894 pExynosComponent->pCallbacks->FillBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
896 pExynosComponent->pCallbacks->EmptyBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
899 Exynos_OSAL_Free(message);
904 Exynos_OMX_GetFlushBuffer(pExynosPort, &flushPortBuffer);
905 if (flushPortBuffer != NULL) {
906 if (flushPortBuffer->dataValid == OMX_TRUE) {
907 if (portIndex == INPUT_PORT_INDEX)
908 Exynos_InputBufferReturn(pOMXComponent);
909 else if (portIndex == OUTPUT_PORT_INDEX)
910 Exynos_OutputBufferReturn(pOMXComponent);
916 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &cnt);
919 Exynos_OSAL_SemaphoreTryWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
921 Exynos_OSAL_SetElemNum(&pExynosPort->bufferQ, 0);
923 pExynosPort->processData.dataLen = 0;
924 pExynosPort->processData.nFlags = 0;
925 pExynosPort->processData.remainDataLen = 0;
926 pExynosPort->processData.timeStamp = 0;
927 pExynosPort->processData.usedDataLen = 0;
935 OMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)
937 OMX_ERRORTYPE ret = OMX_ErrorNone;
938 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
939 EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = NULL;
940 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
941 EXYNOS_OMX_DATABUFFER *flushPortBuffer = NULL;
942 OMX_U32 i = 0, cnt = 0;
945 #ifdef TIZEN_FEATURE_E3250
946 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "bufferFlush idx:%d", nPortIndex);
949 if (pOMXComponent == NULL) {
950 ret = OMX_ErrorBadParameter;
953 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
954 if (ret != OMX_ErrorNone) {
958 if (pOMXComponent->pComponentPrivate == NULL) {
959 ret = OMX_ErrorBadParameter;
962 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
963 pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
965 Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
967 pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_TRUE;
969 pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
970 Exynos_OMX_GetFlushBuffer(pExynosPort, &flushPortBuffer);
972 Exynos_OSAL_MutexLock(flushPortBuffer->bufferMutex);
973 ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex);
974 Exynos_OSAL_MutexUnlock(flushPortBuffer->bufferMutex);
976 pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_FALSE;
978 if (bEvent == OMX_TRUE && ret == OMX_ErrorNone) {
979 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
980 pExynosComponent->callbackData,
981 OMX_EventCmdComplete,
982 OMX_CommandFlush, nPortIndex, NULL);
985 if (nPortIndex == INPUT_PORT_INDEX) {
986 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_TRUE;
987 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
988 Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
989 Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
990 pExynosComponent->getAllDelayBuffer = OMX_FALSE;
991 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
992 pExynosComponent->reInputData = OMX_FALSE;
996 if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
997 Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);
998 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
999 pExynosComponent->callbackData,
1009 OMX_ERRORTYPE Exynos_OMX_AudioDecodeGetParameter(
1010 OMX_IN OMX_HANDLETYPE hComponent,
1011 OMX_IN OMX_INDEXTYPE nParamIndex,
1012 OMX_INOUT OMX_PTR ComponentParameterStructure)
1014 OMX_ERRORTYPE ret = OMX_ErrorNone;
1015 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1016 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1017 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1021 if (hComponent == NULL) {
1022 ret = OMX_ErrorBadParameter;
1025 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1026 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1027 if (ret != OMX_ErrorNone) {
1031 if (pOMXComponent->pComponentPrivate == NULL) {
1032 ret = OMX_ErrorBadParameter;
1035 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1037 if (pExynosComponent->currentState == OMX_StateInvalid ) {
1038 ret = OMX_ErrorInvalidState;
1042 if (ComponentParameterStructure == NULL) {
1043 ret = OMX_ErrorBadParameter;
1047 switch (nParamIndex) {
1048 case OMX_IndexParamAudioInit:
1050 OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
1051 ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));
1052 if (ret != OMX_ErrorNone) {
1056 portParam->nPorts = pExynosComponent->portParam.nPorts;
1057 portParam->nStartPortNumber = pExynosComponent->portParam.nStartPortNumber;
1058 ret = OMX_ErrorNone;
1061 case OMX_IndexParamAudioPortFormat:
1063 OMX_AUDIO_PARAM_PORTFORMATTYPE *portFormat = (OMX_AUDIO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
1064 OMX_U32 portIndex = portFormat->nPortIndex;
1065 OMX_U32 index = portFormat->nIndex;
1066 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1067 OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;
1068 OMX_U32 supportFormatNum = 0; /* supportFormatNum = N-1 */
1070 ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE));
1071 if (ret != OMX_ErrorNone) {
1075 if ((portIndex >= pExynosComponent->portParam.nPorts)) {
1076 ret = OMX_ErrorBadPortIndex;
1081 if (portIndex == INPUT_PORT_INDEX) {
1082 supportFormatNum = INPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;
1083 if (index > supportFormatNum) {
1084 ret = OMX_ErrorNoMore;
1088 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1089 portDefinition = &pExynosPort->portDefinition;
1091 portFormat->eEncoding = portDefinition->format.audio.eEncoding;
1092 } else if (portIndex == OUTPUT_PORT_INDEX) {
1093 supportFormatNum = OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;
1094 if (index > supportFormatNum) {
1095 ret = OMX_ErrorNoMore;
1099 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1100 portDefinition = &pExynosPort->portDefinition;
1102 portFormat->eEncoding = portDefinition->format.audio.eEncoding;
1104 ret = OMX_ErrorNone;
1109 ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
1119 OMX_ERRORTYPE Exynos_OMX_AudioDecodeSetParameter(
1120 OMX_IN OMX_HANDLETYPE hComponent,
1121 OMX_IN OMX_INDEXTYPE nIndex,
1122 OMX_IN OMX_PTR ComponentParameterStructure)
1124 OMX_ERRORTYPE ret = OMX_ErrorNone;
1125 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1126 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1127 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1131 if (hComponent == NULL) {
1132 ret = OMX_ErrorBadParameter;
1135 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1136 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1137 if (ret != OMX_ErrorNone) {
1141 if (pOMXComponent->pComponentPrivate == NULL) {
1142 ret = OMX_ErrorBadParameter;
1145 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1147 if (pExynosComponent->currentState == OMX_StateInvalid ) {
1148 ret = OMX_ErrorInvalidState;
1152 if (ComponentParameterStructure == NULL) {
1153 ret = OMX_ErrorBadParameter;
1158 case OMX_IndexParamAudioPortFormat:
1160 OMX_AUDIO_PARAM_PORTFORMATTYPE *portFormat = (OMX_AUDIO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
1161 OMX_U32 portIndex = portFormat->nPortIndex;
1162 OMX_U32 index = portFormat->nIndex;
1163 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1164 OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;
1165 OMX_U32 supportFormatNum = 0; /* supportFormatNum = N-1 */
1167 ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE));
1168 if (ret != OMX_ErrorNone) {
1172 if ((portIndex >= pExynosComponent->portParam.nPorts)) {
1173 ret = OMX_ErrorBadPortIndex;
1177 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1178 portDefinition = &pExynosPort->portDefinition;
1180 portDefinition->format.audio.eEncoding = portFormat->eEncoding;
1181 ret = OMX_ErrorNone;
1186 ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure);
1197 OMX_ERRORTYPE Exynos_OMX_AudioDecodeGetConfig(
1198 OMX_HANDLETYPE hComponent,
1199 OMX_INDEXTYPE nIndex,
1200 OMX_PTR pComponentConfigStructure)
1202 OMX_ERRORTYPE ret = OMX_ErrorNone;
1203 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1204 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1208 if (hComponent == NULL) {
1209 ret = OMX_ErrorBadParameter;
1212 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1213 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1214 if (ret != OMX_ErrorNone) {
1218 if (pOMXComponent->pComponentPrivate == NULL) {
1219 ret = OMX_ErrorBadParameter;
1222 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1224 if (pComponentConfigStructure == NULL) {
1225 ret = OMX_ErrorBadParameter;
1228 if (pExynosComponent->currentState == OMX_StateInvalid) {
1229 ret = OMX_ErrorInvalidState;
1235 ret = Exynos_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure);
1245 OMX_ERRORTYPE Exynos_OMX_AudioDecodeSetConfig(
1246 OMX_HANDLETYPE hComponent,
1247 OMX_INDEXTYPE nIndex,
1248 OMX_PTR pComponentConfigStructure)
1250 OMX_ERRORTYPE ret = OMX_ErrorNone;
1251 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1252 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1256 if (hComponent == NULL) {
1257 ret = OMX_ErrorBadParameter;
1260 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1261 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1262 if (ret != OMX_ErrorNone) {
1266 if (pOMXComponent->pComponentPrivate == NULL) {
1267 ret = OMX_ErrorBadParameter;
1270 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1272 if (pComponentConfigStructure == NULL) {
1273 ret = OMX_ErrorBadParameter;
1276 if (pExynosComponent->currentState == OMX_StateInvalid) {
1277 ret = OMX_ErrorInvalidState;
1282 case OMX_IndexConfigAudioMute:
1284 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_IndexConfigAudioMute");
1285 ret = OMX_ErrorUnsupportedIndex;
1288 case OMX_IndexConfigAudioVolume:
1290 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_IndexConfigAudioVolume");
1291 ret = OMX_ErrorUnsupportedIndex;
1295 ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure);
1305 OMX_ERRORTYPE Exynos_OMX_AudioDecodeGetExtensionIndex(
1306 OMX_IN OMX_HANDLETYPE hComponent,
1307 OMX_IN OMX_STRING cParameterName,
1308 OMX_OUT OMX_INDEXTYPE *pIndexType)
1310 OMX_ERRORTYPE ret = OMX_ErrorNone;
1311 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1312 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1316 if (hComponent == NULL) {
1317 ret = OMX_ErrorBadParameter;
1320 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1321 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1322 if (ret != OMX_ErrorNone) {
1326 if (pOMXComponent->pComponentPrivate == NULL) {
1327 ret = OMX_ErrorBadParameter;
1330 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1332 if ((cParameterName == NULL) || (pIndexType == NULL)) {
1333 ret = OMX_ErrorBadParameter;
1336 if (pExynosComponent->currentState == OMX_StateInvalid) {
1337 ret = OMX_ErrorInvalidState;
1341 ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
1349 static OMX_ERRORTYPE Exynos_OMX_BufferProcessThread(OMX_PTR threadData)
1351 OMX_ERRORTYPE ret = OMX_ErrorNone;
1352 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1353 EXYNOS_OMX_BASECOMPONENT *pSECComponent = NULL;
1354 EXYNOS_OMX_MESSAGE *message = NULL;
1358 if (threadData == NULL) {
1359 ret = OMX_ErrorBadParameter;
1362 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
1363 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1364 if (ret != OMX_ErrorNone) {
1367 pSECComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1368 Exynos_OMX_BufferProcess(pOMXComponent);
1370 Exynos_OSAL_ThreadExit(NULL);
1378 OMX_ERRORTYPE Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent)
1380 OMX_ERRORTYPE ret = OMX_ErrorNone;
1381 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1382 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1383 EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1387 pAudioDec->bExitBufferProcessThread = OMX_FALSE;
1389 ret = Exynos_OSAL_ThreadCreate(&pAudioDec->hBufferProcessThread,
1390 Exynos_OMX_BufferProcessThread,
1399 OMX_ERRORTYPE Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent)
1401 OMX_ERRORTYPE ret = OMX_ErrorNone;
1402 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1403 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1404 EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1405 OMX_S32 countValue = 0;
1410 pAudioDec->bExitBufferProcessThread = OMX_TRUE;
1412 for (i = 0; i < ALL_PORT_NUM; i++) {
1413 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[i].bufferSemID, &countValue);
1414 if (countValue == 0)
1415 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[i].bufferSemID);
1418 Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
1419 Exynos_OSAL_ThreadTerminate(pAudioDec->hBufferProcessThread);
1420 pAudioDec->hBufferProcessThread = NULL;
1428 OMX_ERRORTYPE Exynos_OMX_AudioDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent)
1430 OMX_ERRORTYPE ret = OMX_ErrorNone;
1431 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1432 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1433 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1434 EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = NULL;
1438 if (hComponent == NULL) {
1439 ret = OMX_ErrorBadParameter;
1442 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1443 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1444 if (ret != OMX_ErrorNone) {
1445 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1449 ret = Exynos_OMX_BaseComponent_Constructor(pOMXComponent);
1450 if (ret != OMX_ErrorNone) {
1451 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1455 ret = Exynos_OMX_Port_Constructor(pOMXComponent);
1456 if (ret != OMX_ErrorNone) {
1457 Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
1458 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1462 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1464 pAudioDec = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_AUDIODEC_COMPONENT));
1465 if (pAudioDec == NULL) {
1466 Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
1467 ret = OMX_ErrorInsufficientResources;
1468 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1472 Exynos_OSAL_Memset(pAudioDec, 0, sizeof(EXYNOS_OMX_AUDIODEC_COMPONENT));
1473 pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pAudioDec;
1474 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
1475 pExynosComponent->bMultiThreadProcess = OMX_FALSE;
1478 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1479 pExynosPort->portDefinition.nBufferCountActual = MAX_AUDIO_INPUTBUFFER_NUM;
1480 pExynosPort->portDefinition.nBufferCountMin = MAX_AUDIO_INPUTBUFFER_NUM;
1481 pExynosPort->portDefinition.nBufferSize = DEFAULT_AUDIO_INPUT_BUFFER_SIZE;
1482 pExynosPort->portDefinition.eDomain = OMX_PortDomainAudio;
1484 pExynosPort->portDefinition.format.audio.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
1485 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.audio.cMIMEType, "audio/raw");
1486 pExynosPort->portDefinition.format.audio.pNativeRender = 0;
1487 pExynosPort->portDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
1488 pExynosPort->portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingUnused;
1491 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1492 pExynosPort->portDefinition.nBufferCountActual = MAX_AUDIO_OUTPUTBUFFER_NUM;
1493 pExynosPort->portDefinition.nBufferCountMin = MAX_AUDIO_OUTPUTBUFFER_NUM;
1494 pExynosPort->portDefinition.nBufferSize = DEFAULT_AUDIO_OUTPUT_BUFFER_SIZE;
1495 pExynosPort->portDefinition.eDomain = OMX_PortDomainAudio;
1497 pExynosPort->portDefinition.format.audio.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
1498 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.audio.cMIMEType, "audio/raw");
1499 pExynosPort->portDefinition.format.audio.pNativeRender = 0;
1500 pExynosPort->portDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
1501 pExynosPort->portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingUnused;
1504 pOMXComponent->UseBuffer = &Exynos_OMX_UseBuffer;
1505 pOMXComponent->AllocateBuffer = &Exynos_OMX_AllocateBuffer;
1506 pOMXComponent->FreeBuffer = &Exynos_OMX_FreeBuffer;
1507 pOMXComponent->ComponentTunnelRequest = &Exynos_OMX_ComponentTunnelRequest;
1509 pExynosComponent->exynos_AllocateTunnelBuffer = &Exynos_OMX_AllocateTunnelBuffer;
1510 pExynosComponent->exynos_FreeTunnelBuffer = &Exynos_OMX_FreeTunnelBuffer;
1511 pExynosComponent->exynos_BufferProcessCreate = &Exynos_OMX_BufferProcess_Create;
1512 pExynosComponent->exynos_BufferProcessTerminate = &Exynos_OMX_BufferProcess_Terminate;
1513 pExynosComponent->exynos_BufferFlush = &Exynos_OMX_BufferFlush;
1521 OMX_ERRORTYPE Exynos_OMX_AudioDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent)
1523 OMX_ERRORTYPE ret = OMX_ErrorNone;
1524 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1525 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1526 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1527 EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = NULL;
1532 if (hComponent == NULL) {
1533 ret = OMX_ErrorBadParameter;
1536 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1537 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1538 if (ret != OMX_ErrorNone) {
1542 if (pOMXComponent->pComponentPrivate == NULL) {
1543 ret = OMX_ErrorBadParameter;
1546 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1548 pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1549 Exynos_OSAL_Free(pAudioDec);
1550 pExynosComponent->hComponentHandle = pAudioDec = NULL;
1552 for(i = 0; i < ALL_PORT_NUM; i++) {
1553 pExynosPort = &pExynosComponent->pExynosPort[i];
1554 Exynos_OSAL_Free(pExynosPort->portDefinition.format.audio.cMIMEType);
1555 pExynosPort->portDefinition.format.audio.cMIMEType = NULL;
1558 ret = Exynos_OMX_Port_Destructor(pOMXComponent);
1560 ret = Exynos_OMX_BaseComponent_Destructor(hComponent);