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_AacDec_CompThread.c
30 *
31 * This file implements OMX Component for AAC Decoder that
32 * is fully compliant with the OMX Audio specification 1.0.
33 *
34 * @path $(CSLPATH)\
35 *
36 * @rev 1.0
37 */
38 /* ----------------------------------------------------------------------------
39 *!
40 *! Revision History
41 *! ===================================
42 *! 13-Dec-2005 mf: Initial Version. Change required per OMAPSWxxxxxxxxx
43 *! to provide _________________.
44 *!
45 * ============================================================================= */
46
47
48 /* ------compilation control switches -------------------------*/
49 /****************************************************************
50 * INCLUDE FILES
51 ****************************************************************/
52 /* ----- system and platform files ----------------------------*/
53
54
55
56 #ifdef UNDER_CE
57 #include <windows.h>
58 #include <oaf_osal.h>
59 #include <omx_core.h>
60 #include <stdlib.h>
61 #else
62 #include <wchar.h>
63 #include <unistd.h>
64 #include <sys/types.h>
65 #include <sys/wait.h>
66 #include <sys/types.h>
67 #include <sys/stat.h>
68 #include <dlfcn.h>
69 #include <sys/select.h>
70 #include <memory.h>
71 #include <fcntl.h>
72 #include <signal.h>
73 #endif
74
75 #include <dbapi.h>
76 #include <string.h>
77 #include <stdio.h>
78
79 #ifdef ANDROID
80 #include <utils/threads.h>
81 #include <sys/prctl.h>
82 #endif
83
84 #include "OMX_AacDec_Utils.h"
85
86 /* ================================================================================= * */
87 /**
88 * @fn AACDEC_ComponentThread() This is component thread that keeps listening for
89 * commands or event/messages/buffers from application or from LCML.
90 *
91 * @param pThreadData This is thread argument.
92 *
93 * @pre None
94 *
95 * @post None
96 *
97 * @return OMX_ErrorNone = Always
98 *
99 * @see None
100 */
101 /* ================================================================================ * */
AACDEC_ComponentThread(void * pThreadData)102 void* AACDEC_ComponentThread (void* pThreadData)
103 {
104 int status;
105 struct timespec tv;
106 int fdmax;
107 fd_set rfds;
108 OMX_U32 nRet;
109 OMX_ERRORTYPE eError = OMX_ErrorNone;
110 AACDEC_COMPONENT_PRIVATE* pComponentPrivate = (AACDEC_COMPONENT_PRIVATE*)pThreadData;
111 OMX_COMPONENTTYPE *pHandle = pComponentPrivate->pHandle;
112
113 #ifdef ANDROID
114 setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_AUDIO);
115 prctl(PR_SET_NAME, (unsigned long)"AACComponent", 0, 0, 0);
116 #endif
117
118 OMX_PRINT1(pComponentPrivate->dbg, "%d :: Entering ComponentThread \n",__LINE__);
119 #ifdef __PERF_INSTRUMENTATION__
120 pComponentPrivate->pPERFcomp = PERF_Create(PERF_FOURCC('A', 'C', 'D', '_'),
121 PERF_ModuleComponent |
122 PERF_ModuleAudioDecode);
123 #endif
124 fdmax = pComponentPrivate->cmdPipe[0];
125
126 if (pComponentPrivate->dataPipe[0] > fdmax) {
127 fdmax = pComponentPrivate->dataPipe[0];
128 }
129
130
131 while (1) {
132 FD_ZERO (&rfds);
133 FD_SET (pComponentPrivate->cmdPipe[0], &rfds);
134 FD_SET (pComponentPrivate->dataPipe[0], &rfds);
135
136 tv.tv_sec = 1;
137 tv.tv_nsec = 0;
138
139 #ifndef UNDER_CE
140 sigset_t set;
141 sigemptyset (&set);
142 sigaddset (&set, SIGALRM);
143 status = pselect (fdmax+1, &rfds, NULL, NULL, &tv, &set);
144 #else
145 status = select (fdmax+1, &rfds, NULL, NULL, &tv);
146 #endif
147
148
149 if (pComponentPrivate->bExitCompThrd == 1) {
150 OMX_ERROR4(pComponentPrivate->dbg, "%d :: Comp Thrd Exiting here...\n",__LINE__);
151 goto EXIT;
152 }
153
154
155
156 if (0 == status) {
157 OMX_ERROR2(pComponentPrivate->dbg, "\n\n\n!!!!! Component Time Out !!!!!!!!!!!! \n");
158 }
159 else if (-1 == status) {
160 OMX_ERROR4(pComponentPrivate->dbg, "%d :: Error in Select\n", __LINE__);
161 pComponentPrivate->cbInfo.EventHandler (pHandle,
162 pHandle->pApplicationPrivate,
163 OMX_EventError,
164 OMX_ErrorInsufficientResources,
165 OMX_TI_ErrorSevere,
166 "Error from COmponent Thread in select");
167 eError = OMX_ErrorInsufficientResources;
168 }
169 else if (FD_ISSET (pComponentPrivate->cmdPipe[0], &rfds)) {
170 OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: CMD pipe is set in Component Thread\n",__LINE__);
171 nRet = AACDEC_HandleCommand (pComponentPrivate);
172 if (nRet == EXIT_COMPONENT_THRD) {
173 OMX_PRINT1(pComponentPrivate->dbg, "Exiting from Component thread\n");
174 AACDEC_CleanupInitParams(pHandle);
175 OMX_PRSTATE2(pComponentPrivate->dbg, "******************* Component State Set to Loaded\n\n");
176
177 pComponentPrivate->curState = OMX_StateLoaded;
178 #ifdef __PERF_INSTRUMENTATION__
179 PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryComplete | PERF_BoundaryCleanup);
180 #endif
181 if(pComponentPrivate->bPreempted==0){
182 pComponentPrivate->cbInfo.EventHandler(
183 pHandle, pHandle->pApplicationPrivate,
184 OMX_EventCmdComplete,
185 OMX_ErrorNone,pComponentPrivate->curState, NULL);
186 } else {
187 OMX_ERROR4(pComponentPrivate->dbg, "OMX_EventError:: OMX_ErrorPortUnpopulated at CompThread line %d\n", __LINE__);
188 pComponentPrivate->cbInfo.EventHandler(pHandle,
189 pHandle->pApplicationPrivate,
190 OMX_EventError,
191 OMX_ErrorResourcesLost,
192 OMX_TI_ErrorMajor,
193 NULL);
194 pComponentPrivate->bPreempted = 0;
195 }
196 }
197 }
198 else if ((FD_ISSET (pComponentPrivate->dataPipe[0], &rfds))) {
199 int ret;
200 OMX_BUFFERHEADERTYPE *pBufHeader = NULL;
201
202 OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: DATA pipe is set in Component Thread\n",__LINE__);
203 ret = read(pComponentPrivate->dataPipe[0], &pBufHeader, sizeof(pBufHeader));
204 if (ret == -1) {
205 OMX_ERROR2(pComponentPrivate->dbg, "%d :: Error while reading from the pipe\n",__LINE__);
206 }
207
208 eError = AACDEC_HandleDataBuf_FromApp (pBufHeader,pComponentPrivate);
209 if (eError != OMX_ErrorNone) {
210 OMX_ERROR2(pComponentPrivate->dbg, "%d :: Error From HandleDataBuf_FromApp\n",__LINE__);
211 break;
212 }
213 }
214 }
215 EXIT:
216
217 pComponentPrivate->bCompThreadStarted = 0;
218
219 #ifdef __PERF_INSTRUMENTATION__
220 PERF_Done(pComponentPrivate->pPERFcomp);
221 #endif
222 OMX_PRINT1(pComponentPrivate->dbg, "%d :: Exiting ComponentThread \n",__LINE__);
223 return (void*)eError;
224 }
225