1
2 /*
3 * Copyright (C) Texas Instruments - http://www.ti.com/
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21 /* =============================================================================
22 * Texas Instruments OMAP (TM) Platform Software
23 * (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
24 *
25 * Use of this software is controlled by the terms and conditions found
26 * in the license agreement under which this software has been supplied.
27 * =========================================================================== */
28 /**
29 * @file OMX_AmrDec_ComponentThread.c
30 *
31 * This file implements OMX Component for PCM decoder that
32 * is fully compliant with the OMX Audio specification .
33 *
34 * @path $(CSLPATH)\
35 *
36 * @rev 0.1
37 */
38 /* ----------------------------------------------------------------------------*/
39
40 /* ------compilation control switches -------------------------*/
41 /****************************************************************
42 * INCLUDE FILES
43 ****************************************************************/
44 /* ----- system and platform files ----------------------------*/
45 #ifdef UNDER_CE
46 #include <windows.h>
47 #else
48 #include <wchar.h>
49 #include <unistd.h>
50 #include <dbapi.h>
51 #include <string.h>
52 #include <fcntl.h>
53 #include <stdlib.h>
54 #include <stdio.h>
55 #include <errno.h>
56 #include <sys/time.h>
57 #include <signal.h>
58 #include <sys/select.h>
59
60 #endif
61 #include "OMX_AmrDec_Utils.h"
62 #include "OMX_AmrDecoder.h"
63 #include "OMX_AmrDec_ComponentThread.h"
64
NBAMRDEC_ComponentThread(void * pThreadData)65 void* NBAMRDEC_ComponentThread (void* pThreadData)
66 {
67 OMX_S16 status;
68 struct timespec tv;
69 OMX_S16 fdmax;
70 fd_set rfds;
71 OMX_U32 nRet;
72 OMX_ERRORTYPE eError = OMX_ErrorNone;
73 AMRDEC_COMPONENT_PRIVATE* pComponentPrivate = (AMRDEC_COMPONENT_PRIVATE*)pThreadData;
74 OMX_COMPONENTTYPE *pHandle = pComponentPrivate->pHandle;
75 OMX_BUFFERHEADERTYPE *pBufHeader = NULL;
76 ssize_t ret;
77
78 OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: \n",__LINE__);
79
80 #ifdef __PERF_INSTRUMENTATION__
81 pComponentPrivate->pPERFcomp = PERF_Create(PERF_FOURCC('N', 'B', '_', 'D'),
82 PERF_ModuleComponent |
83 PERF_ModuleAudioDecode);
84 #endif
85
86 fdmax = pComponentPrivate->cmdPipe[0];
87
88 if (pComponentPrivate->dataPipe[0] > fdmax) {
89 fdmax = pComponentPrivate->dataPipe[0];
90 }
91
92 while (1) {
93 FD_ZERO (&rfds);
94 FD_SET (pComponentPrivate->cmdPipe[0], &rfds);
95 FD_SET (pComponentPrivate->dataPipe[0], &rfds);
96
97 tv.tv_sec = 1;
98 tv.tv_nsec = 0;
99
100 #ifndef UNDER_CE
101 sigset_t set;
102 sigemptyset (&set);
103 sigaddset (&set, SIGALRM);
104 status = pselect (fdmax+1, &rfds, NULL, NULL, &tv, &set);
105 #else
106 status = select (fdmax+1, &rfds, NULL, NULL, &tv);
107 #endif
108
109 if (pComponentPrivate->bIsStopping == 1) {
110 OMX_ERROR4(pComponentPrivate->dbg, ":: Comp Thrd Exiting here...\n");
111 goto EXIT;
112 }
113
114 if (0 == status) {
115
116 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: bIsStopping = %ld\n",__LINE__,
117 pComponentPrivate->bIsStopping);
118
119 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: lcml_nOpBuf = %ld\n",__LINE__,
120 pComponentPrivate->lcml_nOpBuf);
121
122 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: lcml_nIpBuf = %ld\n",__LINE__,
123 pComponentPrivate->lcml_nIpBuf);
124 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: app_nBuf = %ld\n",__LINE__,
125 pComponentPrivate->app_nBuf);
126
127 if (pComponentPrivate->bIsStopping == 1) {
128 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: AmrComponentThread \n",__LINE__);
129
130 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: AmrComponentThread \n",__LINE__);
131 if(eError != OMX_ErrorNone) {
132 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: Error Occurred in Codec Stop..\n",__LINE__);
133 break;
134 }
135 pComponentPrivate->bIsStopping = 0;
136 pComponentPrivate->lcml_nOpBuf = 0;
137 pComponentPrivate->lcml_nIpBuf = 0;
138 pComponentPrivate->app_nBuf = 0;
139 pComponentPrivate->num_Reclaimed_Op_Buff = 0;
140
141 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: AmrComponentThread \n",__LINE__);
142 if (pComponentPrivate->curState != OMX_StateIdle) {
143 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: AmrComponentThread \n",__LINE__);
144 goto EXIT;
145 }
146 }
147 OMX_PRDSP1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: Component Time Out !!!!!!!!!!!! \n",__LINE__);
148 } else if (-1 == status) {
149 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: Error in Select\n", __LINE__);
150 pComponentPrivate->cbInfo.EventHandler (pHandle,
151 pHandle->pApplicationPrivate,
152 OMX_EventError,
153 OMX_ErrorInsufficientResources,
154 OMX_TI_ErrorSevere,
155 "Error from Component Thread in select");
156 eError = OMX_ErrorInsufficientResources;
157 }
158 else if (FD_ISSET (pComponentPrivate->dataPipe[0], &rfds)) {
159 OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: DATA pipe is set in Component Thread\n",__LINE__);
160 ret = read(pComponentPrivate->dataPipe[0], &pBufHeader, sizeof(pBufHeader));
161 if (ret == -1) {
162 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: Error while reading from the pipe\n",__LINE__);
163 }
164 eError = NBAMRDECHandleDataBuf_FromApp (pBufHeader,pComponentPrivate);
165 if (eError != OMX_ErrorNone) {
166 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: Error From NBAMRDECHandleDataBuf_FromApp\n",__LINE__);
167 break;
168 }
169
170 }
171 else if (FD_ISSET (pComponentPrivate->cmdPipe[0], &rfds)) {
172 /* Do not accept any command when the component is stopping */
173 OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: CMD pipe is set in Component Thread\n",__LINE__);
174 nRet = NBAMRDECHandleCommand (pComponentPrivate);
175 if (nRet == EXIT_COMPONENT_THRD) {
176 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: Exiting from Component thread\n",__LINE__);
177
178 if(eError != OMX_ErrorNone) {
179 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: Function Mp3Dec_FreeCompResources returned\
180 error\n",__LINE__);
181 goto EXIT;
182 }
183 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: ARM Side Resources Have Been Freed\n",__LINE__);
184
185 pComponentPrivate->curState = OMX_StateLoaded;
186 #ifdef __PERF_INSTRUMENTATION__
187 PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryComplete | PERF_BoundaryCleanup);
188 #endif
189 if (pComponentPrivate->bPreempted == 0) {
190 pComponentPrivate->cbInfo.EventHandler(
191 pHandle, pHandle->pApplicationPrivate,
192 OMX_EventCmdComplete,
193 OMX_ErrorNone,pComponentPrivate->curState, NULL);
194 }
195 else {
196 pComponentPrivate->cbInfo.EventHandler(pHandle,
197 pHandle->pApplicationPrivate,
198 OMX_EventError,
199 OMX_ErrorResourcesLost,
200 OMX_TI_ErrorMajor,
201 NULL);
202 pComponentPrivate->bPreempted = 0;
203 }
204 }
205 }
206 }
207 EXIT:
208
209 #ifdef __PERF_INSTRUMENTATION__
210 PERF_Done(pComponentPrivate->pPERFcomp);
211 #endif
212
213 OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_ComponentThread.c :: Exiting ComponentThread\n",__LINE__);
214 return (void*)eError;
215 }
216