1b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 2b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin/* 3b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * Copyright (C) Texas Instruments - http://www.ti.com/ 4b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * 5b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * This library is free software; you can redistribute it and/or 6b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * modify it under the terms of the GNU Lesser General Public 7b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * License as published by the Free Software Foundation; either 8b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * version 2.1 of the License, or (at your option) any later version. 9b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * 10b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * 11b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * This library is distributed in the hope that it will be useful, 12b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * but WITHOUT ANY WARRANTY; without even the implied warranty of 13b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * Lesser General Public License for more details. 15b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * 16b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * 17b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * You should have received a copy of the GNU Lesser General Public 18b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * License along with this library; if not, write to the Free Software 19b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin */ 21b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin/* ============================================================================= 22b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * Texas Instruments OMAP (TM) Platform Software 23b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * (c) Copyright Texas Instruments, Incorporated. All Rights Reserved. 24b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * 25b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * Use of this software is controlled by the terms and conditions found 26b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * in the license agreement under which this software has been supplied. 27b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * =========================================================================== */ 28b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin/** 29b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * @file OMX_G711Dec_ComponentThread.c 30b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * 31b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * This file implements OMX Component for PCM decoder that 32b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * is fully compliant with the OMX Audio specification . 33b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * 34b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * @path $(CSLPATH)\ 35b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * 36b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * @rev 0.1 37b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin */ 38b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin/* ----------------------------------------------------------------------------*/ 39b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 40b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin/* ------compilation control switches -------------------------*/ 41b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin/**************************************************************** 42b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin * INCLUDE FILES 43b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin ****************************************************************/ 44b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin/* ----- system and platform files ----------------------------*/ 45b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#ifdef UNDER_CE 46b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#include <windows.h> 47b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#else 48b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#include <unistd.h> 49b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#include <dbapi.h> 50b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#include <string.h> 51b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#include <fcntl.h> 52b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#include <stdlib.h> 53b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#include <stdio.h> 54b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#include <errno.h> 55b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#include <sys/time.h> 56b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#include <signal.h> 57b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#endif 58b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#include "OMX_G711Dec_Utils.h" 59b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#ifdef RESOURCE_MANAGER_ENABLED 60b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#include <ResourceManagerProxyAPI.h> 61b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#endif 62b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 63b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavinvoid* ComponentThread (void* pThreadData) 64b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin{ 65b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin OMX_S16 status = 0; 66b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin struct timespec tv; 67b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin OMX_S16 fdmax = 0; 68b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin fd_set rfds; 69b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin OMX_U32 nRet = 0; 70b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNone; 71b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_COMPONENT_PRIVATE* pComponentPrivate = (G711DEC_COMPONENT_PRIVATE*)pThreadData; 72b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin OMX_COMPONENTTYPE *pHandle = pComponentPrivate->pHandle; 73b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin OMX_BUFFERHEADERTYPE *pBufHeader = NULL; 74b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin ssize_t ret = 0; 75b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 76b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_DPRINT("OMX_G711Dec_ComponentThread:%d\n",__LINE__); 77b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 78b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin fdmax = pComponentPrivate->cmdPipe[0]; 79b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 80b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin if (pComponentPrivate->dataPipe[0] > fdmax) { 81b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin fdmax = pComponentPrivate->dataPipe[0]; 82b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin } 83b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 84b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin while (1) { 85b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin FD_ZERO (&rfds); 86b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin FD_SET (pComponentPrivate->cmdPipe[0], &rfds); 87b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin FD_SET (pComponentPrivate->dataPipe[0], &rfds); 88b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin tv.tv_sec = 1; 89b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin tv.tv_nsec = 0; 90b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 91b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 92b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#ifndef UNDER_CE 93b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin sigset_t set; 94b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin sigemptyset (&set); 95b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin sigaddset (&set, SIGALRM); 96b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin status = pselect (fdmax+1, &rfds, NULL, NULL, &tv, &set); 97b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#else 98b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin status = select (fdmax+1, &rfds, NULL, NULL, &tv); 99b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin#endif 100b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 101b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin if (0 == status) { 102b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin if (pComponentPrivate->bIsStopping == 1) { 103b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pComponentPrivate->bIsStopping = 0; 104b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pComponentPrivate->lcml_nOpBuf = 0; 105b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pComponentPrivate->lcml_nIpBuf = 0; 106b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pComponentPrivate->app_nBuf = 0; 107b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pComponentPrivate->num_Op_Issued = 0; 108b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pComponentPrivate->num_Sent_Ip_Buff = 0; 109b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pComponentPrivate->num_Reclaimed_Op_Buff = 0; 110b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pComponentPrivate->bIsEOFSent = 0; 111b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 112b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin if (pComponentPrivate->curState != OMX_StateIdle) { 113b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin goto EXIT; 114b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin } 115b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin } 116b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_DPRINT ("%d :: Component Time Out !!!!!!!!!!!! \n",__LINE__); 117b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin } else if (-1 == status) { 118b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_DPRINT ("%d :: Error in Select\n", __LINE__); 119b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pComponentPrivate->cbInfo.EventHandler (pHandle, pHandle->pApplicationPrivate, 120b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin OMX_EventError, 121b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin OMX_ErrorInsufficientResources,0, 122b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin "Error from COmponent Thread in select"); 123b65f253fdc60f6208a54911bee793d225f23cdf8James Dong eError = OMX_ErrorInsufficientResources; 124b65f253fdc60f6208a54911bee793d225f23cdf8James Dong 125b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin } else if (FD_ISSET(pComponentPrivate->dataPipe[0], &rfds)){ 126b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_DPRINT ("%d :: DATA pipe is set in Component Thread\n",__LINE__); 127b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin ret = read(pComponentPrivate->dataPipe[0], &pBufHeader, sizeof(pBufHeader)); 128b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 129b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin if (ret == -1) { 130b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_DPRINT ("%d :: Error while reading from the pipe\n",__LINE__); 131b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin } 132b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 133b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin eError = G711DECHandleDataBuf_FromApp (pBufHeader,pComponentPrivate); 134b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 135b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin if (eError != OMX_ErrorNone) { 136b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_DPRINT ("%d :: Error From G711DECHandleDataBuf_FromApp\n"); 137b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin break; 138b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin } 139b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin } 140b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin else if (FD_ISSET (pComponentPrivate->cmdPipe[0], &rfds)) { 141b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin /* Do not accept any command when the component is stopping */ 142b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_DPRINT ("%d :: CMD pipe is set in Component Thread\n",__LINE__); 143b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin nRet = G711DECHandleCommand (pComponentPrivate); 144b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin if (nRet == EXIT_COMPONENT_THRD) { 145b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_DPRINT ("Exiting from Component thread\n"); 146b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_CleanupInitParams(pHandle); 147b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin if(eError != OMX_ErrorNone) { 148b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_DPRINT("%d :: Function G711Dec_FreeCompResources returned\ 149b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin error\n",__LINE__); 150b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin goto EXIT; 151b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin } 152b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_DPRINT("%d :: ARM Side Resources Have Been Freed\n",__LINE__); 153b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 154b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pComponentPrivate->curState = OMX_StateLoaded; 155b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pComponentPrivate->cbInfo.EventHandler( pHandle, 156b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pHandle->pApplicationPrivate, 157b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin OMX_EventCmdComplete, 158b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin OMX_ErrorNone, 159b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin pComponentPrivate->curState, 160b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin NULL); 161b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin } 162b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin } 163b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin } 164b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin EXIT: 165b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin G711DEC_DPRINT("%d::Exiting ComponentThread\n",__LINE__); 166b65f253fdc60f6208a54911bee793d225f23cdf8James Dong return (void*)eError; 167b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin} 168