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_Mp3dec.c
21 * @author Yunji Kim (yunji.kim@samsung.com)
31 #include "Exynos_OMX_Macros.h"
32 #include "Exynos_OMX_Basecomponent.h"
33 #include "Exynos_OMX_Baseport.h"
34 #include "Exynos_OMX_Adec.h"
35 #include "Exynos_OSAL_ETC.h"
36 #include "Exynos_OSAL_Semaphore.h"
37 #include "Exynos_OSAL_Thread.h"
38 #include "library_register.h"
39 #include "Exynos_OMX_Mp3dec.h"
43 #define EXYNOS_LOG_TAG "EXYNOS_MP3_DEC"
44 #define EXYNOS_LOG_OFF
45 #include "Exynos_OSAL_Log.h"
47 //#define SRP_DUMP_TO_FILE
48 #ifdef SRP_DUMP_TO_FILE
55 OMX_ERRORTYPE Exynos_SRP_Mp3Dec_GetParameter(
56 OMX_IN OMX_HANDLETYPE hComponent,
57 OMX_IN OMX_INDEXTYPE nParamIndex,
58 OMX_INOUT OMX_PTR pComponentParameterStructure)
60 OMX_ERRORTYPE ret = OMX_ErrorNone;
61 OMX_COMPONENTTYPE *pOMXComponent = NULL;
62 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
66 if (hComponent == NULL || pComponentParameterStructure == NULL) {
67 ret = OMX_ErrorBadParameter;
70 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
71 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
72 if (ret != OMX_ErrorNone) {
75 if (pOMXComponent->pComponentPrivate == NULL) {
76 ret = OMX_ErrorBadParameter;
80 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
81 if (pExynosComponent->currentState == OMX_StateInvalid ) {
82 ret = OMX_ErrorInvalidState;
86 switch (nParamIndex) {
87 case OMX_IndexParamAudioMp3:
89 OMX_AUDIO_PARAM_MP3TYPE *pDstMp3Param = (OMX_AUDIO_PARAM_MP3TYPE *)pComponentParameterStructure;
90 OMX_AUDIO_PARAM_MP3TYPE *pSrcMp3Param = NULL;
91 EXYNOS_MP3_HANDLE *pMp3Dec = NULL;
93 ret = Exynos_OMX_Check_SizeVersion(pDstMp3Param, sizeof(OMX_AUDIO_PARAM_MP3TYPE));
94 if (ret != OMX_ErrorNone) {
98 if (pDstMp3Param->nPortIndex >= ALL_PORT_NUM) {
99 ret = OMX_ErrorBadPortIndex;
103 pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
104 pSrcMp3Param = &pMp3Dec->mp3Param;
106 Exynos_OSAL_Memcpy(pDstMp3Param, pSrcMp3Param, sizeof(OMX_AUDIO_PARAM_MP3TYPE));
109 case OMX_IndexParamAudioPcm:
111 OMX_AUDIO_PARAM_PCMMODETYPE *pDstPcmParam = (OMX_AUDIO_PARAM_PCMMODETYPE *)pComponentParameterStructure;
112 OMX_AUDIO_PARAM_PCMMODETYPE *pSrcPcmParam = NULL;
113 EXYNOS_MP3_HANDLE *pMp3Dec = NULL;
115 ret = Exynos_OMX_Check_SizeVersion(pDstPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
116 if (ret != OMX_ErrorNone) {
120 if (pDstPcmParam->nPortIndex >= ALL_PORT_NUM) {
121 ret = OMX_ErrorBadPortIndex;
125 pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
126 pSrcPcmParam = &pMp3Dec->pcmParam;
128 Exynos_OSAL_Memcpy(pDstPcmParam, pSrcPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
131 case OMX_IndexParamStandardComponentRole:
133 OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
135 ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
136 if (ret != OMX_ErrorNone) {
140 Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MP3_DEC_ROLE);
144 ret = Exynos_OMX_AudioDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
153 OMX_ERRORTYPE Exynos_SRP_Mp3Dec_SetParameter(
154 OMX_IN OMX_HANDLETYPE hComponent,
155 OMX_IN OMX_INDEXTYPE nIndex,
156 OMX_IN OMX_PTR pComponentParameterStructure)
158 OMX_ERRORTYPE ret = OMX_ErrorNone;
159 OMX_COMPONENTTYPE *pOMXComponent = NULL;
160 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
164 if (hComponent == NULL || pComponentParameterStructure == NULL) {
165 ret = OMX_ErrorBadParameter;
168 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
169 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
170 if (ret != OMX_ErrorNone) {
173 if (pOMXComponent->pComponentPrivate == NULL) {
174 ret = OMX_ErrorBadParameter;
178 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
179 if (pExynosComponent->currentState == OMX_StateInvalid ) {
180 ret = OMX_ErrorInvalidState;
185 case OMX_IndexParamAudioMp3:
187 OMX_AUDIO_PARAM_MP3TYPE *pDstMp3Param = NULL;
188 OMX_AUDIO_PARAM_MP3TYPE *pSrcMp3Param = (OMX_AUDIO_PARAM_MP3TYPE *)pComponentParameterStructure;
189 EXYNOS_MP3_HANDLE *pMp3Dec = NULL;
191 ret = Exynos_OMX_Check_SizeVersion(pSrcMp3Param, sizeof(OMX_AUDIO_PARAM_MP3TYPE));
192 if (ret != OMX_ErrorNone) {
196 if (pSrcMp3Param->nPortIndex >= ALL_PORT_NUM) {
197 ret = OMX_ErrorBadPortIndex;
201 pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
202 pDstMp3Param = &pMp3Dec->mp3Param;
204 Exynos_OSAL_Memcpy(pDstMp3Param, pSrcMp3Param, sizeof(OMX_AUDIO_PARAM_MP3TYPE));
207 case OMX_IndexParamAudioPcm:
209 OMX_AUDIO_PARAM_PCMMODETYPE *pDstPcmParam = NULL;
210 OMX_AUDIO_PARAM_PCMMODETYPE *pSrcPcmParam = (OMX_AUDIO_PARAM_PCMMODETYPE *)pComponentParameterStructure;
211 EXYNOS_MP3_HANDLE *pMp3Dec = NULL;
213 ret = Exynos_OMX_Check_SizeVersion(pSrcPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
214 if (ret != OMX_ErrorNone) {
218 if (pSrcPcmParam->nPortIndex >= ALL_PORT_NUM) {
219 ret = OMX_ErrorBadPortIndex;
223 pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
224 pDstPcmParam = &pMp3Dec->pcmParam;
226 Exynos_OSAL_Memcpy(pDstPcmParam, pSrcPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
229 case OMX_IndexParamStandardComponentRole:
231 OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
233 ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
234 if (ret != OMX_ErrorNone) {
238 if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
239 ret = OMX_ErrorIncorrectStateOperation;
243 if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MP3_DEC_ROLE)) {
244 pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingMP3;
246 ret = OMX_ErrorBadParameter;
252 ret = Exynos_OMX_AudioDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
261 OMX_ERRORTYPE Exynos_SRP_Mp3Dec_GetConfig(
262 OMX_IN OMX_HANDLETYPE hComponent,
263 OMX_IN OMX_INDEXTYPE nIndex,
264 OMX_IN OMX_PTR pComponentConfigStructure)
266 OMX_ERRORTYPE ret = OMX_ErrorNone;
267 OMX_COMPONENTTYPE *pOMXComponent = NULL;
268 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
272 if (hComponent == NULL || pComponentConfigStructure == NULL) {
273 ret = OMX_ErrorBadParameter;
276 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
277 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
278 if (ret != OMX_ErrorNone) {
281 if (pOMXComponent->pComponentPrivate == NULL) {
282 ret = OMX_ErrorBadParameter;
286 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
287 if (pExynosComponent->currentState == OMX_StateInvalid) {
288 ret = OMX_ErrorInvalidState;
294 ret = Exynos_OMX_AudioDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
304 OMX_ERRORTYPE Exynos_SRP_Mp3Dec_SetConfig(
305 OMX_IN OMX_HANDLETYPE hComponent,
306 OMX_IN OMX_INDEXTYPE nIndex,
307 OMX_IN OMX_PTR pComponentConfigStructure)
309 OMX_ERRORTYPE ret = OMX_ErrorNone;
310 OMX_COMPONENTTYPE *pOMXComponent = NULL;
311 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
315 if (hComponent == NULL || pComponentConfigStructure == NULL) {
316 ret = OMX_ErrorBadParameter;
319 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
320 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
321 if (ret != OMX_ErrorNone) {
324 if (pOMXComponent->pComponentPrivate == NULL) {
325 ret = OMX_ErrorBadParameter;
329 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
330 if (pExynosComponent->currentState == OMX_StateInvalid) {
331 ret = OMX_ErrorInvalidState;
337 ret = Exynos_OMX_AudioDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
347 OMX_ERRORTYPE Exynos_SRP_Mp3Dec_GetExtensionIndex(
348 OMX_IN OMX_HANDLETYPE hComponent,
349 OMX_IN OMX_STRING cParameterName,
350 OMX_OUT OMX_INDEXTYPE *pIndexType)
352 OMX_ERRORTYPE ret = OMX_ErrorNone;
353 OMX_COMPONENTTYPE *pOMXComponent = NULL;
354 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
358 if (hComponent == NULL) {
359 ret = OMX_ErrorBadParameter;
362 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
363 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
364 if (ret != OMX_ErrorNone) {
368 if (pOMXComponent->pComponentPrivate == NULL) {
369 ret = OMX_ErrorBadParameter;
372 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
374 if ((cParameterName == NULL) || (pIndexType == NULL)) {
375 ret = OMX_ErrorBadParameter;
378 if (pExynosComponent->currentState == OMX_StateInvalid) {
379 ret = OMX_ErrorInvalidState;
383 ret = Exynos_OMX_AudioDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
391 OMX_ERRORTYPE Exynos_SRP_Mp3Dec_ComponentRoleEnum(
392 OMX_IN OMX_HANDLETYPE hComponent,
393 OMX_OUT OMX_U8 *cRole,
394 OMX_IN OMX_U32 nIndex)
396 OMX_ERRORTYPE ret = OMX_ErrorNone;
397 OMX_COMPONENTTYPE *pOMXComponent = NULL;
398 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
402 if ((hComponent == NULL) || (cRole == NULL)) {
403 ret = OMX_ErrorBadParameter;
406 if (nIndex != (MAX_COMPONENT_ROLE_NUM - 1)) {
407 ret = OMX_ErrorNoMore;
410 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
411 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
412 if (ret != OMX_ErrorNone) {
415 if (pOMXComponent->pComponentPrivate == NULL) {
416 ret = OMX_ErrorBadParameter;
420 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
421 if (pExynosComponent->currentState == OMX_StateInvalid ) {
422 ret = OMX_ErrorInvalidState;
426 Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MP3_DEC_ROLE);
434 OMX_ERRORTYPE Exynos_SRP_Mp3Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
436 OMX_ERRORTYPE ret = OMX_ErrorNone;
437 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
438 EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
439 EXYNOS_MP3_HANDLE *pMp3Dec = (EXYNOS_MP3_HANDLE *)pAudioDec->hCodecHandle;
443 Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
444 Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
445 pExynosComponent->bUseFlagEOF = OMX_TRUE; /* Mp3 extractor should parse into frame unit. */
446 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
447 pMp3Dec->hSRPMp3Handle.bConfiguredSRP = OMX_FALSE;
448 pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_FALSE;
449 #ifdef TIZEN_FEATURE_E3250
450 pMp3Dec->nPendingflags = 0;
452 pExynosComponent->getAllDelayBuffer = OMX_FALSE;
454 #ifdef SRP_DUMP_TO_FILE
455 inFile = fopen("/data/InFile.mp3", "w+");
456 outFile = fopen("/data/OutFile.pcm", "w+");
464 OMX_ERRORTYPE Exynos_SRP_Mp3Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
466 OMX_ERRORTYPE ret = OMX_ErrorNone;
470 #ifdef SRP_DUMP_TO_FILE
480 OMX_ERRORTYPE Exynos_SRP_Mp3_Decode_Block(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData, EXYNOS_OMX_DATA *pOutputData)
482 OMX_ERRORTYPE ret = OMX_ErrorNone;
483 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
484 EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
485 EXYNOS_MP3_HANDLE *pMp3Dec = (EXYNOS_MP3_HANDLE *)pAudioDec->hCodecHandle;
486 struct srp_dec_info codecDecInfo;
487 OMX_S32 returnCodec = 0;
488 unsigned long isSRPStopped = 0;
489 OMX_PTR dataBuffer = NULL;
490 unsigned int dataLen = 0;
491 OMX_BOOL isSRPIbufOverflow = OMX_FALSE;
492 char dummy[2]={0xFF, 0xFF};
496 #ifdef SRP_DUMP_TO_FILE
497 if (pExynosComponent->reInputData == OMX_FALSE) {
498 fwrite(pInputData->buffer.singlePlaneBuffer.dataBuffer, pInputData->dataLen, 1, inFile);
502 /* Save timestamp and flags of input data */
503 #ifndef TIZEN_FEATURE_E3250
504 pOutputData->timeStamp = pInputData->timeStamp;
506 if (pExynosComponent->checkTimeStamp.startTimeStamp == pInputData->timeStamp) {
507 pMp3Dec->timeStamp = pInputData->timeStamp;
510 pOutputData->nFlags = pInputData->nFlags & (~OMX_BUFFERFLAG_EOS);
512 /* Decoding mp3 frames by SRP */
513 if (pExynosComponent->getAllDelayBuffer == OMX_FALSE) {
514 if (pInputData->dataLen == 0)
515 returnCodec = SRP_Decode(dummy, sizeof(dummy));
517 returnCodec = SRP_Decode(pInputData->buffer.singlePlaneBuffer.dataBuffer, pInputData->dataLen);
519 if (returnCodec >= 0) {
520 if (pInputData->nFlags & OMX_BUFFERFLAG_EOS) {
522 pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_TRUE;
524 } else if (returnCodec == SRP_ERROR_IBUF_OVERFLOW) {
525 isSRPIbufOverflow = OMX_TRUE;
526 ret = OMX_ErrorInputDataDecodeYet;
530 if (pMp3Dec->hSRPMp3Handle.bConfiguredSRP == OMX_FALSE) {
531 if ((pInputData->dataLen <= 0) && (pInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
532 pOutputData->nFlags |= OMX_BUFFERFLAG_EOS;
533 pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_FALSE;
538 returnCodec = SRP_Get_Dec_Info(&codecDecInfo);
539 if (returnCodec < 0) {
540 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Get_Dec_Info failed: %d", returnCodec);
541 ret = OMX_ErrorHardware;
545 if (!codecDecInfo.sample_rate || !codecDecInfo.channels) {
546 if (pMp3Dec->hSRPMp3Handle.bSRPSendEOS == OMX_TRUE) {
547 pOutputData->dataLen = 0;
548 pExynosComponent->getAllDelayBuffer = OMX_TRUE;
549 ret = OMX_ErrorInputDataDecodeYet;
551 pExynosComponent->getAllDelayBuffer = OMX_FALSE;
552 if (isSRPIbufOverflow)
553 ret = OMX_ErrorInputDataDecodeYet;
560 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "numChannels(%d), samplingRate(%d)",
561 codecDecInfo.channels, codecDecInfo.sample_rate);
563 if (pMp3Dec->pcmParam.nChannels != codecDecInfo.channels ||
564 pMp3Dec->pcmParam.nSamplingRate != codecDecInfo.sample_rate) {
565 /* Change channel count and sampling rate information */
566 pMp3Dec->pcmParam.nChannels = codecDecInfo.channels;
567 pMp3Dec->pcmParam.nSamplingRate = codecDecInfo.sample_rate;
569 /* Send Port Settings changed call back */
570 (*(pExynosComponent->pCallbacks->EventHandler))
572 pExynosComponent->callbackData,
573 OMX_EventPortSettingsChanged, /* The command was completed */
574 OMX_DirOutput, /* This is the port index */
579 pMp3Dec->hSRPMp3Handle.bConfiguredSRP = OMX_TRUE;
581 if (pMp3Dec->hSRPMp3Handle.bSRPSendEOS == OMX_TRUE) {
582 pOutputData->dataLen = 0;
583 pExynosComponent->getAllDelayBuffer = OMX_TRUE;
584 ret = OMX_ErrorInputDataDecodeYet;
586 pExynosComponent->getAllDelayBuffer = OMX_FALSE;
587 if (isSRPIbufOverflow)
588 ret = OMX_ErrorInputDataDecodeYet;
595 /* Get decoded data from SRP */
596 returnCodec = SRP_Get_PCM(&dataBuffer, &dataLen);
598 pOutputData->dataLen = dataLen;
599 Exynos_OSAL_Memcpy(pOutputData->buffer.singlePlaneBuffer.dataBuffer, dataBuffer, dataLen);
600 #ifdef TIZEN_FEATURE_E3250
601 pOutputData->timeStamp = pMp3Dec->timeStamp;
602 pMp3Dec->timeStamp += 1000000 * (OMX_TICKS)dataLen / (pMp3Dec->pcmParam.nSamplingRate * pMp3Dec->pcmParam.nChannels * pMp3Dec->pcmParam.nBitPerSample / 8);
603 pOutputData->nFlags |= pMp3Dec->nPendingflags;
604 pMp3Dec->nPendingflags = 0;
607 pOutputData->dataLen = 0;
608 #ifdef TIZEN_FEATURE_E3250
609 pMp3Dec->nPendingflags = pOutputData->nFlags;
613 #ifdef SRP_DUMP_TO_FILE
614 if (pOutputData->dataLen > 0)
615 fwrite(pOutputData->buffer.singlePlaneBuffer.dataBuffer, pOutputData->dataLen, 1, outFile);
618 /* Delay EOS signal until all the PCM is returned from the SRP driver. */
619 if (pMp3Dec->hSRPMp3Handle.bSRPSendEOS == OMX_TRUE) {
620 if (pInputData->nFlags & OMX_BUFFERFLAG_EOS) {
621 returnCodec = SRP_GetParams(SRP_STOP_EOS_STATE, &isSRPStopped);
622 if (returnCodec != 0)
623 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail SRP_STOP_EOS_STATE");
624 if (isSRPStopped == 1) {
625 pOutputData->nFlags |= OMX_BUFFERFLAG_EOS;
626 pExynosComponent->getAllDelayBuffer = OMX_FALSE;
627 #ifdef TIZEN_FEATURE_E3250
628 pOutputData->timeStamp = pInputData->timeStamp; /*For ALP EOS Timestamp*/
630 pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_FALSE; /* for repeating one song */
633 pExynosComponent->getAllDelayBuffer = OMX_TRUE;
634 ret = OMX_ErrorInputDataDecodeYet;
636 } else { /* Flush after EOS */
637 pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_FALSE;
646 OMX_ERRORTYPE Exynos_SRP_Mp3Dec_bufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData, EXYNOS_OMX_DATA *pOutputData)
648 OMX_ERRORTYPE ret = OMX_ErrorNone;
649 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
650 EXYNOS_OMX_BASEPORT *pInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
651 EXYNOS_OMX_BASEPORT *pOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
655 if ((!CHECK_PORT_ENABLED(pInputPort)) || (!CHECK_PORT_ENABLED(pOutputPort)) ||
656 (!CHECK_PORT_POPULATED(pInputPort)) || (!CHECK_PORT_POPULATED(pOutputPort))) {
657 if (pInputData->nFlags & OMX_BUFFERFLAG_EOS)
658 ret = OMX_ErrorInputDataDecodeYet;
664 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent)) {
665 if (pInputData->nFlags & OMX_BUFFERFLAG_EOS)
666 ret = OMX_ErrorInputDataDecodeYet;
673 ret = Exynos_SRP_Mp3_Decode_Block(pOMXComponent, pInputData, pOutputData);
675 if (ret != OMX_ErrorNone) {
676 if (ret == (OMX_ERRORTYPE)OMX_ErrorInputDataDecodeYet) {
677 pOutputData->usedDataLen = 0;
678 pOutputData->remainDataLen = pOutputData->dataLen;
680 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
681 pExynosComponent->callbackData,
682 OMX_EventError, ret, 0, NULL);
685 pInputData->usedDataLen += pInputData->dataLen;
686 pInputData->remainDataLen = pInputData->dataLen - pInputData->usedDataLen;
687 pInputData->dataLen -= pInputData->usedDataLen;
688 pInputData->usedDataLen = 0;
690 pOutputData->usedDataLen = 0;
691 pOutputData->remainDataLen = pOutputData->dataLen;
700 OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName)
702 OMX_ERRORTYPE ret = OMX_ErrorNone;
703 OMX_COMPONENTTYPE *pOMXComponent = NULL;
704 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
705 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
706 EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = NULL;
707 EXYNOS_MP3_HANDLE *pMp3Dec = NULL;
708 OMX_PTR pInputBuffer = NULL;
709 OMX_PTR pOutputBuffer = NULL;
710 unsigned int inputBufferSize = 0;
711 unsigned int inputBufferNum = 0;
712 unsigned int outputBufferSize = 0;
713 unsigned int outputBufferNum = 0;
718 if ((hComponent == NULL) || (componentName == NULL)) {
719 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: parameters are null, ret: %X", __FUNCTION__, ret);
720 ret = OMX_ErrorBadParameter;
723 if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MP3_DEC, componentName) != 0) {
724 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName(%s) error, ret: %X", __FUNCTION__, componentName, ret);
725 ret = OMX_ErrorBadParameter;
729 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
730 ret = Exynos_OMX_AudioDecodeComponentInit(pOMXComponent);
731 if (ret != OMX_ErrorNone) {
732 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_AudioDecodeComponentInit error, ret: %X", __FUNCTION__, ret);
735 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
736 pExynosComponent->codecType = HW_AUDIO_DEC_CODEC;
738 pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
739 if (pExynosComponent->componentName == NULL) {
740 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName alloc error, ret: %X", __FUNCTION__, ret);
741 ret = OMX_ErrorInsufficientResources;
744 Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
745 Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MP3_DEC);
747 pMp3Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_MP3_HANDLE));
748 if (pMp3Dec == NULL) {
749 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: EXYNOS_MP3_HANDLE alloc error, ret: %X", __FUNCTION__, ret);
750 ret = OMX_ErrorInsufficientResources;
753 Exynos_OSAL_Memset(pMp3Dec, 0, sizeof(EXYNOS_MP3_HANDLE));
754 pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
755 pAudioDec->hCodecHandle = (OMX_HANDLETYPE)pMp3Dec;
757 /* Create and Init SRP */
758 pMp3Dec->hSRPMp3Handle.bSRPLoaded = OMX_FALSE;
759 returnCodec = SRP_Create(SRP_INIT_BLOCK_MODE);
760 if (returnCodec < 0) {
761 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Create failed: %d", returnCodec);
762 ret = OMX_ErrorHardware;
765 pMp3Dec->hSRPMp3Handle.hSRPHandle = (OMX_HANDLETYPE)returnCodec; /* SRP's fd */
766 returnCodec = SRP_Init();
767 if (returnCodec < 0) {
768 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Init failed: %d", returnCodec);
769 ret = OMX_ErrorHardware;
772 pMp3Dec->hSRPMp3Handle.bSRPLoaded = OMX_TRUE;
774 /* Get input buffer info from SRP */
775 returnCodec = SRP_Get_Ibuf_Info(&pInputBuffer, &inputBufferSize, &inputBufferNum);
776 if (returnCodec < 0) {
777 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Get_Ibuf_Info failed: %d", returnCodec);
778 ret = OMX_ErrorHardware;
782 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
783 pExynosPort->processData.allocSize = inputBufferSize;
784 pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer = Exynos_OSAL_Malloc(inputBufferSize);
785 if (pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer == NULL) {
786 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Input data buffer alloc failed");
787 ret = OMX_ErrorInsufficientResources;
791 /* Get output buffer info from SRP */
792 returnCodec = SRP_Get_Obuf_Info(&pOutputBuffer, &outputBufferSize, &outputBufferNum);
793 if (returnCodec < 0) {
794 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Get_Obuf_Info failed: %d", returnCodec);
795 ret = OMX_ErrorHardware;
799 /* Set componentVersion */
800 pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
801 pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
802 pExynosComponent->componentVersion.s.nRevision = REVISION_NUMBER;
803 pExynosComponent->componentVersion.s.nStep = STEP_NUMBER;
805 /* Set specVersion */
806 pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
807 pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
808 pExynosComponent->specVersion.s.nRevision = REVISION_NUMBER;
809 pExynosComponent->specVersion.s.nStep = STEP_NUMBER;
812 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
813 pExynosPort->portDefinition.nBufferCountActual = inputBufferNum;
814 pExynosPort->portDefinition.nBufferCountMin = inputBufferNum;
815 pExynosPort->portDefinition.nBufferSize = inputBufferSize;
816 pExynosPort->portDefinition.bEnabled = OMX_TRUE;
817 Exynos_OSAL_Memset(pExynosPort->portDefinition.format.audio.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
818 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.audio.cMIMEType, "audio/mpeg");
819 pExynosPort->portDefinition.format.audio.pNativeRender = 0;
820 pExynosPort->portDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
821 pExynosPort->portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingMP3;
822 pExynosPort->portWayType = WAY1_PORT;
825 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
826 pExynosPort->portDefinition.nBufferCountActual = outputBufferNum;
827 pExynosPort->portDefinition.nBufferCountMin = outputBufferNum;
828 pExynosPort->portDefinition.nBufferSize = outputBufferSize;
829 pExynosPort->portDefinition.bEnabled = OMX_TRUE;
830 Exynos_OSAL_Memset(pExynosPort->portDefinition.format.audio.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
831 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.audio.cMIMEType, "audio/raw");
832 pExynosPort->portDefinition.format.audio.pNativeRender = 0;
833 pExynosPort->portDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
834 pExynosPort->portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingPCM;
835 pExynosPort->portWayType = WAY1_PORT;
837 /* Default values for Mp3 audio param */
838 INIT_SET_SIZE_VERSION(&pMp3Dec->mp3Param, OMX_AUDIO_PARAM_MP3TYPE);
839 pMp3Dec->mp3Param.nPortIndex = INPUT_PORT_INDEX;
840 pMp3Dec->mp3Param.nChannels = DEFAULT_AUDIO_CHANNELS_NUM;
841 pMp3Dec->mp3Param.nBitRate = 0;
842 pMp3Dec->mp3Param.nSampleRate = DEFAULT_AUDIO_SAMPLING_FREQ;
843 pMp3Dec->mp3Param.nAudioBandWidth = 0;
844 pMp3Dec->mp3Param.eChannelMode = OMX_AUDIO_ChannelModeStereo;
845 pMp3Dec->mp3Param.eFormat = OMX_AUDIO_MP3StreamFormatMP1Layer3;
847 /* Default values for PCM audio param */
848 INIT_SET_SIZE_VERSION(&pMp3Dec->pcmParam, OMX_AUDIO_PARAM_PCMMODETYPE);
849 pMp3Dec->pcmParam.nPortIndex = OUTPUT_PORT_INDEX;
850 pMp3Dec->pcmParam.nChannels = DEFAULT_AUDIO_CHANNELS_NUM;
851 pMp3Dec->pcmParam.eNumData = OMX_NumericalDataSigned;
852 pMp3Dec->pcmParam.eEndian = OMX_EndianLittle;
853 pMp3Dec->pcmParam.bInterleaved = OMX_TRUE;
854 pMp3Dec->pcmParam.nBitPerSample = DEFAULT_AUDIO_BIT_PER_SAMPLE;
855 pMp3Dec->pcmParam.nSamplingRate = DEFAULT_AUDIO_SAMPLING_FREQ;
856 pMp3Dec->pcmParam.ePCMMode = OMX_AUDIO_PCMModeLinear;
857 pMp3Dec->pcmParam.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
858 pMp3Dec->pcmParam.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
860 pOMXComponent->GetParameter = &Exynos_SRP_Mp3Dec_GetParameter;
861 pOMXComponent->SetParameter = &Exynos_SRP_Mp3Dec_SetParameter;
862 pOMXComponent->GetConfig = &Exynos_SRP_Mp3Dec_GetConfig;
863 pOMXComponent->SetConfig = &Exynos_SRP_Mp3Dec_SetConfig;
864 pOMXComponent->GetExtensionIndex = &Exynos_SRP_Mp3Dec_GetExtensionIndex;
865 pOMXComponent->ComponentRoleEnum = &Exynos_SRP_Mp3Dec_ComponentRoleEnum;
866 pOMXComponent->ComponentDeInit = &Exynos_OMX_ComponentDeinit;
868 /* ToDo: Change the function name associated with a specific codec */
869 pExynosComponent->exynos_codec_componentInit = &Exynos_SRP_Mp3Dec_Init;
870 pExynosComponent->exynos_codec_componentTerminate = &Exynos_SRP_Mp3Dec_Terminate;
871 pAudioDec->exynos_codec_bufferProcess = &Exynos_SRP_Mp3Dec_bufferProcess;
872 pAudioDec->exynos_checkInputFrame = NULL;
874 pExynosComponent->currentState = OMX_StateLoaded;
877 goto EXIT; /* This function is performed successfully. */
880 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
881 Exynos_OSAL_Free(pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer);
882 pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer = NULL;
883 pExynosPort->processData.allocSize = 0;
889 Exynos_OSAL_Free(pMp3Dec);
890 pAudioDec->hCodecHandle = NULL;
892 Exynos_OSAL_Free(pExynosComponent->componentName);
893 pExynosComponent->componentName = NULL;
895 Exynos_OMX_AudioDecodeComponentDeinit(pOMXComponent);
902 OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
904 OMX_ERRORTYPE ret = OMX_ErrorNone;
905 OMX_COMPONENTTYPE *pOMXComponent = NULL;
906 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
907 EXYNOS_MP3_HANDLE *pMp3Dec = NULL;
908 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
912 if (hComponent == NULL) {
913 ret = OMX_ErrorBadParameter;
916 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
917 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
919 Exynos_OSAL_Free(pExynosComponent->componentName);
920 pExynosComponent->componentName = NULL;
921 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
922 if (pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer) {
923 Exynos_OSAL_Free(pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer);
924 pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer = NULL;
925 pExynosPort->processData.allocSize = 0;
928 pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
929 if (pMp3Dec != NULL) {
930 if (pMp3Dec->hSRPMp3Handle.bSRPLoaded == OMX_TRUE) {
934 Exynos_OSAL_Free(pMp3Dec);
935 ((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
938 ret = Exynos_OMX_AudioDecodeComponentDeinit(pOMXComponent);
939 if (ret != OMX_ErrorNone) {