blob: ec01e73906eb5821356c6c69b891faddba272668 [file] [log] [blame]
/*
* Copyright (C) Texas Instruments - http://www.ti.com/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/* ====================================================================
* Texas Instruments OMAP(TM) Platform Software
* (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
*
* Use of this software is controlled by the terms and conditions found
* in the license agreement under which this software has been supplied.
* ==================================================================== */
/**
* @file LCML_DspCodec.c
*
* This file implements LCML for Linux 8.x
*
* @path $(CSLPATH)\
*
* @rev 1.0
*/
/* ----------------------------------------------------------------------------
*!
*! Revision History
*! ===================================
*!
*!
* ============================================================================= */
#ifdef UNDER_CE
#include <windows.h>
#else
#include <errno.h>
#endif
#ifdef ANDROID
#include <sys/prctl.h>
#endif
#include <pthread.h>
/* Common WinCE and Linux Headers */
#include "LCML_DspCodec.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "usn.h"
#include <sys/time.h>
#define CEXEC_DONE 1
/*DSP_HNODE hDasfNode;*/
#define ABS_DLL_NAME_LENGTH 128
#undef LOG_TAG
#define LOG_TAG "TI_LCML"
#define LCML_MALLOC(p,s,t) \
p = (t*)malloc(s); \
if (NULL == p){ \
OMXDBG_PRINT(stderr, ERROR, 4, OMX_DBG_BASEMASK, "LCML:::::::: ERROR(#%d F:%s)!!! Ran out of memory while trying to allocate %d bytes!!!\n",__LINE__,__FUNCTION__,s); \
}else { \
OMXDBG_PRINT(stderr, PRINT, 2, OMX_DBG_BASEMASK, "LCML:::::::: (#%d F:%s)Success to allocate %d bytes ... pointer %p\n",__LINE__,__FUNCTION__,s,p); \
}
#define LCML_FREE(p) \
OMXDBG_PRINT(stderr, PRINT, 2, OMX_DBG_BASEMASK, "LCML:::::::: (#%d F:%s)Freeing pointer %p done",__LINE__,__FUNCTION__,p); \
free(p);
/*Prototyping*/
static OMX_ERRORTYPE InitMMCodec(OMX_HANDLETYPE hInt,
OMX_STRING codecName,
void *toCodecInitParams,
void *fromCodecInfoStruct,
LCML_CALLBACKTYPE *pCallbacks);
static OMX_ERRORTYPE InitMMCodecEx(OMX_HANDLETYPE hInt,
OMX_STRING codecName,
void *toCodecInitParams,
void *fromCodecInfoStruct,
LCML_CALLBACKTYPE *pCallbacks,
OMX_STRING Args);
static OMX_ERRORTYPE WaitForEvent(OMX_HANDLETYPE hComponent,
TUsnCodecEvent event,
void *args[10]);
static OMX_ERRORTYPE QueueBuffer(OMX_HANDLETYPE hComponent,
TMMCodecBufferType bufType,
OMX_U8 *buffer,
OMX_S32 bufferLen,
OMX_S32 bufferSizeUsed ,
OMX_U8 *auxInfo,
OMX_S32 auxInfoLen,
OMX_U8 *usrArg);
static OMX_ERRORTYPE ControlCodec(OMX_HANDLETYPE hComponent,
TControlCmd iCodecCmd,
void *args[10]);
static OMX_ERRORTYPE DmmMap(DSP_HPROCESSOR ProcHandle,
OMX_U32 size,
void* pArmPtr,
DMM_BUFFER_OBJ* pDmmBuf,
struct OMX_TI_Debug dbg);
static OMX_ERRORTYPE DmmUnMap(DSP_HPROCESSOR ProcHandle,
void *pMapPtr,
void *pResPtr,
struct OMX_TI_Debug dbg);
static OMX_ERRORTYPE DeleteDspResource(LCML_DSP_INTERFACE *hInterface);
static OMX_ERRORTYPE FreeResources(LCML_DSP_INTERFACE *hInterface);
void* MessagingThread(void *arg);
static int append_dsp_path(char * dll64p_name, char *absDLLname);
/** ========================================================================
* GetHandle function is called by OMX component to get LCML handle
* @param hInterface - Handle of the component to be accessed
* @return OMX_ERRORTYPE
* If the command successfully executes, the return code will be
* OMX_NoError. Otherwise the appropriate OMX error will be returned.
** =========================================================================*/
OMX_ERRORTYPE GetHandle(OMX_HANDLETYPE *hInterface )
{
OMX_ERRORTYPE err = 0 ;
LCML_DSP_INTERFACE* pHandle;
struct LCML_CODEC_INTERFACE *dspcodecinterface ;
OMXDBG_PRINT(stderr, PRINT, 2, OMX_DBG_BASEMASK, "%d :: GetHandle application\n",__LINE__);
LCML_MALLOC(*hInterface,sizeof(LCML_DSP_INTERFACE),LCML_DSP_INTERFACE);
if (hInterface == NULL)
{
err = OMX_ErrorInsufficientResources;
goto EXIT;
}
memset(*hInterface, 0, sizeof(LCML_DSP_INTERFACE));
pHandle = (LCML_DSP_INTERFACE*)*hInterface;
LCML_MALLOC(dspcodecinterface,sizeof(LCML_CODEC_INTERFACE),LCML_CODEC_INTERFACE);
if (dspcodecinterface == NULL)
{
err = OMX_ErrorInsufficientResources;
goto EXIT;
}
memset(dspcodecinterface, 0, sizeof(LCML_CODEC_INTERFACE));
OMX_DBG_INIT (dspcodecinterface->dbg, "TI_LCML");
pHandle->pCodecinterfacehandle = dspcodecinterface;
dspcodecinterface->InitMMCodec = InitMMCodec;
dspcodecinterface->InitMMCodecEx = InitMMCodecEx;
dspcodecinterface->WaitForEvent = WaitForEvent;
dspcodecinterface->QueueBuffer = QueueBuffer;
dspcodecinterface->ControlCodec = ControlCodec;
LCML_MALLOC(pHandle->dspCodec,sizeof(LCML_DSP),LCML_DSP);
if(pHandle->dspCodec == NULL)
{
err = OMX_ErrorInsufficientResources;
goto EXIT;
}
memset(pHandle->dspCodec, 0, sizeof(LCML_DSP));
pthread_mutex_init (&pHandle->mutex, NULL);
dspcodecinterface->pCodec = *hInterface;
OMX_PRINT2 (dspcodecinterface->dbg, "GetHandle application handle %p dspCodec %p",pHandle, pHandle->dspCodec);
EXIT:
return (err);
}
/** ========================================================================
* InitMMCodecEx initialise the OMX Component specific handle to LCML.
* The memory is allocated and the dsp node is created. Add notification object
* to listener thread.
*
* @param hInterface - Handle to LCML which is allocated and filled
* @param codecName - not used
* @param toCodecInitParams - not used yet
* @param fromCodecInfoStruct - not used yet
* @param pCallbacks - List of callback that uses to call OMX
* @param Args - additional arguments
* @return OMX_ERRORTYPE
* If the command successfully executes, the return code will be
* OMX_NoError. Otherwise the appropriate OMX error will be returned.
* ==========================================================================*/
static OMX_ERRORTYPE InitMMCodecEx(OMX_HANDLETYPE hInt,
OMX_STRING codecName,
void * toCodecInitParams,
void * fromCodecInfoStruct,
LCML_CALLBACKTYPE *pCallbacks,
OMX_STRING Args)
{
OMX_ERRORTYPE eError = OMX_ErrorNone;
OMX_U32 dllinfo;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: InitMMCodecEx application\n", __LINE__);
if (hInt == NULL )
{
eError = OMX_ErrorInsufficientResources;
goto ERROR;
}
if(Args ==NULL)
{
InitMMCodec(hInt, codecName, toCodecInitParams, fromCodecInfoStruct, pCallbacks);
}
else
{
LCML_DSP_INTERFACE * phandle;
LCML_CREATEPHASEARGS crData;
DSP_STATUS status;
int i = 0, k = 0;
struct DSP_NODEATTRIN NodeAttrIn;
struct DSP_CBDATA *pArgs;
BYTE argsBuf[32 + sizeof(ULONG)];
char abs_dsp_path[ABS_DLL_NAME_LENGTH];
#ifndef CEXEC_DONE
UINT argc = 1;
char argv[ABS_DLL_NAME_LENGTH];
k = append_dsp_path(DSP_DOF_IMAGE, argv);
if (k < 0)
{
OMX_PRDSP4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: append_dsp_path returned an error!\n", __LINE__);
eError = OMX_ErrorBadParameter;
goto ERROR;
}
#endif
int tmperr;
phandle = (LCML_DSP_INTERFACE *)(((LCML_CODEC_INTERFACE *)hInt)->pCodec);
#ifdef __PERF_INSTRUMENTATION__
phandle->pPERF = PERF_Create(PERF_FOURCC('C','M','L',' '),
PERF_ModuleAudioDecode | PERF_ModuleAudioEncode |
PERF_ModuleVideoDecode | PERF_ModuleVideoEncode |
PERF_ModuleImageDecode | PERF_ModuleImageEncode |
PERF_ModuleCommonLayer);
PERF_Boundary(phandle->pPERF,
PERF_BoundaryStart | PERF_BoundarySetup);
#endif
/* 720p implementation */
{
pthread_mutex_init(&phandle->m_isStopped_mutex, NULL);
phandle->mapped_buffer_count = 0;
}
/* INIT DSP RESOURCE */
if(pCallbacks)
phandle->dspCodec->Callbacks.LCML_Callback = pCallbacks->LCML_Callback;
else
{
eError = OMX_ErrorBadParameter;
goto ERROR;
}
/* INITIALIZATION OF DSP */
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Entering Init_DSPSubSystem\n", __LINE__);
status = DspManager_Open(0, NULL);
DSP_ERROR_EXIT(status, "DSP Manager Open", ERROR);
OMX_PRDSP1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "DspManager_Open Successful\n");
/* Attach and get handle to processor */
status = DSPProcessor_Attach(TI_PROCESSOR_DSP, NULL, &(phandle->dspCodec->hProc));
DSP_ERROR_EXIT(status, "Attach processor", ERROR);
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "DSPProcessor_Attach Successful\n");
OMX_PRDSP1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "Base Image is Already Loaded\n");
for (dllinfo=0; dllinfo < phandle->dspCodec->NodeInfo.nNumOfDLLs; dllinfo++)
{
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Register Component Node\n",phandle->dspCodec->NodeInfo.AllUUIDs[dllinfo].eDllType);
k = append_dsp_path((char*)phandle->dspCodec->NodeInfo.AllUUIDs[dllinfo].DllName, abs_dsp_path);
if (k < 0)
{
OMX_PRDSP4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: append_dsp_path returned an error!\n", __LINE__);
eError = OMX_ErrorBadParameter;
goto ERROR;
}
status = DSPManager_RegisterObject((struct DSP_UUID *)phandle->dspCodec->NodeInfo.AllUUIDs[dllinfo].uuid,
phandle->dspCodec->NodeInfo.AllUUIDs[dllinfo].eDllType, abs_dsp_path);
DSP_ERROR_EXIT (status, "Register Component Library", ERROR);
}
/* NODE specific data */
NodeAttrIn.cbStruct = sizeof(struct DSP_NODEATTRIN);
NodeAttrIn.iPriority = phandle->dspCodec->Priority;
NodeAttrIn.uTimeout = phandle->dspCodec->Timeout;
NodeAttrIn.uTimeout = 1000; /* WORKAROUND */
NodeAttrIn.uProfileID= phandle->dspCodec->ProfileID;
/* Prepare Create Phase Argument */
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Prepare Create Phase Argument \n", __LINE__);
/* TO DO check is application setting it properly */
i = 0;
if(phandle->dspCodec->pCrPhArgs !=NULL)
{
while((phandle->dspCodec->pCrPhArgs[i] != END_OF_CR_PHASE_ARGS) && (i < LCML_DATA_SIZE))
{
OMX_PRDSP1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: copying Create Phase Argument \n", i);
crData.cData[i] = phandle->dspCodec->pCrPhArgs[i];
OMX_PRDSP1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: CR PH arg[%d] = %d \n",__LINE__, i, crData.cData[i]);
i++;
}
}
else
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: ILLEGAL CREATEPHASE SET IT ..\n", __LINE__);
eError = OMX_ErrorBadParameter;
goto ERROR;
}
if (i >= LCML_DATA_SIZE)
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg,
"%d :: Reached end of Create Phase Args Array. Did not find END_OF_CR_PHASE_ARGS marker. \n", __LINE__);
eError = OMX_ErrorBadParameter;
goto ERROR;
}
/* LCML_DPRINT("Create Phase args strlen = %d\n",strlen(crData.cData)); */
/* crData.cbData = sizeof (ULONG) + strlen(crData.cData); */
crData.cbData = i*2;
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "Create Phase args strlen = %ld\n", crData.cbData);
status = DSPNode_Allocate(phandle->dspCodec->hProc,
(struct DSP_UUID *)phandle->dspCodec->NodeInfo.AllUUIDs[0].uuid,
(struct DSP_CBDATA*)&crData,
&NodeAttrIn,&(phandle->dspCodec->hNode));
DSP_ERROR_EXIT(status, "Allocate Component", ERROR);
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: DSPNode_Allocate Successfully\n", __LINE__);
pArgs = (struct DSP_CBDATA *)argsBuf;
strcpy((char*)pArgs->cData, Args);
pArgs->cbData = (ULONG)strlen ((char *)pArgs->cData);
/* For debugging on connect DSP nodes */
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "[LCML] - struct DSP_CBDATA.cbData (length): %d %s\n", (int)pArgs->cbData, (char *)pArgs->cData);
if (phandle->dspCodec->DeviceInfo.TypeofDevice == 1)
{
OMX_PRDSP1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Audio Device Selected\n", __LINE__);
status = DSPNode_Allocate(phandle->dspCodec->hProc,
(struct DSP_UUID *)phandle->dspCodec->DeviceInfo.AllUUIDs[0].uuid,
NULL,
NULL,
&(phandle->dspCodec->hDasfNode));
DSP_ERROR_EXIT(status, "DASF Allocate Component", ERROR);
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: DASF DSPNode_Allocate Successfully\n", __LINE__);
if(phandle->dspCodec->DeviceInfo.DspStream != NULL)
{
if(phandle->dspCodec->DeviceInfo.TypeofRender == 0)
{
/* render for playback */
OMX_PRDSP1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Render for playback\n", __LINE__);
status = DSPNode_ConnectEx(phandle->dspCodec->hNode,
0,
(phandle->dspCodec->hDasfNode),
0,
(struct DSP_STRMATTR *)phandle->dspCodec->DeviceInfo.DspStream,
pArgs);
DSP_ERROR_EXIT(status, "Node Connect", ERROR);
}
else if(phandle->dspCodec->DeviceInfo.TypeofRender == 1)
{
/* render for record */
OMX_PRDSP1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Render for record\n", __LINE__);
status = DSPNode_ConnectEx(phandle->dspCodec->hDasfNode,
0,
phandle->dspCodec->hNode,
0,
(struct DSP_STRMATTR *)phandle->dspCodec->DeviceInfo.DspStream,
pArgs);
DSP_ERROR_EXIT(status, "Node Connect", ERROR);
}
}
else
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: ILLEGAL STREAM PARAMETER SET IT ..\n",__LINE__);
eError = OMX_ErrorBadParameter;
goto ERROR;
}
}
status = DSPNode_Create(phandle->dspCodec->hNode);
DSP_ERROR_EXIT(status, "Create the Node", ERROR);
OMX_PRDSP1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: After DSPNode_Create !!! \n", __LINE__);
status = DSPNode_Run(phandle->dspCodec->hNode);
DSP_ERROR_EXIT (status, "Goto RUN mode", ERROR);
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: DSPNode_Run Successfully\n", __LINE__);
if ((phandle->dspCodec->In_BufInfo.DataTrMethod == DMM_METHOD) || (phandle->dspCodec->Out_BufInfo.DataTrMethod == DMM_METHOD))
{
struct DSP_NOTIFICATION* notification;
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Registering the Node for Messaging\n",__LINE__);
LCML_MALLOC(notification,sizeof(struct DSP_NOTIFICATION),struct DSP_NOTIFICATION)
if(notification == NULL)
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: malloc failed....\n",__LINE__);
goto ERROR;
}
memset(notification, 0, sizeof(struct DSP_NOTIFICATION));
status = DSPNode_RegisterNotify(phandle->dspCodec->hNode, DSP_NODEMESSAGEREADY, DSP_SIGNALEVENT, notification);
DSP_ERROR_EXIT(status, "DSP node register notify", ERROR);
phandle->g_aNotificationObjects[0] = notification;
#ifdef __ERROR_PROPAGATION__
struct DSP_NOTIFICATION* notification_mmufault;
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Registering the Node for Messaging\n",__LINE__);
LCML_MALLOC(notification_mmufault,sizeof(struct DSP_NOTIFICATION),struct DSP_NOTIFICATION);
if(notification_mmufault == NULL)
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: malloc failed....\n",__LINE__);
goto ERROR;
}
memset(notification_mmufault,0,sizeof(struct DSP_NOTIFICATION));
status = DSPProcessor_RegisterNotify(phandle->dspCodec->hProc, DSP_MMUFAULT, DSP_SIGNALEVENT, notification_mmufault);
DSP_ERROR_EXIT(status, "DSP node register notify DSP_MMUFAULT", ERROR);
phandle->g_aNotificationObjects[1] = notification_mmufault;
struct DSP_NOTIFICATION* notification_syserror ;
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Registering the Node for Messaging\n",__LINE__);
LCML_MALLOC(notification_syserror,sizeof(struct DSP_NOTIFICATION),struct DSP_NOTIFICATION);
if(notification_syserror == NULL)
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: malloc failed....\n",__LINE__);
goto ERROR;
}
memset(notification_syserror,0,sizeof(struct DSP_NOTIFICATION));
status = DSPProcessor_RegisterNotify(phandle->dspCodec->hProc, DSP_SYSERROR, DSP_SIGNALEVENT, notification_syserror);
DSP_ERROR_EXIT(status, "DSP node register notify DSP_SYSERROR", ERROR);
phandle->g_aNotificationObjects[2] = notification_syserror;
#endif
}
/* Listener thread */
phandle->pshutdownFlag = 0;
phandle->g_tidMessageThread = 0;
phandle->bUsnEos = OMX_FALSE;
tmperr = pthread_create(&phandle->g_tidMessageThread,
NULL,
MessagingThread,
(void*)phandle);
if (tmperr || !phandle->g_tidMessageThread)
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "Thread creation failed: 0x%x",tmperr);
eError = OMX_ErrorInsufficientResources;
goto ERROR;
}
#ifdef __PERF_INSTRUMENTATION__
PERF_ThreadCreated(phandle->pPERF,
phandle->g_tidMessageThread,
PERF_FOURCC('C','M','L','T'));
#endif
/* init buffers buffer counter */
phandle->iBufinputcount = 0;
phandle->iBufoutputcount = 0;
for (i = 0; i < QUEUE_SIZE; i++)
{
phandle->Arminputstorage[i] = NULL;
phandle->Armoutputstorage[i] = NULL;
phandle->pAlgcntlDmmBuf[i] = NULL;
phandle->pStrmcntlDmmBuf[i] = NULL;
phandle->algcntlmapped[i] = 0;
phandle->strmcntlmapped[i] = 0;
}
#ifdef __PERF_INSTRUMENTATION__
PERF_Boundary(phandle->pPERF,
PERF_BoundaryComplete | PERF_BoundarySetup);
#endif
}
ERROR:
#ifndef CEXEC_DONE
LCML_FREE(argv);
#endif
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Exiting Init_DSPSubSystem\n error = %x\n", __LINE__, eError);
return eError;
}
/** ========================================================================
* InitMMCodec initialise the OMX Component specific handle to LCML.
* The memory is allocated and the dsp node is created. Add notification object
* to listener thread.
*
* @param hInterface - Handle to LCML which is allocated and filled
* @param codecName - not used
* @param toCodecInitParams - not used yet
* @param fromCodecInfoStruct - not used yet
* @param pCallbacks - List of callback that uses to call OMX
* @return OMX_ERRORTYPE
* If the command successfully executes, the return code will be
* OMX_NoError. Otherwise the appropriate OMX error will be returned.
* ==========================================================================*/
static OMX_ERRORTYPE InitMMCodec(OMX_HANDLETYPE hInt,
OMX_STRING codecName,
void * toCodecInitParams,
void * fromCodecInfoStruct,
LCML_CALLBACKTYPE *pCallbacks)
{
OMX_ERRORTYPE eError = OMX_ErrorNone;
OMX_U32 dllinfo;
LCML_DSP_INTERFACE * phandle;
#ifndef CEXEC_DONE
UINT argc = 1;
char argv[ABS_DLL_NAME_LENGTH];
k = append_dsp_path(DSP_DOF_IMAGE, argv);
if (k < 0)
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: append_dsp_path returned an error!\n", __LINE__);
eError = OMX_ErrorBadParameter;
goto ERROR;
}
#endif
LCML_CREATEPHASEARGS crData;
DSP_STATUS status;
int i = 0, k =0;
struct DSP_NODEATTRIN NodeAttrIn;
int tmperr;
char abs_dsp_path[ABS_DLL_NAME_LENGTH];
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: InitMMCodec application\n",__LINE__);
if (hInt == NULL )
{
eError = OMX_ErrorInsufficientResources;
goto ERROR;
}
phandle = (LCML_DSP_INTERFACE *)(((LCML_CODEC_INTERFACE *)hInt)->pCodec);
#ifdef __PERF_INSTRUMENTATION__
phandle->pPERF = PERF_Create(PERF_FOURCC('C','M','L',' '),
PERF_ModuleAudioDecode | PERF_ModuleAudioEncode |
PERF_ModuleVideoDecode | PERF_ModuleVideoEncode |
PERF_ModuleImageDecode | PERF_ModuleImageEncode |
PERF_ModuleCommonLayer);
PERF_Boundary(phandle->pPERF,
PERF_BoundaryStart | PERF_BoundarySetup);
#endif
/* 720p implementation */
{
pthread_mutex_init(&phandle->m_isStopped_mutex, NULL);
phandle->mapped_buffer_count = 0;
}
/* INIT DSP RESOURCE */
if(pCallbacks)
{
phandle->dspCodec->Callbacks.LCML_Callback = pCallbacks->LCML_Callback;
}
else
{
eError = OMX_ErrorBadParameter;
goto ERROR;
}
/* INITIALIZATION OF DSP */
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Entering Init_DSPSubSystem\n", __LINE__);
status = DspManager_Open(0, NULL);
DSP_ERROR_EXIT(status, "DSP Manager Open", ERROR);
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "DspManager_Open Successful\n");
/* Attach and get handle to processor */
status = DSPProcessor_Attach(TI_PROCESSOR_DSP, NULL, &(phandle->dspCodec->hProc));
DSP_ERROR_EXIT(status, "Attach processor", ERROR);
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "DSPProcessor_Attach Successful\n");
OMX_PRDSP1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "Base Image is Already Loaded\n");
for(dllinfo=0; dllinfo < phandle->dspCodec->NodeInfo.nNumOfDLLs; dllinfo++)
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Register Component Node\n",phandle->dspCodec->NodeInfo.AllUUIDs[dllinfo].eDllType);
k = append_dsp_path((char*)phandle->dspCodec->NodeInfo.AllUUIDs[dllinfo].DllName, abs_dsp_path);
if (k < 0)
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: append_dsp_path returned an error!\n", __LINE__);
eError = OMX_ErrorBadParameter;
goto ERROR;
}
status = DSPManager_RegisterObject((struct DSP_UUID *)phandle->dspCodec->NodeInfo.AllUUIDs[dllinfo].uuid,
phandle->dspCodec->NodeInfo.AllUUIDs[dllinfo].eDllType,
abs_dsp_path);
DSP_ERROR_EXIT (status, "Register Component Library", ERROR)
}
/* NODE specific data */
NodeAttrIn.cbStruct = sizeof(struct DSP_NODEATTRIN);
NodeAttrIn.iPriority = phandle->dspCodec->Priority;
NodeAttrIn.uTimeout = phandle->dspCodec->Timeout;
NodeAttrIn.uTimeout = 1000; /* WORKAROUND */
NodeAttrIn.uProfileID= phandle->dspCodec->ProfileID;
/* Prepare Create Phase Argument */
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Prepare Create Phase Argument \n",__LINE__);
/* TO DO check is application setting it properly */
if(phandle->dspCodec->pCrPhArgs !=NULL)
{
while((phandle->dspCodec->pCrPhArgs[i] != END_OF_CR_PHASE_ARGS) && (i < LCML_DATA_SIZE))
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: copying Create Phase Argument \n",i);
crData.cData[i] =phandle->dspCodec->pCrPhArgs[i];
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: CR PH arg[%d] = %d \n",__LINE__,i,crData.cData[i]);
i++;
}
}
else
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: ILLEGAL CREATEPHASE SET IT ..\n",__LINE__);
eError = OMX_ErrorBadParameter;
goto ERROR;
}
if (i >= LCML_DATA_SIZE)
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg,
"%d :: Reached end of Create Phase Args Array. Did not find END_OF_CR_PHASE_ARGS marker. \n", __LINE__);
eError = OMX_ErrorBadParameter;
goto ERROR;
}
/* LCML_DPRINT ("Create Phase args strlen = %d\n",strlen(crData.cData)); */
/* crData.cbData = sizeof (ULONG) + strlen(crData.cData); */
crData.cbData = i * 2;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "Create Phase args strlen = %ld\n", crData.cbData);
status = DSPNode_Allocate(phandle->dspCodec->hProc,
(struct DSP_UUID *)phandle->dspCodec->NodeInfo.AllUUIDs[0].uuid,
(struct DSP_CBDATA*)&crData, &NodeAttrIn,
&(phandle->dspCodec->hNode));
DSP_ERROR_EXIT(status, "Allocate Component", ERROR);
OMX_PRDSP1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: DSPNode_Allocate Successfully\n", __LINE__);
if(phandle->dspCodec->DeviceInfo.TypeofDevice == 1)
{
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Audio Device Selected\n", __LINE__);
status = DSPNode_Allocate(phandle->dspCodec->hProc,
(struct DSP_UUID *)phandle->dspCodec->DeviceInfo.AllUUIDs[0].uuid,
NULL,
NULL,
&(phandle->dspCodec->hDasfNode));
DSP_ERROR_EXIT(status, "DASF Allocate Component", ERROR);
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: DASF DSPNode_Allocate Successfully\n", __LINE__);
if(phandle->dspCodec->DeviceInfo.DspStream !=NULL)
{
if(phandle->dspCodec->DeviceInfo.TypeofRender == 0)
{
/* render for playback */
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Render for playback\n", __LINE__);
status = DSPNode_Connect(phandle->dspCodec->hNode,
0,
phandle->dspCodec->hDasfNode,
0,
(struct DSP_STRMATTR *)phandle->dspCodec->DeviceInfo.DspStream);
DSP_ERROR_EXIT(status, "Node Connect", ERROR);
}
else if(phandle->dspCodec->DeviceInfo.TypeofRender == 1)
{
/* render for record */
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Render for record\n", __LINE__);
status = DSPNode_Connect(phandle->dspCodec->hDasfNode,
0,
phandle->dspCodec->hNode,
0,
(struct DSP_STRMATTR *)phandle->dspCodec->DeviceInfo.DspStream);
DSP_ERROR_EXIT(status, "Node Connect", ERROR);
}
}
else
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: ILLEGAL STREAM PARAMETER SET IT ..\n",__LINE__);
eError = OMX_ErrorBadParameter;
goto ERROR;
}
}
status = DSPNode_Create(phandle->dspCodec->hNode);
DSP_ERROR_EXIT(status, "Create the Node", ERROR);
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: After DSPNode_Create !!! \n", __LINE__);
status = DSPNode_Run (phandle->dspCodec->hNode);
DSP_ERROR_EXIT (status, "Goto RUN mode", ERROR);
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: DSPNode_Run Successfully\n", __LINE__);
if ((phandle->dspCodec->In_BufInfo.DataTrMethod == DMM_METHOD) ||
(phandle->dspCodec->Out_BufInfo.DataTrMethod == DMM_METHOD))
{
struct DSP_NOTIFICATION* notification;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Registering the Node for Messaging\n",__LINE__);
LCML_MALLOC(notification,sizeof(struct DSP_NOTIFICATION),struct DSP_NOTIFICATION);
if(notification == NULL)
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: malloc failed....\n",__LINE__);
goto ERROR;
}
memset(notification,0,sizeof(struct DSP_NOTIFICATION));
status = DSPNode_RegisterNotify(phandle->dspCodec->hNode, DSP_NODEMESSAGEREADY, DSP_SIGNALEVENT, notification);
DSP_ERROR_EXIT(status, "DSP node register notify", ERROR);
phandle->g_aNotificationObjects[0] = notification;
#ifdef __ERROR_PROPAGATION__
struct DSP_NOTIFICATION* notification_mmufault;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Registering the Node for Messaging\n",__LINE__);
LCML_MALLOC(notification_mmufault,sizeof(struct DSP_NOTIFICATION),struct DSP_NOTIFICATION);
if(notification_mmufault == NULL)
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: malloc failed....\n",__LINE__);
goto ERROR;
}
memset(notification_mmufault,0,sizeof(struct DSP_NOTIFICATION));
status = DSPProcessor_RegisterNotify(phandle->dspCodec->hProc, DSP_MMUFAULT, DSP_SIGNALEVENT, notification_mmufault);
DSP_ERROR_EXIT(status, "DSP node register notify DSP_MMUFAULT", ERROR);
phandle->g_aNotificationObjects[1] = notification_mmufault;
struct DSP_NOTIFICATION* notification_syserror ;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Registering the Node for Messaging\n",__LINE__);
LCML_MALLOC(notification_syserror,sizeof(struct DSP_NOTIFICATION),struct DSP_NOTIFICATION);
if(notification_syserror == NULL)
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: malloc failed....\n",__LINE__);
goto ERROR;
}
memset(notification_syserror,0,sizeof(struct DSP_NOTIFICATION));
status = DSPProcessor_RegisterNotify(phandle->dspCodec->hProc, DSP_SYSERROR, DSP_SIGNALEVENT, notification_syserror);
DSP_ERROR_EXIT(status, "DSP node register notify DSP_SYSERROR", ERROR);
phandle->g_aNotificationObjects[2] = notification_syserror;
#endif
}
/* Listener thread */
phandle->pshutdownFlag = 0;
phandle->g_tidMessageThread = 0;
tmperr = pthread_create(&phandle->g_tidMessageThread,
NULL,
MessagingThread,
(void*)phandle);
if(tmperr || !phandle->g_tidMessageThread)
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "Thread creation failed: 0x%x",tmperr);
eError = OMX_ErrorInsufficientResources;
goto ERROR;
}
#ifdef __PERF_INSTRUMENTATION__
PERF_ThreadCreated(phandle->pPERF,
phandle->g_tidMessageThread,
PERF_FOURCC('C','M','L','T'));
#endif
/* init buffers buffer counter */
phandle->iBufinputcount =0;
phandle->iBufoutputcount =0;
for (i = 0; i < QUEUE_SIZE; i++)
{
phandle->Arminputstorage[i] = NULL;
phandle->Armoutputstorage[i] = NULL;
phandle->pAlgcntlDmmBuf[i] = NULL;
phandle->pStrmcntlDmmBuf[i] = NULL;
phandle->algcntlmapped[i] = 0;
phandle->strmcntlmapped[i] = 0;
}
#ifdef __PERF_INSTRUMENTATION__
PERF_Boundary(phandle->pPERF,
PERF_BoundaryComplete | PERF_BoundarySetup);
#endif
ERROR:
#ifndef CEXEC_DONE
LCML_FREE(argv);
#endif
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInt)->dbg, "%d :: Exiting Init_DSPSubSystem\n", __LINE__);
return eError;
}
/** ========================================================================
* The LCML_WaitForEvent Wait for a event sychronously
* @param hInterface - Handle of the component to be accessed. This is the
* component handle returned by the call to the GetHandle function.
* @param event - Event occured
* @param args - Array of "void *" that contains the associated arguments for
* occured event
*
* @return OMX_ERRORTYPE
* If the command successfully executes, the return code will be
* OMX_NoError. Otherwise the appropriate OMX error will be returned.
** ==========================================================================*/
static OMX_ERRORTYPE WaitForEvent(OMX_HANDLETYPE hComponent,
TUsnCodecEvent event,
void * args[10] )
{
OMX_ERRORTYPE eError = OMX_ErrorUndefined;
return eError;
}
/** ========================================================================
* The LCML_QueueBuffer send data to DSP convert it into USN format and send
* it to DSP via setbuff
* @param [in] hInterface - Handle of the component to be accessed. This is
* the component handle returned by the call to the GetHandle function.
* @param bufType - type of buffer
* @param buffer - pointer to buffer
* @param bufferLen - length of buffer
* @param bufferSizeUsed - length of used buffer
* @param auxInfo - pointer to parameter
* @param auxInfoLen - length of parameter
* @param usrArg - not used
* @return OMX_ERRORTYPE
* If the command successfully executes, the return code will be
* OMX_NoError. Otherwise the appropriate OMX error will be returned.
* ==========================================================================*/
static OMX_ERRORTYPE QueueBuffer (OMX_HANDLETYPE hComponent,
TMMCodecBufferType bufType,
OMX_U8 * buffer, OMX_S32 bufferLen,
OMX_S32 bufferSizeUsed ,OMX_U8 * auxInfo,
OMX_S32 auxInfoLen ,OMX_U8 * usrArg )
{
LCML_DSP_INTERFACE * phandle;
OMX_U32 streamId = 0;
DSP_STATUS status;
OMX_ERRORTYPE eError = OMX_ErrorNone;
char * tmp2=NULL;
DMM_BUFFER_OBJ* pDmmBuf=NULL;
int commandId;
struct DSP_MSG msg;
OMX_U32 MapBufLen=0;
OMX_BOOL mappedBufferFound = false;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "%d :: QueueBuffer application\n",__LINE__);
if (hComponent == NULL )
{
eError = OMX_ErrorInsufficientResources;
goto EXIT;
}
phandle = (LCML_DSP_INTERFACE *)(((LCML_CODEC_INTERFACE *)hComponent)->pCodec);
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "LCML QueueBuffer: phandle->iBufinputcount is %lu (%p) \n", phandle->iBufinputcount, phandle);
#ifdef __PERF_INSTRUMENTATION__
PERF_XferingBuffer(phandle->pPERF,
buffer,
bufferSizeUsed,
PERF_ModuleComponent,
PERF_ModuleSocketNode);
#endif
pthread_mutex_lock(&phandle->mutex);
LCML_MALLOC(tmp2,sizeof(TArmDspCommunicationStruct) + 256,char);
if (tmp2 == NULL)
{
eError = OMX_ErrorInsufficientResources;
goto MUTEX_UNLOCK;
}
memset(tmp2,0,sizeof(TArmDspCommunicationStruct)+256);
phandle->commStruct = (TArmDspCommunicationStruct *)(tmp2 + 128);
phandle->commStruct->iBufferPtr = (OMX_U32) buffer;
phandle->commStruct->iBufferSize = bufferLen;
phandle->commStruct->iParamPtr = (OMX_U32) auxInfo;
phandle->commStruct->iParamSize = auxInfoLen;
/*USN updation */
phandle->commStruct->iBufSizeUsed = bufferSizeUsed ;
phandle->commStruct->iArmArg = (OMX_U32) buffer;
phandle->commStruct->iArmParamArg = (OMX_U32) auxInfo;
/* if the bUsnEos flag is set interpret the usrArg as a buffer header */
if (phandle->bUsnEos == OMX_TRUE) {
phandle->commStruct->iEOSFlag = (((OMX_BUFFERHEADERTYPE*)usrArg)->nFlags & 0x00000001);
}
else {
phandle->commStruct->iEOSFlag = 0;
}
phandle->commStruct->iUsrArg = (OMX_U32) usrArg;
phandle->iBufoutputcount = phandle->iBufoutputcount % QUEUE_SIZE;
phandle->iBufinputcount = phandle->iBufinputcount % QUEUE_SIZE;
phandle->commStruct->Bufoutindex = phandle->iBufoutputcount;
phandle->commStruct->BufInindex = phandle->iBufinputcount;
switch (bufType)
{
case EMMCodecInputBufferMapBufLen:
bufType = EMMCodecInputBuffer;
MapBufLen = 1;
break;
case EMMCodecOutputBufferMapBufLen:
bufType = EMMCodecOuputBuffer;
MapBufLen = 1;
break;
case EMMCodecInputBufferMapReuse:
bufType = EMMCodecInputBuffer;
phandle->ReUseMap = 1;
break;
case EMMCodecOutputBufferMapReuse:
bufType = EMMCodecOuputBuffer;
phandle->ReUseMap = 1;
break;
default:
break;
}
if ((bufType >= EMMCodecStream0) && (bufType <= (EMMCodecStream0 + 20)))
{
streamId = bufType - EMMCodecStream0;
}
phandle->commStruct->iStreamID = streamId;
if (bufType == EMMCodecInputBuffer || !(streamId % 2))
{
phandle->Arminputstorage[phandle->iBufinputcount] = phandle->commStruct;
pDmmBuf = phandle->dspCodec->InDmmBuffer;
pDmmBuf = pDmmBuf + phandle->iBufinputcount;
phandle->iBufinputcount++;
phandle->iBufinputcount = phandle->iBufinputcount % QUEUE_SIZE;
OMX_PRBUFFER1 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "VPP port %lu use InDmmBuffer (%lu) %p\n", streamId, phandle->iBufinputcount, pDmmBuf);
}
else if (bufType == EMMCodecOuputBuffer || streamId % 2)
{
phandle->Armoutputstorage[phandle->iBufoutputcount] = phandle->commStruct;
pDmmBuf = phandle->dspCodec->OutDmmBuffer;
pDmmBuf = pDmmBuf + phandle->iBufoutputcount;
phandle->iBufoutputcount++;
phandle->iBufoutputcount = phandle->iBufoutputcount % QUEUE_SIZE;
}
else
{
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "Unrecognized buffer type..");
eError = OMX_ErrorBadParameter;
if(tmp2)
{
free(tmp2);
phandle->commStruct = NULL;
}
goto MUTEX_UNLOCK;
}
commandId = USN_GPPMSG_SET_BUFF|streamId;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "Sending command ID 0x%x",commandId);
if( pDmmBuf == NULL)
{
eError = OMX_ErrorInsufficientResources;
goto MUTEX_UNLOCK;
}
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "buffer = 0x%p bufferlen = %ld auxInfo = 0x%p auxInfoLen %ld\n",
buffer, bufferLen, auxInfo, auxInfoLen );
phandle->commStruct->iArmbufferArg = (OMX_U32)buffer;
if ((buffer != NULL) && (bufferLen != 0))
{
OMX_U32 i;
DSP_STATUS status;
if (phandle->ReUseMap)
{
mappedBufferFound = false;
for(i = 0; i <= phandle->mapped_buffer_count; i++)
{
if(phandle->mapped_dmm_buffers[i].pAllocated == buffer)
{
mappedBufferFound = true;
*pDmmBuf = phandle->mapped_dmm_buffers[i];
OMX_PRBUFFER1 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "Re-using pDmmBuf %p mapped %p\n", pDmmBuf, pDmmBuf->pMapped);
if(bufType == EMMCodecInputBuffer)
{
/* Issue a memory flush for input buffer to ensure cache coherency */
status = DSPProcessor_FlushMemory(phandle->dspCodec->hProc, pDmmBuf->pAllocated, bufferSizeUsed, (bufferSizeUsed > 512*1024) ? 3: 0);
if(DSP_FAILED(status))
{
goto MUTEX_UNLOCK;
}
}
else if(bufType == EMMCodecOuputBuffer)
{
/* Issue an memory invalidate for output buffer */
if (bufferLen > 512*1024)
{
status = DSPProcessor_FlushMemory(phandle->dspCodec->hProc, pDmmBuf->pAllocated, bufferLen, 3);
if(DSP_FAILED(status))
{
goto MUTEX_UNLOCK;
}
}
else
{
status = DSPProcessor_InvalidateMemory(phandle->dspCodec->hProc, pDmmBuf->pAllocated, bufferLen);
if(DSP_FAILED(status))
{
goto MUTEX_UNLOCK;
}
}
}
break;
}
}
if(false == mappedBufferFound)
{
if (bufType == EMMCodecInputBuffer || !(streamId % 2))
{
phandle->commStruct->iBufferSize = bufferSizeUsed ? bufferSizeUsed : bufferLen;
eError = DmmMap(phandle->dspCodec->hProc, bufferLen,buffer, (pDmmBuf), ((LCML_CODEC_INTERFACE *)hComponent)->dbg);
}
else if (bufType == EMMCodecOuputBuffer || streamId % 2) {
eError = DmmMap(phandle->dspCodec->hProc, bufferLen, buffer, (pDmmBuf), ((LCML_CODEC_INTERFACE *)hComponent)->dbg);
}
if (eError != OMX_ErrorNone)
{
goto MUTEX_UNLOCK;
}
/*720p implementation */
phandle->commStruct->iBufferPtr = (OMX_U32) pDmmBuf->pMapped;
/* storing reserve address for buffer */
pDmmBuf->bufReserved = pDmmBuf->pReserved;
if(phandle->mapped_buffer_count <= MAX_DMM_BUFFERS)
{
phandle->mapped_dmm_buffers[phandle->mapped_buffer_count++] = *pDmmBuf;
}
}
phandle->commStruct->iBufferPtr = (OMX_U32) pDmmBuf->pMapped;
}
else
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "Mapping buffer continously\n");
if (bufType == EMMCodecInputBuffer || !(streamId % 2))
{
if (MapBufLen)
{
/*using this option only when not mapping the entire memory region
* can cause a DSP MMU FAULT or DSP SYS ERROR */
eError = DmmMap(phandle->dspCodec->hProc, bufferLen, buffer, (pDmmBuf), ((LCML_CODEC_INTERFACE *)hComponent)->dbg);
}
else
{
phandle->commStruct->iBufferSize = bufferSizeUsed ? bufferSizeUsed : bufferLen;
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "Mapping Size %ld out of %ld", bufferSizeUsed, bufferLen);
eError = DmmMap(phandle->dspCodec->hProc, bufferSizeUsed ? bufferSizeUsed : bufferLen,buffer, (pDmmBuf), ((LCML_CODEC_INTERFACE *)hComponent)->dbg);
}
}
else if (bufType == EMMCodecOuputBuffer || streamId % 2) {
eError = DmmMap(phandle->dspCodec->hProc, bufferLen, buffer, (pDmmBuf), ((LCML_CODEC_INTERFACE *)hComponent)->dbg);
}
if (eError != OMX_ErrorNone)
{
goto MUTEX_UNLOCK;
}
phandle->commStruct->iBufferPtr = (OMX_U32) pDmmBuf->pMapped;
pDmmBuf->bufReserved = pDmmBuf->pReserved;
}
}
if (auxInfoLen != 0 && auxInfo != NULL )
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "mapping parameter \n");
eError = DmmMap(phandle->dspCodec->hProc, phandle->commStruct->iParamSize, (void*)phandle->commStruct->iParamPtr, (pDmmBuf), ((LCML_CODEC_INTERFACE *)hComponent)->dbg);
if (eError != OMX_ErrorNone)
{
goto MUTEX_UNLOCK;
}
phandle->commStruct->iParamPtr = (OMX_U32 )pDmmBuf->pMapped ;
/* storing reserve address for param */
pDmmBuf->paramReserved = pDmmBuf->pReserved;
}
eError = DmmMap(phandle->dspCodec->hProc, sizeof(TArmDspCommunicationStruct),(void *)phandle->commStruct, (pDmmBuf), ((LCML_CODEC_INTERFACE *)hComponent)->dbg);
if (eError != OMX_ErrorNone)
{
goto MUTEX_UNLOCK;
}
/* storing mapped address of struct */
phandle->commStruct->iArmArg = (OMX_U32)pDmmBuf->pMapped;
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "sending SETBUFF \n");
msg.dwCmd = commandId;
msg.dwArg1 = (int)pDmmBuf->pMapped;
msg.dwArg2 = 0;
status = DSPNode_PutMessage (phandle->dspCodec->hNode, &msg, DSP_FOREVER);
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "after SETBUFF \n");
DSP_ERROR_EXIT (status, "Send message to node", MUTEX_UNLOCK);
MUTEX_UNLOCK:
pthread_mutex_unlock(&phandle->mutex);
EXIT:
return eError;
}
/** ========================================================================
* The LCML_ControlCodec send command to DSP convert it into USN format and
* send it to DSP
* @param hInterface - Handle of the component to be accessed. This is the
* component handle returned by the call to the GetHandle function.
* @param bufType - type of buffer
* @param iCodecCmd - command refer TControlCmd
* @param args - pointer to send some specific command to DSP
*
* @return OMX_ERRORTYPE
* If the command successfully executes, the return code will be
* OMX_NoError. Otherwise the appropriate OMX error will be returned.
** ==========================================================================*/
static OMX_ERRORTYPE ControlCodec(OMX_HANDLETYPE hComponent,
TControlCmd iCodecCmd,
void * args[10])
{
LCML_DSP_INTERFACE * phandle;
DSP_STATUS status;
OMX_ERRORTYPE eError = OMX_ErrorNone;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "%d :: ControlCodec application\n",__LINE__);
if (hComponent == NULL )
{
eError= OMX_ErrorInsufficientResources;
goto EXIT;
}
phandle = (LCML_DSP_INTERFACE *)(((LCML_CODEC_INTERFACE *)hComponent)->pCodec);
#ifdef __PERF_INSTRUMENTATION__
PERF_ReceivedCommand(phandle->pPERF,
(OMX_U32) iCodecCmd,
(OMX_U32) args,
PERF_ModuleLLMM);
#endif
switch (iCodecCmd)
{
case EMMCodecControlPause:
{
struct DSP_MSG msg = {USN_GPPMSG_PAUSE, 0, 0};
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "Sending PAUSE command");
#ifdef __PERF_INSTRUMENTATION__
PERF_SendingCommand(phandle->pPERF,
msg.dwCmd,
msg.dwArg1,
PERF_ModuleSocketNode);
#endif
status = DSPNode_PutMessage (phandle->dspCodec->hNode, &msg, DSP_FOREVER);
DSP_ERROR_EXIT (status, "Send message to node", EXIT);
break;
}
case EMMCodecControlStart:
{
struct DSP_MSG msg = {USN_GPPMSG_PLAY, 0, 0};
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "Sending PLAY --1 command");
#ifdef __PERF_INSTRUMENTATION__
PERF_SendingCommand(phandle->pPERF,
msg.dwCmd,
msg.dwArg1,
PERF_ModuleSocketNode);
#endif
status = DSPNode_PutMessage (phandle->dspCodec->hNode, &msg, DSP_FOREVER);
DSP_ERROR_EXIT (status, "Send message to node", EXIT);
break;
}
case MMCodecControlStop:
{
struct DSP_MSG msg = {USN_GPPMSG_STOP, 0, 0};
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "Sending STOP command\n");
#ifdef __PERF_INSTRUMENTATION__
PERF_SendingCommand(phandle->pPERF,
msg.dwCmd,
msg.dwArg1,
PERF_ModuleSocketNode);
#endif
status = DSPNode_PutMessage (phandle->dspCodec->hNode, &msg, DSP_FOREVER);
DSP_ERROR_EXIT (status, "Send message to node", EXIT);
break;
}
case EMMCodecControlDestroy:
{
int pthreadError = 0;
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "Destroy the codec");
#ifdef __PERF_INSTRUMENTATION__
PERF_Boundary(phandle->pPERF,
PERF_BoundaryStart | PERF_BoundaryCleanup);
PERF_SendingCommand(phandle->pPERF,
-1, 0, PERF_ModuleComponent);
#endif
phandle->pshutdownFlag = 1;
pthreadError = pthread_join(phandle->g_tidMessageThread, NULL);
if (0 != pthreadError)
{
eError = OMX_ErrorHardware;
OMX_ERROR4 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "%d :: Error while closing Component Thread\n", pthreadError);
}
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "Destroy the codec %d",eError);
/* 720p implementation */
/*DeleteDspResource (phandle);*/
if (phandle->ReUseMap)
{
pthread_mutex_lock(&phandle->m_isStopped_mutex);
/*If you are able to obtain the lock then the Messaging thread has exited*/
pthread_mutex_unlock(&phandle->m_isStopped_mutex);
}
if (phandle->ReUseMap)
{
OMX_U32 i;
/* Unmap buffers */
for(i=0; i< phandle->mapped_buffer_count; i++)
{
DmmUnMap(phandle->dspCodec->hProc,(void*)phandle->mapped_dmm_buffers[i].pMapped,
phandle->mapped_dmm_buffers[i].bufReserved, ((LCML_CODEC_INTERFACE *)hComponent)->dbg);
}
for(i = 0; i <= phandle->mapped_buffer_count; i++)
{
phandle->mapped_dmm_buffers[i].pAllocated = 0;
phandle->mapped_dmm_buffers[i].pReserved = 0;
phandle->mapped_dmm_buffers[i].pMapped = 0;
phandle->mapped_dmm_buffers[i].bufReserved = 0;
phandle->mapped_dmm_buffers[i].paramReserved = 0;
phandle->mapped_dmm_buffers[i].nSize = 0;
}
phandle->mapped_buffer_count = 0;
}
DeleteDspResource (phandle);
#ifdef __PERF_INSTRUMENTATION__
PERF_OBJHANDLE pPERF = phandle->pPERF;
#endif
FreeResources(phandle);
#ifdef __PERF_INSTRUMENTATION__
PERF_Boundary(pPERF, PERF_BoundaryComplete | PERF_BoundaryCleanup);
PERF_Done(pPERF);
#endif
break;
}
/* this case is for sending extra custom commands to DSP socket node */
case EMMCodecControlSendDspMessage:
{
/* todo: Check to see if the arguments are valid */
struct DSP_MSG msg = {(int)args[0], (int)args[1], (int)args[2]};
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "message to codec");
#ifdef __PERF_INSTRUMENTATION__
PERF_SendingCommand(phandle->pPERF,
msg.dwCmd,
msg.dwArg1,
PERF_ModuleSocketNode);
#endif
status = DSPNode_PutMessage (phandle->dspCodec->hNode, &msg, DSP_FOREVER);
DSP_ERROR_EXIT (status, "Send message to node", EXIT);
break;
}
case EMMCodecControlAlgCtrl:
{
struct DSP_MSG msg;
int i;
pthread_mutex_lock(&phandle->mutex);
for (i = 0; i < QUEUE_SIZE; i++)
{
/* searching for empty slot */
if (phandle->pAlgcntlDmmBuf[i] == NULL)
break;
}
if(i >= QUEUE_SIZE)
{
pthread_mutex_unlock(&phandle->mutex);
eError = OMX_ErrorUndefined;
goto EXIT;
}
LCML_MALLOC(phandle->pAlgcntlDmmBuf[i],sizeof(DMM_BUFFER_OBJ),DMM_BUFFER_OBJ);
if(phandle->pAlgcntlDmmBuf[i] == NULL)
{
eError = OMX_ErrorInsufficientResources;
pthread_mutex_unlock(&phandle->mutex);
goto EXIT;
}
memset(phandle->pAlgcntlDmmBuf[i],0,sizeof(DMM_BUFFER_OBJ));
eError = DmmMap(phandle->dspCodec->hProc,(int)args[2], args[1],(phandle->pAlgcntlDmmBuf[i]), ((LCML_CODEC_INTERFACE *)hComponent)->dbg);
if (eError != OMX_ErrorNone)
{
pthread_mutex_unlock(&phandle->mutex);
goto EXIT;
}
phandle->algcntlmapped[i] = 1;
msg.dwCmd = USN_GPPMSG_ALGCTRL;
msg.dwArg1 = (int)args[0];
msg.dwArg2 = (int)phandle->pAlgcntlDmmBuf[i]->pMapped;
#ifdef __PERF_INSTRUMENTATION__
PERF_SendingCommand(phandle->pPERF,
msg.dwCmd,
msg.dwArg1,
PERF_ModuleSocketNode);
#endif
status = DSPNode_PutMessage (phandle->dspCodec->hNode, &msg, DSP_FOREVER);
pthread_mutex_unlock(&phandle->mutex);
DSP_ERROR_EXIT (status, "Send message to node", EXIT);
break;
}
case EMMCodecControlStrmCtrl:
{
struct DSP_MSG msg;
pthread_mutex_lock(&phandle->mutex);
if ((int)args[0] == USN_STRMCMD_FLUSH) {
msg.dwCmd = USN_GPPMSG_STRMCTRL | (int)args[1];
msg.dwArg1 = USN_STRMCMD_FLUSH;
msg.dwArg2 = 0;
phandle->flush_pending[(int)args[1]]= 1;
#ifdef __PERF_INSTRUMENTATION__
PERF_SendingCommand(phandle->pPERF,
msg.dwCmd,
msg.dwArg1,
PERF_ModuleSocketNode);
#endif
}
else
{
int i;
for (i = 0; i < QUEUE_SIZE; i++)
{
/* searching for empty slot */
if (phandle->pStrmcntlDmmBuf[i] == NULL)
break;
}
if(i >= QUEUE_SIZE)
{
eError=OMX_ErrorUndefined;
pthread_mutex_unlock(&phandle->mutex);
goto EXIT;
}
LCML_MALLOC(phandle->pStrmcntlDmmBuf[i],sizeof(DMM_BUFFER_OBJ),DMM_BUFFER_OBJ);
if(phandle->pStrmcntlDmmBuf[i] == NULL)
{
eError = OMX_ErrorInsufficientResources;
pthread_mutex_unlock(&phandle->mutex);
goto EXIT;
}
memset(phandle->pStrmcntlDmmBuf[i],0,sizeof(DMM_BUFFER_OBJ)); //ATC
eError = DmmMap(phandle->dspCodec->hProc, (int)args[2], args[1],(phandle->pStrmcntlDmmBuf[i]), ((LCML_CODEC_INTERFACE *)hComponent)->dbg);
if (eError != OMX_ErrorNone)
{
pthread_mutex_unlock(&phandle->mutex);
goto EXIT;
}
phandle->strmcntlmapped[i] = 1;
if(phandle->dspCodec->DeviceInfo.TypeofRender == 0)
{
/* playback mode */
msg.dwCmd = USN_GPPMSG_STRMCTRL | 0x01;
msg.dwArg1 = (int)args[0];
msg.dwArg2 = (int)phandle->pStrmcntlDmmBuf[i]->pMapped;
}
else if(phandle->dspCodec->DeviceInfo.TypeofRender == 1)
{
/* record mode */
msg.dwCmd = USN_GPPMSG_STRMCTRL;
msg.dwArg1 = (int)args[0];
msg.dwArg2 = (int)phandle->pStrmcntlDmmBuf[i]->pMapped;
}
}
#ifdef __PERF_INSTRUMENTATION__
PERF_SendingCommand(phandle->pPERF,
msg.dwCmd,
msg.dwArg1,
PERF_ModuleSocketNode);
#endif
status = DSPNode_PutMessage (phandle->dspCodec->hNode, &msg, DSP_FOREVER);
pthread_mutex_unlock(&phandle->mutex);
DSP_ERROR_EXIT (status, "Send message to node", EXIT);
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "STRMControl: arg[0]: message = %x\n",(int)args[0]);
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "STRMControl: arg[1]: address = %p\n",args[1]);
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)hComponent)->dbg, "STRMControl: arg[2]: size = %d\n",(int)args[2]);
break;
}
case EMMCodecControlUsnEos:
{
phandle->bUsnEos = OMX_TRUE;
break;
}
}
EXIT:
return eError;
}
/** ========================================================================
* DmmMap () method is used to allocate the memory using DMM.
*
* @param ProcHandle - Component identification number
* @param size - Buffer header address, that needs to be sent to codec
* @param pArmPtr - Message used to send the buffer to codec
* @param pDmmBuf - buffer id
*
* @retval OMX_ErrorNone - Success
* OMX_ErrorHardware - Hardware Error
** ==========================================================================*/
OMX_ERRORTYPE DmmMap(DSP_HPROCESSOR ProcHandle,
OMX_U32 size,
void* pArmPtr,
DMM_BUFFER_OBJ* pDmmBuf,
struct OMX_TI_Debug dbg)
{
OMX_ERRORTYPE eError = OMX_ErrorUndefined;
DSP_STATUS status;
int nSizeReserved = 0;
if(pDmmBuf == NULL)
{
OMX_ERROR4 (dbg, "pBuf is NULL\n");
eError = OMX_ErrorBadParameter;
goto EXIT;
}
if(pArmPtr == NULL)
{
OMX_ERROR4 (dbg, "pBuf is NULL\n");
eError = OMX_ErrorBadParameter;
goto EXIT;
}
/* Allocate */
pDmmBuf->pAllocated = pArmPtr;
/* Reserve */
nSizeReserved = ROUND_TO_PAGESIZE(size) + 2*DMM_PAGE_SIZE ;
status = DSPProcessor_ReserveMemory(ProcHandle, nSizeReserved, &(pDmmBuf->pReserved));
if(DSP_FAILED(status))
{
OMX_ERROR4 (dbg, "DSPProcessor_ReserveMemory() failed - error 0x%x", (int)status);
eError = OMX_ErrorInsufficientResources;
goto EXIT;
}
pDmmBuf->nSize = size;
OMX_PRBUFFER2 (dbg, " DMM MAP Reserved: %p (for buf %p), size 0x%x (%d)", pDmmBuf->pReserved, pArmPtr, nSizeReserved,nSizeReserved);
/* Map */
status = DSPProcessor_Map(ProcHandle,
pDmmBuf->pAllocated,/* malloc'd data here*/
size , /* size */
pDmmBuf->pReserved, /* reserved space */
&(pDmmBuf->pMapped), /* returned map pointer */
0); /* final param is reserved. set to zero. */
if(DSP_FAILED(status))
{
OMX_ERROR4 (dbg, "DSPProcessor_Map() failed - error 0x%x", (int)status);
eError = OMX_ErrorInsufficientResources;
goto EXIT;
}
OMX_PRBUFFER1 (dbg, "DMM Mapped: %p, size 0x%lx (%ld)",pDmmBuf->pMapped, size,size);
/* Previously we used to Flush or Invalidate the mapped buffer. This was
* removed due to bridge is now handling the flush/invalidate operation */
eError = OMX_ErrorNone;
EXIT:
return eError;
}
/** ========================================================================
* DmmUnMap () method is used to de-allocate the memory using DMM.
*
* @param ProcHandle - Component identification number
* @param pMapPtr - Map address
* @param pResPtr - reserve adress
*
* @retval OMX_ErrorNone - Success
* OMX_ErrorHardware - Hardware Error
** ==========================================================================*/
OMX_ERRORTYPE DmmUnMap(DSP_HPROCESSOR ProcHandle, void* pMapPtr, void* pResPtr, struct OMX_TI_Debug dbg )
{
DSP_STATUS status = DSP_SOK;
OMX_ERRORTYPE eError = OMX_ErrorNone;
if(pMapPtr == NULL)
{
OMX_ERROR4 (dbg, "pMapPtr is NULL\n");
eError = OMX_ErrorBadParameter;
goto EXIT;
}
if(pResPtr == NULL)
{
OMX_ERROR4 (dbg, "pResPtr is NULL\n");
eError = OMX_ErrorBadParameter;
goto EXIT;
}
status = DSPProcessor_UnMap(ProcHandle,pMapPtr);
if(DSP_FAILED(status))
{
OMX_PRDSP4 (dbg, "DSPProcessor_UnMap() failed - error 0x%x",(int)status);
}
OMX_PRINT2 (dbg, "unreserving structure =0x%p\n",pResPtr );
status = DSPProcessor_UnReserveMemory(ProcHandle,pResPtr);
if(DSP_FAILED(status))
{
OMX_PRDSP4 (dbg, "DSPProcessor_UnReserveMemory() failed - error 0x%x", (int)status);
}
EXIT:
return eError;
}
/** ========================================================================
* FreeResources () method is used to allocate the memory using DMM.
*
* @param hInterface - Component identification number
*
* @retval OMX_ErrorNone Success
* OMX_ErrorHardware Hardware Error
** ==========================================================================*/
OMX_ERRORTYPE FreeResources (LCML_DSP_INTERFACE *hInterface)
{
OMX_ERRORTYPE eError = OMX_ErrorNone;
LCML_DSP_INTERFACE *codec;
OMX_PRINT1 ((struct OMX_TI_Debug)(((LCML_CODEC_INTERFACE *)hInterface->pCodecinterfacehandle)->dbg), "%d :: LCML:: FreeResources\n",__LINE__);
if(hInterface->dspCodec != NULL)
{
LCML_FREE(hInterface->dspCodec);
hInterface->dspCodec = NULL;
}
codec = (LCML_DSP_INTERFACE *)(((LCML_CODEC_INTERFACE*)hInterface->pCodecinterfacehandle)->pCodec);
if(codec != NULL)
{
pthread_mutex_destroy(&codec->m_isStopped_mutex);
pthread_mutex_lock(&codec->mutex);
OMX_PRINT1 ((struct OMX_TI_Debug)(((LCML_CODEC_INTERFACE *)hInterface->pCodecinterfacehandle)->dbg), "%d :: LCML:: FreeResources\n",__LINE__);
if(codec->g_aNotificationObjects[0]!= NULL)
{
LCML_FREE(codec->g_aNotificationObjects[0]);
codec->g_aNotificationObjects[0] = NULL;
#ifdef __ERROR_PROPAGATION__
if(codec->g_aNotificationObjects[1]!= NULL)
{
LCML_FREE(codec->g_aNotificationObjects[1]);
codec->g_aNotificationObjects[1] = NULL;
}
if(codec->g_aNotificationObjects[2]!= NULL)
{
LCML_FREE(codec->g_aNotificationObjects[2]);
codec->g_aNotificationObjects[2] = NULL;
}
#endif
OMX_DBG_CLOSE((struct OMX_TI_Debug )(((LCML_CODEC_INTERFACE*)hInterface->pCodecinterfacehandle)->dbg));
LCML_FREE(((LCML_CODEC_INTERFACE*)hInterface->pCodecinterfacehandle));
hInterface->pCodecinterfacehandle = NULL;
}
pthread_mutex_unlock(&codec->mutex);
pthread_mutex_destroy (&codec->mutex);
LCML_FREE(codec);
codec = NULL;
}
return eError;
}
/** ========================================================================
* DeleteDspResource () method is used to allocate the memory using DMM.
*
* @param hInterface Component identification number
*
* @retval OMX_ErrorNone Success
* OMX_ErrorHardware Hardware Error
** ==========================================================================*/
OMX_ERRORTYPE DeleteDspResource(LCML_DSP_INTERFACE *hInterface)
{
OMX_ERRORTYPE eError = OMX_ErrorNone;
DSP_STATUS status;
DSP_STATUS nExit;
struct DSP_NODEATTR nodeAttr;
OMX_U32 dllinfo;
LCML_DSP_INTERFACE *codec;
/* Get current state of node, if it is running, then only terminate it */
status = DSPNode_GetAttr(hInterface->dspCodec->hNode, &nodeAttr, sizeof(nodeAttr));
DSP_ERROR_EXIT (status, "DeInit: Error in Node GetAtt ", EXIT);
status = DSPNode_Terminate(hInterface->dspCodec->hNode, &nExit);
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInterface->pCodecinterfacehandle)->dbg, "%d :: LCML:: Node Has Been Terminated --1\n",__LINE__);
codec = (LCML_DSP_INTERFACE *)(((LCML_CODEC_INTERFACE*)hInterface->pCodecinterfacehandle)->pCodec);
if(codec->g_aNotificationObjects[0]!= NULL)
{
}
#ifdef __ERROR_PROPAGATION__
if(codec->g_aNotificationObjects[1]!= NULL)
{
/* status = DSPNode_RegisterNotify(hInterface->dspCodec->hProc, 0, DSP_SIGNALEVENT, codec->g_aNotificationObjects[1]);
DSP_ERROR_EXIT(status, "DSP node de-register notify", EXIT);*/
}
#endif
if (hInterface->dspCodec->DeviceInfo.TypeofDevice == 1) {
/* delete DASF node */
status = DSPNode_Delete(hInterface->dspCodec->hDasfNode);
DSP_ERROR_EXIT (status, "DeInit: DASF Node Delete ", EXIT);
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInterface->pCodecinterfacehandle)->dbg, "%d :: Deleted the DASF node Successfully\n",__LINE__);
}
/* delete SN */
status = DSPNode_Delete(hInterface->dspCodec->hNode);
DSP_ERROR_EXIT (status, "DeInit: Codec Node Delete ", EXIT);
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)hInterface->pCodecinterfacehandle)->dbg, "%d :: Deleted the node Successfully\n",__LINE__);
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInterface->pCodecinterfacehandle)->dbg, "%d :: Entering UnLoadDLLs \n", __LINE__);
for(dllinfo=0;dllinfo < hInterface->dspCodec->NodeInfo.nNumOfDLLs ;dllinfo++)
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)hInterface->pCodecinterfacehandle)->dbg, "%d :: Register Component Node\n",hInterface->dspCodec->NodeInfo.AllUUIDs[dllinfo].eDllType);
status = DSPManager_UnregisterObject ((struct DSP_UUID *) hInterface->dspCodec->NodeInfo.AllUUIDs[dllinfo].uuid,
hInterface->dspCodec->NodeInfo.AllUUIDs[dllinfo].eDllType);
/*DSP_ERROR_EXIT (status, "Unregister DSP Object, Socket UUID ", EXIT);*/
}
/* detach processor from gpp */
status = DSPProcessor_Detach(hInterface->dspCodec->hProc);
DSP_ERROR_EXIT (status, "DeInit: DSP Processor Detach ", EXIT);
status = DspManager_Close(0, NULL);
DSP_ERROR_EXIT (status, "DeInit: DSPManager Close ", EXIT);
EXIT:
return eError;
}
/** ========================================================================
* This is the function run in the message thread. It waits for an event
* signal from Bridge and then reads all available messages.
*
* @param[in] arg Unused - Required by pthreads API
*
* @retval OMX_ErrorNone Success, ready to roll
** ==========================================================================*/
void* MessagingThread(void* arg)
{
/* OMX_ERRORTYPE eError = OMX_ErrorUndefined; */
DSP_STATUS status = DSP_SOK;
struct DSP_MSG msg = {0,0,0};
unsigned int index=0;
LCML_MESSAGINGTHREAD_STATE threadState = EMessagingThreadCodecStopped;
int waitForEventsTimeout = 1000;
// There is no need to set a timeout value for message retrieval.
// Just in case that we need to change it to a different value
// such as 10 ms?
const int getMessageTimeout = 0;
#ifdef ANDROID
prctl(PR_SET_NAME, (unsigned long)"Messaging", 0, 0, 0);
#endif
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "Inside the Messaging thread\n");
#ifdef __PERF_INSTRUMENTATION__
((LCML_DSP_INTERFACE *)arg)->pPERFcomp =
PERF_Create(PERF_FOURCC('C','M','L','T'),
PERF_ModuleAudioDecode | PERF_ModuleAudioEncode |
PERF_ModuleVideoDecode | PERF_ModuleVideoEncode |
PERF_ModuleImageDecode | PERF_ModuleImageEncode |
PERF_ModuleCommonLayer);
#endif
if (((LCML_DSP_INTERFACE *)arg)->ReUseMap)
{
pthread_mutex_lock(&((LCML_DSP_INTERFACE *)arg)->m_isStopped_mutex);
}
/* get message from DSP */
while (1)
{
if (((LCML_DSP_INTERFACE *)arg)->pshutdownFlag == 1)
{
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "Breaking out of loop inmessaging thread \n");
break;
}
if (threadState == EMessagingThreadCodecRunning) {
waitForEventsTimeout = 10000;
}
/* set the timeouts lower when the codec is stopped so that thread deletion response will be faster */
else if (threadState == EMessagingThreadCodecStopped) {
waitForEventsTimeout = 10;
}
#ifdef __ERROR_PROPAGATION__
status = DSPManager_WaitForEvents(((LCML_DSP_INTERFACE *)arg)->g_aNotificationObjects, 3, &index, waitForEventsTimeout);
#else
status = DSPManager_WaitForEvents(((LCML_DSP_INTERFACE *)arg)->g_aNotificationObjects, 1, &index, waitForEventsTimeout);
#endif
if (DSP_SUCCEEDED(status))
{
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "GOT notofication FROM DSP HANDLE IT \n");
#ifdef __ERROR_PROPAGATION__
if (index == 0){
#endif
/* Pull all available messages out of the message loop */
while (DSP_SUCCEEDED(status))
{
/* since there is a message waiting, grab it and pass */
status = DSPNode_GetMessage(((LCML_DSP_INTERFACE *)arg)->dspCodec->hNode, &msg, getMessageTimeout);
if (DSP_SUCCEEDED(status))
{
OMX_U32 streamId = (msg.dwCmd & 0x000000ff);
int commandId = msg.dwCmd & 0xffffff00;
TMMCodecBufferType bufType ;/* = EMMCodecScratchBuffer; */
TUsnCodecEvent event = EMMCodecInternalError;
void * args[10] = {};
TArmDspCommunicationStruct *tmpDspStructAddress = NULL;
LCML_DSP_INTERFACE *hDSPInterface = ((LCML_DSP_INTERFACE *)arg) ;
DMM_BUFFER_OBJ* pDmmBuf = NULL;
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"GOT MESSAGE FROM DSP HANDLE IT %d \n", index);
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"msg = 0x%lx arg1 = 0x%lx arg2 = 0x%lx", msg.dwCmd, msg.dwArg1, msg.dwArg2);
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"Message EMMCodecOuputBuffer outside loop");
#ifdef __PERF_INSTRUMENTATION__
PERF_ReceivedCommand(hDSPInterface->pPERFcomp,
msg.dwCmd, msg.dwArg1,
PERF_ModuleSocketNode);
#endif
if (commandId == USN_DSPMSG_BUFF_FREE )
{
threadState = EMessagingThreadCodecRunning;
#ifdef __PERF_INSTRUMENTATION__
PERF_XferingBuffer(hDSPInterface->pPERFcomp,
args [1],
(OMX_U32) args [8],
PERF_ModuleSocketNode,
PERF_ModuleLLMM);
#endif
pthread_mutex_lock(&hDSPInterface->mutex);
if (!(streamId % 2))
{
int i = 0;
int j = 0;
bufType = streamId + EMMCodecStream0;
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"Address Arminputstorage %p \n", ((LCML_DSP_INTERFACE *)arg)->Arminputstorage);
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"Address dspinterface %p \n", ((LCML_DSP_INTERFACE *)arg));
hDSPInterface->iBufinputcount = hDSPInterface->iBufinputcount % QUEUE_SIZE;
i = hDSPInterface->iBufinputcount;
while(j++ < QUEUE_SIZE)
{
if (hDSPInterface->Arminputstorage[i] != NULL && hDSPInterface ->Arminputstorage[i]->iArmArg == msg.dwArg1)
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "InputBuffer loop");
tmpDspStructAddress = ((LCML_DSP_INTERFACE *)arg)->Arminputstorage[i] ;
hDSPInterface->Arminputstorage[i] =NULL;
pDmmBuf = hDSPInterface ->dspCodec->InDmmBuffer;
pDmmBuf = pDmmBuf + (tmpDspStructAddress->BufInindex);
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "Address output matching index= %ld \n ",tmpDspStructAddress->BufInindex);
break;
}
i++;
i = i % QUEUE_SIZE;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "Message EMMCodecInputBuffer loop");
}
}
else if (streamId % 2)
{
int i = 0;
int j = 0;
bufType = streamId + EMMCodecStream0;;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "Address Armoutputstorage %p \n ",((LCML_DSP_INTERFACE *)arg)->Armoutputstorage);
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "Address dspinterface %p \n ",((LCML_DSP_INTERFACE *)arg));
hDSPInterface->iBufoutputcount = hDSPInterface->iBufoutputcount % QUEUE_SIZE;
i = hDSPInterface->iBufoutputcount;
while(j++ < QUEUE_SIZE)
{
if( hDSPInterface ->Armoutputstorage[i] != NULL
&& hDSPInterface ->Armoutputstorage[i]->iArmArg == msg.dwArg1)
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "output buffer loop");
tmpDspStructAddress = hDSPInterface->Armoutputstorage[i] ;
hDSPInterface ->Armoutputstorage[i] =NULL;
pDmmBuf = hDSPInterface ->dspCodec->OutDmmBuffer;
pDmmBuf = pDmmBuf + (tmpDspStructAddress->Bufoutindex);
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"Address output matching index= %ld\n ",tmpDspStructAddress->Bufoutindex);
break;
}
i++;
i = i % QUEUE_SIZE;
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"Message EMMCodecOuputBuffer loop");
}
}
if (tmpDspStructAddress != NULL)
{
char *tmp2 = NULL;
status = DSPProcessor_InvalidateMemory(hDSPInterface->dspCodec->hProc,
tmpDspStructAddress, sizeof(TArmDspCommunicationStruct));
if (DSP_FAILED(status)) {
ALOGE("Invalidate for communication structure failed. status = 0x%x\n", status);
}
// Only invalidate the memory when the pointer points to some valid memory region
// otherwise, we will get logging spam
if (tmpDspStructAddress->iArmParamArg != NULL && tmpDspStructAddress->iParamSize > 0) {
status = DSPProcessor_InvalidateMemory(hDSPInterface->dspCodec->hProc,
tmpDspStructAddress->iArmParamArg, tmpDspStructAddress->iParamSize);
if (DSP_FAILED(status)) {
ALOGE("Invalidate for arm parameter arguments failed. status = 0x%x\n", status);
}
}
event = EMMCodecBufferProcessed;
args[0] = (void *) bufType;
args[1] = (void *) tmpDspStructAddress->iArmbufferArg; /* arm address fpr buffer */
args[2] = (void *) tmpDspStructAddress->iBufferSize;
args[3] = (void *) tmpDspStructAddress->iArmParamArg; /* arm address for param */
args[4] = (void *) tmpDspStructAddress->iParamSize;
args[5] = (void *) tmpDspStructAddress->iArmArg;
args[6] = (void *) arg; /* handle */
args[7] = (void *) tmpDspStructAddress->iUsrArg; /* user arguments */
if (((LCML_DSP_INTERFACE *)arg)->bUsnEos) {
((OMX_BUFFERHEADERTYPE*)args[7])->nFlags |= tmpDspStructAddress->iEOSFlag;
}
/* USN updates*/
args[8] = (void *) tmpDspStructAddress->iBufSizeUsed ;
/* managing buffers and free buffer logic */
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"GOT MESSAGE EMMCodecBufferProcessed and now unmapping buffer type %p \n", args[2]);
if (tmpDspStructAddress ->iBufferPtr != (OMX_U32)NULL)
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"GOT MESSAGE EMMCodecBufferProcessed and now unmapping buufer %lx\n size=%ld",
tmpDspStructAddress ->iBufferPtr, tmpDspStructAddress ->iBufferSize);
/* 720p implementation */
if (!hDSPInterface->ReUseMap)
{
DmmUnMap(hDSPInterface->dspCodec->hProc,
(void*)tmpDspStructAddress->iBufferPtr,
pDmmBuf->bufReserved, ((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
}
if (tmpDspStructAddress->iParamPtr != (OMX_U32)NULL)
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"GOT MESSAGE EMMCodecBufferProcessed and now unmapping parameter buufer\n");
DmmUnMap(hDSPInterface ->dspCodec->hProc,
(void*)tmpDspStructAddress->iParamPtr,
pDmmBuf->paramReserved, ((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"GOT MESSAGE EMMCodecBufferProcessed and now unmapping structure =0x%p\n",tmpDspStructAddress );
DmmUnMap(hDSPInterface->dspCodec->hProc, pDmmBuf->pMapped, pDmmBuf->pReserved, ((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
tmp2 = (char *)tmpDspStructAddress;
tmp2 = (tmp2 - 128);
if (tmp2)
{
LCML_FREE(tmp2);
tmp2 = NULL;
}
/* free(tmpDspStructAddress); */
tmpDspStructAddress = NULL;
}
pthread_mutex_unlock(&hDSPInterface->mutex);
} /* End of USN_DSPMSG_BUFF_FREE */
else if (commandId == USN_DSPACK_STOP)
{
threadState = EMessagingThreadCodecStopped;
/* Start of USN_DSPACK_STOP */
int i = 0;
int j = 0;
int k = 0;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"GOT MESSAGE EMMCodecProcessingStoped \n");
pthread_mutex_lock(&hDSPInterface->mutex);
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLSTOP: hDSPInterface->dspCodec->DeviceInfo.TypeofDevice %d\n", hDSPInterface->dspCodec->DeviceInfo.TypeofDevice);
if (hDSPInterface->dspCodec->DeviceInfo.TypeofDevice == 0)
{
j = 0;
hDSPInterface->iBufinputcount = hDSPInterface->iBufinputcount % QUEUE_SIZE;
i = hDSPInterface->iBufinputcount;
hDSPInterface->iBufoutputcount = hDSPInterface->iBufoutputcount % QUEUE_SIZE;
k = hDSPInterface->iBufoutputcount;
while(j++ < QUEUE_SIZE)
{
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLSTOP: %d hDSPInterface->Arminputstorage[i] = %p\n", i, hDSPInterface->Arminputstorage[i]);
if (hDSPInterface->Arminputstorage[i] != NULL)
{
char *tmp2 = NULL;
/* callback the component with the buffers that are being freed */
tmpDspStructAddress = hDSPInterface->Arminputstorage[i] ;
pDmmBuf = hDSPInterface ->dspCodec->InDmmBuffer;
pDmmBuf = pDmmBuf + (tmpDspStructAddress->BufInindex);
OMX_PRBUFFER1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"pDmmBuf->pMapped %p\n", pDmmBuf->pMapped);
event = EMMCodecBufferProcessed;
args[0] = (void *) EMMCodecInputBuffer;
args[1] = (void *) tmpDspStructAddress->iArmbufferArg; /* arm address fpr buffer */
args[2] = (void *) tmpDspStructAddress->iBufferSize;
args[3] = (void *) tmpDspStructAddress->iArmParamArg; /* arm address for param */
args[4] = (void *) tmpDspStructAddress->iParamSize;
args[5] = (void *) tmpDspStructAddress->iArmArg;
args[6] = (void *) arg; /* handle */
args[7] = (void *) tmpDspStructAddress->iUsrArg; /* user arguments */
/* USN updates*/
args[8] = (void *) tmpDspStructAddress->iBufSizeUsed ;
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLSTOP: tmpDspStructAddress->iBufferPtr %p, tmpDspStructAddress->iParamPtr %p, msg.dwArg1 %p\n",
(void *)tmpDspStructAddress->iBufferPtr,
(void *)tmpDspStructAddress->iParamPtr,
(void *)msg.dwArg1);
if (tmpDspStructAddress->iBufferPtr != (OMX_U32)NULL)
{
if (!hDSPInterface->ReUseMap)
{
DmmUnMap(hDSPInterface->dspCodec->hProc,
(void*)tmpDspStructAddress->iBufferPtr,
pDmmBuf->bufReserved, ((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
}
if (tmpDspStructAddress->iParamPtr != (OMX_U32)NULL)
{
DmmUnMap(hDSPInterface ->dspCodec->hProc,
(void*)tmpDspStructAddress->iParamPtr,
pDmmBuf->paramReserved, ((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
DmmUnMap(hDSPInterface->dspCodec->hProc, pDmmBuf->pMapped, pDmmBuf->pReserved, ((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
if (NULL != tmpDspStructAddress)
{
tmp2 = (char*)tmpDspStructAddress;
tmp2 = ( tmp2 - 128);
}
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"%d :: LCML:: FreeResources\n",__LINE__);
if (tmp2)
{
LCML_FREE(tmp2);
tmp2 = NULL;
}
hDSPInterface->Arminputstorage[i] = NULL;
tmpDspStructAddress = NULL;
#ifdef __PERF_INSTRUMENTATION__
PERF_XferingBuffer(hDSPInterface->pPERFcomp,
args [1],
(OMX_U32) args [2],
PERF_ModuleSocketNode,
PERF_ModuleLLMM);
#endif
hDSPInterface->dspCodec->Callbacks.LCML_Callback(event,args);
}
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLSTOP: %d hDSPInterface->Armoutputstorage[k] = %p\n", k, hDSPInterface->Armoutputstorage[k]);
if (hDSPInterface->Armoutputstorage[k] != NULL)
{
char * tmp2 = NULL;
tmpDspStructAddress = hDSPInterface->Armoutputstorage[k] ;
pDmmBuf = hDSPInterface ->dspCodec->OutDmmBuffer;
pDmmBuf = pDmmBuf + (tmpDspStructAddress->Bufoutindex);
event = EMMCodecBufferProcessed;
args[0] = (void *) EMMCodecOuputBuffer;
args[1] = (void *) tmpDspStructAddress->iArmbufferArg; /* arm address fpr buffer */
args[2] = (void *) tmpDspStructAddress->iBufferSize;
args[3] = (void *) tmpDspStructAddress->iArmParamArg; /* arm address for param */
args[4] = (void *) tmpDspStructAddress->iParamSize;
args[5] = (void *) tmpDspStructAddress->iArmArg;
args[6] = (void *) arg; /* handle */
args[7] = (void *) tmpDspStructAddress->iUsrArg; /* user arguments */
/* USN updates*/
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLSTOP: tmpDspStructAddress->iBufferPtr %p, tmpDspStructAddress->iParamPtr %p, msg.dwArg1 %p\n",
(void *)tmpDspStructAddress->iBufferPtr,
(void *)tmpDspStructAddress->iParamPtr,
(void *)msg.dwArg1);
if (tmpDspStructAddress ->iBufferPtr != (OMX_U32)NULL)
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"tmpDspStructAddress ->iBufferPtr is not NULL\n");
if (!hDSPInterface->ReUseMap)
{
DmmUnMap(hDSPInterface->dspCodec->hProc,
(void*)tmpDspStructAddress->iBufferPtr,
pDmmBuf->bufReserved, ((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
}
if (tmpDspStructAddress->iParamPtr != (OMX_U32)NULL)
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"tmpDspStructAddress->iParamPtr is not NULL\n");
DmmUnMap(hDSPInterface ->dspCodec->hProc,
(void*)tmpDspStructAddress->iParamPtr,
pDmmBuf->paramReserved, ((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
DmmUnMap(hDSPInterface->dspCodec->hProc, pDmmBuf->pMapped, pDmmBuf->pReserved, ((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
tmp2 = (char *) tmpDspStructAddress;
tmp2 = ( tmp2 - 128);
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"%d :: LCML:: FreeResources\n",__LINE__);
if(tmp2)
{
LCML_FREE(tmp2);
tmp2 = NULL;
}
tmpDspStructAddress->iBufSizeUsed = 0;
args[8] = (void *) tmpDspStructAddress->iBufSizeUsed ;
hDSPInterface->Armoutputstorage[k] = NULL;
tmpDspStructAddress = NULL;
#ifdef __PERF_INSTRUMENTATION__
PERF_XferingBuffer(hDSPInterface->pPERFcomp,
args[1],
(OMX_U32) args[2],
PERF_ModuleSocketNode,
PERF_ModuleLLMM);
#endif
hDSPInterface->dspCodec->Callbacks.LCML_Callback(event,args);
}
i++;
i = i % QUEUE_SIZE;
k++;
k = k % QUEUE_SIZE;
}
}
pthread_mutex_unlock(&hDSPInterface->mutex);
args[6] = (void *) arg; /* handle */
event = EMMCodecProcessingStoped;
} /* end of USN_DSPACK_STOP */
else if (commandId == USN_DSPACK_PAUSE)
{
event = EMMCodecProcessingPaused;
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"GOT MESSAGE EMMCodecProcessingPaused \n");
args[6] = (void *) arg; /* handle */
}
else if (commandId == USN_DSPMSG_EVENT)
{
threadState = EMessagingThreadCodecStopped;
event = EMMCodecDspError;
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"GOT MESSAGE EMMCodecDspError \n");
args[0] = (void *) msg.dwCmd;
args[4] = (void *) msg.dwArg1;
args[5] = (void *) msg.dwArg2;
args[6] = (void *) arg; /* handle */
}
else if (commandId == USN_DSPACK_ALGCTRL)
{
int i;
event = EMMCodecAlgCtrlAck;
pthread_mutex_lock(&hDSPInterface->mutex);
for (i = 0; i < QUEUE_SIZE; i++)
{
pDmmBuf = ((LCML_DSP_INTERFACE *)arg)->pAlgcntlDmmBuf[i];
if ((pDmmBuf) &&
(((LCML_DSP_INTERFACE *)arg)->algcntlmapped[i]) &&
(pDmmBuf->pMapped == (void *)msg.dwArg2))
{
DmmUnMap(hDSPInterface->dspCodec->hProc, pDmmBuf->pMapped, pDmmBuf->pReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
LCML_FREE(pDmmBuf);
pDmmBuf = NULL;
((LCML_DSP_INTERFACE *)arg)->algcntlmapped[i] = 0;
((LCML_DSP_INTERFACE *)arg)->pAlgcntlDmmBuf[i] = NULL;
break;
}
}
args[0] = (void *) msg.dwArg1;
args[6] = (void *) arg; /* handle */
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "GOT MESSAGE USN_DSPACK_ALGCTRL \n");
pthread_mutex_unlock(&hDSPInterface->mutex);
}
else if (commandId == USN_DSPACK_STRMCTRL)
{
int i = 0;
int j = 0;
int ackType = 0;
pthread_mutex_lock(&hDSPInterface->mutex);
if (hDSPInterface->flush_pending[0] && (streamId == 0) && (msg.dwArg1 == USN_ERR_NONE))
{
hDSPInterface->flush_pending[0] = 0;
ackType = USN_STRMCMD_FLUSH;
j = 0;
hDSPInterface->iBufinputcount = hDSPInterface->iBufinputcount % QUEUE_SIZE;
i = hDSPInterface->iBufinputcount;
while(j++ < QUEUE_SIZE)
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLFLUSH: %d hDSPInterface->Arminputstorage[i] = %p\n", i, hDSPInterface->Arminputstorage[i]);
if (hDSPInterface->Arminputstorage[i] != NULL)
{
char *tmp2 = NULL;
tmpDspStructAddress = hDSPInterface->Arminputstorage[i] ;
pDmmBuf = hDSPInterface ->dspCodec->InDmmBuffer;
pDmmBuf = pDmmBuf + (tmpDspStructAddress->BufInindex);
OMX_PRBUFFER2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"pDmmBuf->pMapped %p\n", pDmmBuf->pMapped);
event = EMMCodecBufferProcessed;
args[0] = (void *) EMMCodecInputBuffer;
args[1] = (void *) tmpDspStructAddress->iArmbufferArg;
args[2] = (void *) tmpDspStructAddress->iBufferSize;
args[3] = (void *) tmpDspStructAddress->iArmParamArg;
args[4] = (void *) tmpDspStructAddress->iParamSize;
args[5] = (void *) tmpDspStructAddress->iArmArg;
args[6] = (void *) arg;
args[7] = (void *) tmpDspStructAddress->iUsrArg;
args[8] = (void *) tmpDspStructAddress->iBufSizeUsed ;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLFLUSH: tmpDspStructAddress->iBufferPtr %p, tmpDspStructAddress->iParamPtr %p, msg.dwArg1 %p\n",
(void *)tmpDspStructAddress->iBufferPtr,
(void *)tmpDspStructAddress->iParamPtr,
(void *)msg.dwArg1);
if (tmpDspStructAddress->iBufferPtr != (OMX_U32)NULL)
{
/* 720p implementation */
if (!hDSPInterface->ReUseMap)
{
DmmUnMap(hDSPInterface->dspCodec->hProc,
(void*)tmpDspStructAddress->iBufferPtr,
pDmmBuf->bufReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
}
if (tmpDspStructAddress->iParamPtr != (OMX_U32)NULL)
{
DmmUnMap(hDSPInterface ->dspCodec->hProc,
(void*)tmpDspStructAddress->iParamPtr,
pDmmBuf->paramReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
DmmUnMap(hDSPInterface->dspCodec->hProc, pDmmBuf->pMapped, pDmmBuf->pReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
if (NULL != tmpDspStructAddress)
{
tmp2 = (char*)tmpDspStructAddress;
tmp2 = ( tmp2 - 128);
}
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"%d :: LCML:: FreeResources\n",__LINE__);
if (tmp2)
{
LCML_FREE(tmp2);
tmp2 = NULL;
}
hDSPInterface->Arminputstorage[i] = NULL;
tmpDspStructAddress = NULL;
#ifdef __PERF_INSTRUMENTATION__
PERF_XferingBuffer(hDSPInterface->pPERFcomp,
args [1],
(OMX_U32) args [2],
PERF_ModuleSocketNode,
PERF_ModuleLLMM);
#endif
hDSPInterface->dspCodec->Callbacks.LCML_Callback(event,args);
}
i++;
i = i % QUEUE_SIZE;
}
for (i = 0; i < QUEUE_SIZE; i++)
{
pDmmBuf = ((LCML_DSP_INTERFACE *)arg)->pStrmcntlDmmBuf[i];
if ((pDmmBuf) &&
(((LCML_DSP_INTERFACE *)arg)->strmcntlmapped[i]) &&
(pDmmBuf->pMapped == (void *)msg.dwArg2))
{
DmmUnMap(hDSPInterface->dspCodec->hProc, pDmmBuf->pMapped, pDmmBuf->pReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
LCML_FREE(pDmmBuf);
pDmmBuf = NULL;
((LCML_DSP_INTERFACE *)arg)->strmcntlmapped[i] = 0;
((LCML_DSP_INTERFACE *)arg)->pStrmcntlDmmBuf[i] = NULL;
break;
}
}
}
else if (hDSPInterface->flush_pending[1] && (streamId == 1) && (msg.dwArg1 == USN_ERR_NONE))
{
hDSPInterface->flush_pending[1] = 0;
ackType = USN_STRMCMD_FLUSH;
j = 0;
hDSPInterface->iBufoutputcount = hDSPInterface->iBufoutputcount % QUEUE_SIZE;
i = hDSPInterface->iBufoutputcount;
while(j++ < QUEUE_SIZE)
{
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLFLUSH: %d hDSPInterface->Armoutputstorage[i] = %p\n", i, hDSPInterface->Armoutputstorage[i]);
if (hDSPInterface->Armoutputstorage[i] != NULL)
{
char * tmp2 = NULL;
tmpDspStructAddress = hDSPInterface->Armoutputstorage[i] ;
pDmmBuf = hDSPInterface ->dspCodec->OutDmmBuffer;
pDmmBuf = pDmmBuf + (tmpDspStructAddress->Bufoutindex);
event = EMMCodecBufferProcessed;
args[0] = (void *) EMMCodecOuputBuffer;
args[1] = (void *) tmpDspStructAddress->iArmbufferArg;
args[2] = (void *) tmpDspStructAddress->iBufferSize;
args[3] = (void *) tmpDspStructAddress->iArmParamArg;
args[4] = (void *) tmpDspStructAddress->iParamSize;
args[5] = (void *) tmpDspStructAddress->iArmArg;
args[6] = (void *) arg;
args[7] = (void *) tmpDspStructAddress->iUsrArg;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLFLUSH: tmpDspStructAddress->iBufferPtr %p, tmpDspStructAddress->iParamPtr %p, msg.dwArg1 %p\n",
(void *)tmpDspStructAddress->iBufferPtr,
(void *)tmpDspStructAddress->iParamPtr,
(void *)msg.dwArg1);
if (tmpDspStructAddress ->iBufferPtr != (OMX_U32)NULL)
{
/* 720p implementation */
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"tmpDspStructAddress ->iBufferPtr is not NULL\n");
if (!hDSPInterface->ReUseMap)
{
DmmUnMap(hDSPInterface->dspCodec->hProc,
(void*)tmpDspStructAddress->iBufferPtr,
pDmmBuf->bufReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
}
if (tmpDspStructAddress->iParamPtr != (OMX_U32)NULL)
{
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"tmpDspStructAddress->iParamPtr is not NULL\n");
DmmUnMap(hDSPInterface ->dspCodec->hProc,
(void*)tmpDspStructAddress->iParamPtr,
pDmmBuf->paramReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
DmmUnMap(hDSPInterface->dspCodec->hProc, pDmmBuf->pMapped, pDmmBuf->pReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
tmp2 = (char *) tmpDspStructAddress;
tmp2 = ( tmp2 - 128);
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"%d :: LCML:: FreeResources\n",__LINE__);
if(tmp2)
{
LCML_FREE(tmp2);
tmp2 = NULL;
}
tmpDspStructAddress->iBufSizeUsed = 0;
args[8] = (void *) tmpDspStructAddress->iBufSizeUsed ;
hDSPInterface->Armoutputstorage[i] = NULL;
tmpDspStructAddress = NULL;
#ifdef __PERF_INSTRUMENTATION__
PERF_XferingBuffer(hDSPInterface->pPERFcomp,
args[1],
(OMX_U32) args[2],
PERF_ModuleSocketNode,
PERF_ModuleLLMM);
#endif
hDSPInterface->dspCodec->Callbacks.LCML_Callback(event,args);
}
i++;
i = i % QUEUE_SIZE;
}
for (i = 0; i < QUEUE_SIZE; i++)
{
pDmmBuf = ((LCML_DSP_INTERFACE *)arg)->pStrmcntlDmmBuf[i];
if ((pDmmBuf) &&
(((LCML_DSP_INTERFACE *)arg)->strmcntlmapped[i]) &&
(pDmmBuf->pMapped == (void *)msg.dwArg2))
{
DmmUnMap(hDSPInterface->dspCodec->hProc, pDmmBuf->pMapped, pDmmBuf->pReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
LCML_FREE(pDmmBuf);
pDmmBuf = NULL;
((LCML_DSP_INTERFACE *)arg)->strmcntlmapped[i] = 0;
((LCML_DSP_INTERFACE *)arg)->pStrmcntlDmmBuf[i] = NULL;
break;
}
}
}
if (hDSPInterface->flush_pending[2] && (streamId == 2) && (msg.dwArg1 == USN_ERR_NONE))
{
hDSPInterface->flush_pending[0] = 0;
ackType = USN_STRMCMD_FLUSH;
j = 0;
hDSPInterface->iBufinputcount = hDSPInterface->iBufinputcount % QUEUE_SIZE;
i = hDSPInterface->iBufinputcount;
while(j++ < QUEUE_SIZE)
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLFLUSH (port 2): %d hDSPInterface->Arminputstorage[i] = %p (stream ID %lu)\n", i, hDSPInterface->Arminputstorage[i], streamId);
if ((hDSPInterface->Arminputstorage[i] != NULL) && (hDSPInterface->Arminputstorage[i]->iStreamID == streamId))
{
char *tmp2 = NULL;
tmpDspStructAddress = hDSPInterface->Arminputstorage[i] ;
pDmmBuf = hDSPInterface ->dspCodec->InDmmBuffer;
pDmmBuf = pDmmBuf + (tmpDspStructAddress->BufInindex);
OMX_PRBUFFER2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"pDmmBuf->pMapped %p\n", pDmmBuf->pMapped);
event = EMMCodecBufferProcessed;
args[0] = (void *) EMMCodecInputBuffer;
args[1] = (void *) tmpDspStructAddress->iArmbufferArg;
args[2] = (void *) tmpDspStructAddress->iBufferSize;
args[3] = (void *) tmpDspStructAddress->iArmParamArg;
args[4] = (void *) tmpDspStructAddress->iParamSize;
args[5] = (void *) tmpDspStructAddress->iArmArg;
args[6] = (void *) arg;
args[7] = (void *) tmpDspStructAddress->iUsrArg;
args[8] = (void *) tmpDspStructAddress->iBufSizeUsed ;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLFLUSH: tmpDspStructAddress->iBufferPtr %p, tmpDspStructAddress->iParamPtr %p, msg.dwArg1 %p\n",
(void *)tmpDspStructAddress->iBufferPtr,
(void *)tmpDspStructAddress->iParamPtr,
(void *)msg.dwArg1);
if (tmpDspStructAddress->iBufferPtr != (OMX_U32)NULL)
{
/* 720p implementation */
if (!hDSPInterface->ReUseMap)
{
DmmUnMap(hDSPInterface->dspCodec->hProc,
(void*)tmpDspStructAddress->iBufferPtr,
pDmmBuf->bufReserved, ((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
}
if (tmpDspStructAddress->iParamPtr != (OMX_U32)NULL)
{
DmmUnMap(hDSPInterface ->dspCodec->hProc,
(void*)tmpDspStructAddress->iParamPtr,
pDmmBuf->paramReserved, ((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
DmmUnMap(hDSPInterface->dspCodec->hProc, pDmmBuf->pMapped, pDmmBuf->pReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
tmp2 = (char*)tmpDspStructAddress;
tmp2 = ( tmp2 - 128);
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"%d :: LCML:: FreeResources\n",__LINE__);
if (tmp2)
{
LCML_FREE(tmp2);
tmp2 = NULL;
}
hDSPInterface->Arminputstorage[i] = NULL;
tmpDspStructAddress = NULL;
#ifdef __PERF_INSTRUMENTATION__
PERF_XferingBuffer(hDSPInterface->pPERFcomp,
args [1],
(OMX_U32) args [2],
PERF_ModuleSocketNode,
PERF_ModuleLLMM);
#endif
hDSPInterface->dspCodec->Callbacks.LCML_Callback(event,args);
}
i++;
i = i % QUEUE_SIZE;
}
}
else if (hDSPInterface->flush_pending[3] && (streamId == 3) && (msg.dwArg1 == USN_ERR_NONE))
{
hDSPInterface->flush_pending[1] = 0;
ackType = USN_STRMCMD_FLUSH;
j = 0;
hDSPInterface->iBufoutputcount = hDSPInterface->iBufoutputcount % QUEUE_SIZE;
i = hDSPInterface->iBufoutputcount;
while(j++ < QUEUE_SIZE)
{
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLFLUSH: %d hDSPInterface->Armoutputstorage[i] = %p (stream id %lu)\n", i, hDSPInterface->Armoutputstorage[i], streamId);
if ((hDSPInterface->Armoutputstorage[i] != NULL) && (hDSPInterface->Armoutputstorage[i]->iStreamID == streamId))
{
char * tmp2 = NULL;
tmpDspStructAddress = hDSPInterface->Armoutputstorage[i] ;
pDmmBuf = hDSPInterface ->dspCodec->OutDmmBuffer;
pDmmBuf = pDmmBuf + (tmpDspStructAddress->Bufoutindex);
event = EMMCodecBufferProcessed;
args[0] = (void *) EMMCodecOuputBuffer;
args[1] = (void *) tmpDspStructAddress->iArmbufferArg;
args[2] = (void *) tmpDspStructAddress->iBufferSize;
args[3] = (void *) tmpDspStructAddress->iArmParamArg;
args[4] = (void *) tmpDspStructAddress->iParamSize;
args[5] = (void *) tmpDspStructAddress->iArmArg;
args[6] = (void *) arg;
args[7] = (void *) tmpDspStructAddress->iUsrArg;
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"LCMLFLUSH: tmpDspStructAddress->iBufferPtr %p, tmpDspStructAddress->iParamPtr %p, msg.dwArg1 %p\n",
(void *)tmpDspStructAddress->iBufferPtr,
(void *)tmpDspStructAddress->iParamPtr,
(void *)msg.dwArg1);
if (tmpDspStructAddress ->iBufferPtr != (OMX_U32)NULL)
{
/* 720p implementation */
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"tmpDspStructAddress ->iBufferPtr is not NULL\n");
if (!hDSPInterface->ReUseMap)
{
DmmUnMap(hDSPInterface->dspCodec->hProc,
(void*)tmpDspStructAddress->iBufferPtr,
pDmmBuf->bufReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
}
if (tmpDspStructAddress->iParamPtr != (OMX_U32)NULL)
{
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"tmpDspStructAddress->iParamPtr is not NULL\n");
DmmUnMap(hDSPInterface ->dspCodec->hProc,
(void*)tmpDspStructAddress->iParamPtr,
pDmmBuf->paramReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
}
DmmUnMap(hDSPInterface->dspCodec->hProc, pDmmBuf->pMapped, pDmmBuf->pReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
tmp2 = (char *) tmpDspStructAddress;
tmp2 = ( tmp2 - 128);
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg,
"%d :: LCML:: FreeResources\n",__LINE__);
if(tmp2)
{
LCML_FREE(tmp2);
tmp2 = NULL;
}
tmpDspStructAddress->iBufSizeUsed = 0;
args[8] = (void *) tmpDspStructAddress->iBufSizeUsed ;
hDSPInterface->Armoutputstorage[i] = NULL;
tmpDspStructAddress = NULL;
#ifdef __PERF_INSTRUMENTATION__
PERF_XferingBuffer(hDSPInterface->pPERFcomp,
args[1],
(OMX_U32) args[2],
PERF_ModuleSocketNode,
PERF_ModuleLLMM);
#endif
hDSPInterface->dspCodec->Callbacks.LCML_Callback(event,args);
}
i++;
i = i % QUEUE_SIZE;
}
}
if (ackType != USN_STRMCMD_FLUSH) {
for (i = 0; i < QUEUE_SIZE; i++)
{
pDmmBuf = ((LCML_DSP_INTERFACE *)arg)->pStrmcntlDmmBuf[i];
if ((pDmmBuf) &&
(((LCML_DSP_INTERFACE *)arg)->strmcntlmapped[i]) &&
(pDmmBuf->pMapped == (void *)msg.dwArg2))
{
DmmUnMap(hDSPInterface->dspCodec->hProc, pDmmBuf->pMapped, pDmmBuf->pReserved,
((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg);
LCML_FREE(pDmmBuf);
pDmmBuf = NULL;
((LCML_DSP_INTERFACE *)arg)->strmcntlmapped[i] = 0;
((LCML_DSP_INTERFACE *)arg)->pStrmcntlDmmBuf[i] = NULL;
break;
}
}
}
pthread_mutex_unlock(&hDSPInterface->mutex);
event = EMMCodecStrmCtrlAck;
bufType = streamId + EMMCodecStream0;
args[0] = (void *) msg.dwArg1; /* SN error status */
args[1] = (void *) ackType; /* acknowledge Id */
args[2] = (void *) bufType; /* port Id */
args[6] = (void *) arg; /* handle */
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "GOT MESSAGE USN_DSPACK_STRMCTRL \n");
}
else
{
event = EMMCodecDspMessageRecieved;
args[0] = (void *) msg.dwCmd;
args[1] = (void *) msg.dwArg1;
args[2] = (void *) msg.dwArg2;
args[6] = (void *) arg; /* handle */
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "GOT MESSAGE EMMCodecDspMessageRecieved \n");
}
/* call callback */
OMX_PRINT2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "calling callback in application %p \n",((LCML_DSP_INTERFACE *)arg)->dspCodec);
#ifdef __PERF_INSTRUMENTATION__
PERF_SendingCommand(hDSPInterface->pPERFcomp,
msg.dwCmd,
msg.dwArg1,
PERF_ModuleLLMM);
#endif
hDSPInterface->dspCodec->Callbacks.LCML_Callback(event,args);
}/* end of internal if(DSP_SUCCEEDED(status)) */
else
{
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "%d :: DSPManager_getmessage() failed: 0x%lx",__LINE__, status);
}
}/* end of internal while loop*/
#ifdef __ERROR_PROPAGATION__
}/*end of if(index == 0)*/
if (index == 1){
struct DSP_PROCESSORSTATE procState;
DSPProcessor_GetState(((LCML_DSP_INTERFACE *)arg)->dspCodec->hProc, &procState, sizeof(procState));
/*
fprintf(stdout, " dwErrMask = %0x \n",procState.errInfo.dwErrMask);
fprintf(stdout, " dwVal1 = %0x \n",procState.errInfo.dwVal1);
fprintf(stdout, " dwVal2 = %0x \n",procState.errInfo.dwVal2);
fprintf(stdout, " dwVal3 = %0x \n",procState.errInfo.dwVal3);
fprintf(stdout, "MMU Fault Error.\n");
*/
TUsnCodecEvent event = EMMCodecDspError;
void * args[10];
LCML_DSP_INTERFACE *hDSPInterface = ((LCML_DSP_INTERFACE *)arg) ;
args[0] = NULL;
args[4] = NULL;
args[5] = NULL;
args[6] = (void *) arg; /* handle */
hDSPInterface->dspCodec->Callbacks.LCML_Callback(event,args);
}
if (index == 2){
struct DSP_PROCESSORSTATE procState;
DSPProcessor_GetState(((LCML_DSP_INTERFACE *)arg)->dspCodec->hProc, &procState, sizeof(procState));
/*
fprintf(stdout, " dwErrMask = %0x \n",procState.errInfo.dwErrMask);
fprintf(stdout, " dwVal1 = %0x \n",procState.errInfo.dwVal1);
fprintf(stdout, " dwVal2 = %0x \n",procState.errInfo.dwVal2);
fprintf(stdout, " dwVal3 = %0x \n",procState.errInfo.dwVal3);
fprintf(stdout, "SYS_ERROR Error.\n");
*/
TUsnCodecEvent event = EMMCodecDspError;
void * args[10];
LCML_DSP_INTERFACE *hDSPInterface = ((LCML_DSP_INTERFACE *)arg) ;
args[0] = NULL;
args[4] = NULL;
args[5] = NULL;
args[6] = (void *) arg; /* handle */
hDSPInterface->dspCodec->Callbacks.LCML_Callback(event,args);
}
#endif
} /* end of external if(DSP_SUCCEEDED(status)) */
else
{
OMX_PRDSP2 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "%d :: DSPManager_WaitForEvents() failed: 0x%lx",__LINE__, status);
}
} /* end of external while(1) loop */
/* 720p implementation */
if (((LCML_DSP_INTERFACE *)arg)->ReUseMap)
{
pthread_mutex_unlock(&((LCML_DSP_INTERFACE *)arg)->m_isStopped_mutex);
}
OMX_PRINT1 (((LCML_CODEC_INTERFACE *)((LCML_DSP_INTERFACE *)arg)->pCodecinterfacehandle)->dbg, "Exiting LOOP of LCML \n");
#ifdef __PERF_INSTRUMENTATION__
PERF_Done(((LCML_DSP_INTERFACE *)arg)->pPERFcomp);
#endif
return (void*)OMX_ErrorNone;
}
static int append_dsp_path(char * dll64p_name, char *absDLLname)
{
int len = 0;
char *dsp_path = NULL;
if (!(dsp_path = getenv("DSP_PATH")))
{
OMXDBG_PRINT(stderr, PRINT, 2, OMX_DBG_BASEMASK, "DSP_PATH Environment variable not set using /system/lib/dsp default");
dsp_path = "/system/lib/dsp";
}
len = strlen(dsp_path) + strlen("/") + strlen(dll64p_name) + 1 /* null terminator */;
if (len >= ABS_DLL_NAME_LENGTH) return -1;
strcpy(absDLLname,dsp_path);
strcat(absDLLname,"/");
strcat(absDLLname,dll64p_name);
return 0;
}