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_Mp3Dec_CompThread.c 30* 31* This file implements various utilitiy functions for various activities 32* like handling command from application, callback from LCML etc. 33* 34* @path $(CSLPATH)\OMAPSW_MPU\linux\audio\src\openmax_il\mp3_dec\src 35* 36* @rev 1.0 37*/ 38/* ---------------------------------------------------------------------------- 39*! 40*! Revision History 41*! =================================== 42*! 21-sept-2006 bk: updated some review findings for alpha release 43*! 24-Aug-2006 bk: Khronos OpenMAX (TM) 1.0 Conformance tests some more 44*! 18-July-2006 bk: Khronos OpenMAX (TM) 1.0 Conformance tests validated for few cases 45*! This is newest file 46* =========================================================================== */ 47/* ------compilation control switches -------------------------*/ 48/**************************************************************** 49* INCLUDE FILES 50****************************************************************/ 51/* ----- system and platform files ----------------------------*/ 52 53 54 55#ifdef UNDER_CE 56#include <windows.h> 57#include <oaf_osal.h> 58#include <omx_core.h> 59#include <stdlib.h> 60#else 61#include <wchar.h> 62#include <unistd.h> 63#include <sys/types.h> 64#include <sys/wait.h> 65#include <sys/types.h> 66#include <sys/stat.h> 67#include <dlfcn.h> 68#include <sys/select.h> 69#include <memory.h> 70#include <fcntl.h> 71#include <signal.h> 72#endif 73 74#include <dbapi.h> 75#include <string.h> 76#include <stdio.h> 77 78#ifdef ANDROID 79#include <utils/threads.h> 80#include <sys/prctl.h> 81#endif 82 83#include "OMX_Mp3Dec_Utils.h" 84 85/* ================================================================================= * */ 86/** 87* @fn MP3DEC_ComponentThread() This is component thread that keeps listening for 88* commands or event/messages/buffers from application or from LCML. 89* 90* @param pThreadData This is thread argument. 91* 92* @pre None 93* 94* @post None 95* 96* @return OMX_ErrorNone = Always 97* 98* @see None 99*/ 100/* ================================================================================ * */ 101void* MP3DEC_ComponentThread (void* pThreadData) 102{ 103 int status; 104 struct timespec tv; 105 int fdmax; 106 fd_set rfds; 107 OMX_U32 nRet; 108 OMX_ERRORTYPE eError = OMX_ErrorNone; 109 MP3DEC_COMPONENT_PRIVATE* pComponentPrivate = (MP3DEC_COMPONENT_PRIVATE*)pThreadData; 110 OMX_COMPONENTTYPE *pHandle = pComponentPrivate->pHandle; 111 112#ifdef ANDROID 113 setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_AUDIO); 114 prctl(PR_SET_NAME, (unsigned long)"MP3Component", 0, 0, 0); 115#endif 116 117 OMX_PRINT1(pComponentPrivate->dbg, ":: Entering ComponentThread \n"); 118 119#ifdef __PERF_INSTRUMENTATION__ 120 pComponentPrivate->pPERFcomp = PERF_Create(PERF_FOURCC('M', 'P', '3',' '), 121 PERF_ModuleComponent | 122 PERF_ModuleAudioDecode); 123#endif 124 125 fdmax = pComponentPrivate->cmdPipe[0]; 126 127 if (pComponentPrivate->dataPipe[0] > fdmax) { 128 fdmax = pComponentPrivate->dataPipe[0]; 129 } 130 131 while (1) { 132 FD_ZERO (&rfds); 133 FD_SET (pComponentPrivate->cmdPipe[0], &rfds); 134 FD_SET (pComponentPrivate->dataPipe[0], &rfds); 135 tv.tv_sec = 1; 136 tv.tv_nsec = 0; 137 138#ifndef UNDER_CE 139 sigset_t set; 140 sigemptyset (&set); 141 sigaddset (&set, SIGALRM); 142 status = pselect (fdmax+1, &rfds, NULL, NULL, &tv, &set); 143#else 144 status = select (fdmax+1, &rfds, NULL, NULL, &tv); 145#endif 146 147 if (pComponentPrivate->bExitCompThrd == 1) { 148 OMX_PRINT1(pComponentPrivate->dbg, ":: Comp Thrd Exiting here...\n"); 149 goto EXIT; 150 } 151 152 153 154 if (0 == status) { 155 OMX_PRSTATE2(pComponentPrivate->dbg, "\n\n\n!!!!! Component Time Out !!!!!!!!!!!! \n"); 156 OMX_PRSTATE2(pComponentPrivate->dbg, "Current State: %d \n", pComponentPrivate->curState); 157 158 OMX_PRDSP2(pComponentPrivate->dbg, "%d:: lcml_nCntOp = %lu\n",__LINE__,pComponentPrivate->lcml_nCntOp); 159 OMX_PRDSP2(pComponentPrivate->dbg, "%d : lcml_nCntIp = %lu\n",__LINE__,pComponentPrivate->lcml_nCntIp); 160 OMX_PRDSP2(pComponentPrivate->dbg, "%d : lcml_nCntIpRes = %lu\n",__LINE__,pComponentPrivate->lcml_nCntIpRes); 161 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: lcml_nCntOpReceived = %lu\n",__LINE__,pComponentPrivate->lcml_nCntOpReceived); 162 163 if (pComponentPrivate->bExitCompThrd == 1) { 164 OMX_ERROR4(pComponentPrivate->dbg, ":: Comp Thrd Exiting here...\n"); 165 goto EXIT; 166 } 167 168 169 } else if (-1 == status) { 170 OMX_ERROR4(pComponentPrivate->dbg, ":: Error in Select\n"); 171 pComponentPrivate->cbInfo.EventHandler (pHandle, 172 pHandle->pApplicationPrivate, 173 OMX_EventError, 174 OMX_ErrorInsufficientResources, 175 OMX_TI_ErrorSevere, 176 "Error from COmponent Thread in select"); 177 eError = OMX_ErrorInsufficientResources; 178 179 } else if ((FD_ISSET (pComponentPrivate->dataPipe[0], &rfds))) { 180 int ret; 181 OMX_BUFFERHEADERTYPE *pBufHeader = NULL; 182 183 OMX_PRCOMM2(pComponentPrivate->dbg, ":: DATA pipe is set in Component Thread\n"); 184 ret = read(pComponentPrivate->dataPipe[0], &pBufHeader, sizeof(pBufHeader)); 185 if (ret == -1) { 186 OMX_ERROR2(pComponentPrivate->dbg, ":: Error while reading from the pipe\n"); 187 } 188 189 eError = MP3DEC_HandleDataBuf_FromApp (pBufHeader,pComponentPrivate); 190 if (eError != OMX_ErrorNone) { 191 OMX_ERROR2(pComponentPrivate->dbg, ":: Error From HandleDataBuf_FromApp\n"); 192 break; 193 } 194 } else if (FD_ISSET (pComponentPrivate->cmdPipe[0], &rfds)) { 195 OMX_PRCOMM2(pComponentPrivate->dbg, ":: CMD pipe is set in Component Thread\n"); 196 nRet = MP3DEC_HandleCommand (pComponentPrivate); 197 if (nRet == EXIT_COMPONENT_THRD) { 198 OMX_PRDSP2(pComponentPrivate->dbg, "Exiting from Component thread\n"); 199 MP3DEC_CleanupInitParams(pHandle); 200 OMX_PRSTATE2(pComponentPrivate->dbg, "****************** Component State Set to Loaded\n\n"); 201 202 pComponentPrivate->curState = OMX_StateLoaded; 203#ifdef __PERF_INSTRUMENTATION__ 204 PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryComplete | PERF_BoundaryCleanup); 205#endif 206 if(pComponentPrivate->bPreempted == 0){ 207 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate, 208 OMX_EventCmdComplete, 209 OMX_ErrorNone,pComponentPrivate->curState, 210 NULL); 211 }else{ 212 pComponentPrivate->cbInfo.EventHandler(pHandle, 213 pHandle->pApplicationPrivate, 214 OMX_EventError, 215 OMX_ErrorResourcesLost, 216 OMX_TI_ErrorMajor, 217 NULL); 218 pComponentPrivate->bPreempted = 0; 219 } 220 } 221 } 222 } 223EXIT: 224 225 pComponentPrivate->bCompThreadStarted = 0; 226 227 228#ifdef __PERF_INSTRUMENTATION__ 229 PERF_Done(pComponentPrivate->pPERFcomp); 230#endif 231 232 OMX_PRINT1(pComponentPrivate->dbg, ":: Exiting ComponentThread \n"); 233 return (void*)eError; 234} 235