www.pudn.com > OS.rar > A1600_Skip_Frame_Access.c, change:2006-12-11,size:7955b
#include "system_head.h"
//#include "Snd_ArithmConfig.h"
#include "Snd_ArithmConfig.h"
#include "SndSACM.h"
#include "math.h"
//#include "unExtMem.h"
//#include "vfs.h"
//--------------------------------------------------------------------
#ifdef C_SND_A1600_SUPPORT
#ifdef C_SND_A1600_SKIPPLAY_SUPPORT
//--------------------------------------------------------------------
extern int SndSACM_curSpeed;
extern unsigned int SACM_A1600_ModeCode;
unsigned long ulFrame_Count;
unsigned long Snd_A1600_ulDataLength; //only one of the express in bytes!!
unsigned int Snd_A1600_GetWordsPerFrame( void );
LPCONST unsigned int T_WordsPerFrame[6] = {10,12,14,16,20,24};
//--------------------------------------------------------------------
//added by mgl 2005/09/03 Frame count ~= ms
// length * 16bits(1word = 16bits)
// ------------------------------------------------- ms
// 16bit(CompressRate Kbps) * pow(2, speed/12)
#ifdef FARRELEASE
unsigned long Snd_A1600_GetTotalTime(unsigned int * DataPtr)
#else
unsigned long Snd_A1600_GetTotalTime(unsigned long DataPtr)
#endif
{
#define ulDataLength ulFrameNumber_Total
#ifdef FARRELEASE
unsigned long ulFrameNumber_Total;
unsigned char *ulTmp;
#else
unsigned long ulFrameNumber_Total,ulTmp;
#endif
unsigned int uiBitRateId;
int uiTmpSpeed;
#ifdef FARRELEASE
ulDataLength = *(DataPtr + 1);
ulDataLength = (*DataPtr + (ulDataLength < 16)) >> 1;
uiBitRateId = *(DataPtr + 2);
#else
ulDataLength = RVUL( DataPtr ) >> 1;
uiBitRateId = RVUI( DataPtr+2 );
#endif
#ifdef FARRELEASE
ulTmp = &T_WordsPerFrame;
#else
ulTmp = LB2LP(T_WordsPerFrame);
#endif
ulTmp = uiBitRateId - 0x8004 + ulTmp;
#ifdef FARRELEASE
ulFrameNumber_Total = ( ulDataLength/(unsigned long)(*ulTmp) );
#else
ulFrameNumber_Total = ( ulDataLength/(unsigned long)RVUI(ulTmp) );
#endif
if(SndSACM_curSpeed 0)
{
uiTmpSpeed = -SndSACM_curSpeed;
#ifdef FARRELEASE
ulFrameNumber_Total = (unsigned long)( (double)(ulFrameNumber_Total<<4) * pow(2, uiTmpSpeed/12) );
#else
ulFrameNumber_Total = (unsigned long)( (float)(ulFrameNumber_Total<<4) / powf((float)2, (float)SndSACM_curSpeed/(float)12) );
#endif
}
else
{
#ifdef FARRELEASE
ulFrameNumber_Total = (unsigned long)( (double)(ulFrameNumber_Total<<4) / pow(2, SndSACM_curSpeed/12) );
#else
ulFrameNumber_Total = (unsigned long)( (float)(ulFrameNumber_Total<<4) / powf((float)2, (float)SndSACM_curSpeed/(float)12) );
#endif
}
return ulFrameNumber_Total;
}
//get the datalength(the uint is byte) from the input time
unsigned long Snd_Skip_A1600_ReturnLength(unsigned long DataTime)
{
unsigned long ulLength;
unsigned int uiBitRate;
int uiTmpSpeed;
uiBitRate = Snd_A1600_GetWordsPerFrame();
if(SndSACM_curSpeed 0)
{
uiTmpSpeed = -SndSACM_curSpeed;
#ifdef FARRELEASE
ulLength = (unsigned long)( (double)(DataTime >> 4) / pow(2, uiTmpSpeed/12) );
#else
ulLength = (unsigned long)( (float)(DataTime >> 4) / powf((float)2, (float)uiTmpSpeed/(float)12) );
#endif
}
else
{
#ifdef FARRELEASE
ulLength = (unsigned long)( (double)(DataTime >> 4) * pow(2, SndSACM_curSpeed/12) );
#else
ulLength = (unsigned long)( (float)(DataTime >> 4) * powf((float)2, (float)SndSACM_curSpeed/(float)12) );
#endif
}
ulLength = ulLength * (unsigned long)uiBitRate;
return (ulLength < 1); //the return uint is byte
}
//--------------------------------------------------------------------
//DataLen is in bytes 须保证输入长度为16个words的整数倍
//Snd_A1600_ulDataLength is in bytes
void Snd_A1600_SetTotalLen(unsigned long DataLen)
{
Snd_A1600_ulDataLength = DataLen;
}
//--------------------------------------------------------------------
//added by mgl 2005/10/25 Frame count ~= ms
unsigned long Snd_A1600_GetTotalTime_NoLen(unsigned long DataPtr)
{
unsigned long ulFrameNumber_Total,ulTmp;
unsigned int uiBitRateId;
int uiTmpSpeed;
uiBitRateId = RVUI( DataPtr );
#ifdef FARRELEASE
ulTmp = &T_WordsPerFrame;
#else
ulTmp = LB2LP(T_WordsPerFrame);
#endif
ulTmp = uiBitRateId - 0x8004 + ulTmp;
ulFrameNumber_Total = ( (Snd_A1600_ulDataLength>>1) / (unsigned long)RVUI(ulTmp) );//get the bytes
if(SndSACM_curSpeed 0)
{
uiTmpSpeed = -SndSACM_curSpeed;
#ifdef FARRELEASE
ulFrameNumber_Total = (unsigned long)( (double)(ulFrameNumber_Total<<4) * pow(2, uiTmpSpeed/12) );
#else
ulFrameNumber_Total = (unsigned long)( (float)(ulFrameNumber_Total<<4) * powf((float)2, (float)uiTmpSpeed/(float)12) );
#endif
}
else
{
#ifdef FARRELEASE
ulFrameNumber_Total = (unsigned long)( (double)(ulFrameNumber_Total<<4) / pow(2, SndSACM_curSpeed/12) );
#else
ulFrameNumber_Total = (unsigned long)( (float)(ulFrameNumber_Total<<4) / powf((float)2, (float)SndSACM_curSpeed/(float)12) );
#endif
}
return(ulFrameNumber_Total);
}
//--------------------------------------------------------------------
#ifdef FAT
unsigned long Snd_A1600_GetTotalTime_NandFAT(int handle)
{
unsigned int ptrData[3];
unsigned long itmpptr;
//SpFSread( handle, (unsigned long)(unsigned int)ptrData, 3); //guili 2005.10.22
itmpptr = (unsigned long)ptrData<<1;
read( handle, /*(unsigned long)(unsigned int)*/itmpptr, 3*2); //guili 2005.10.22
return( Snd_A1600_GetTotalTime( (unsigned long)(unsigned int)ptrData ) );
}
//--------------------------------------------------------------------
unsigned long Snd_A1600_GetTotalTime_FAT_NoLen(int handle)
{
unsigned int ptrData[3];
unsigned long tmpptr;
//SpFSread( handle, (unsigned long)(unsigned int)ptrData, 3); //guili 2005.10.22
tmpptr = (unsigned long)ptrData<<1;
read( handle, /*(unsigned long)(unsigned int)*/tmpptr, 2); //guili 2005.10.22
return( Snd_A1600_GetTotalTime_NoLen( (unsigned long)(unsigned int)ptrData ) );
}
#endif
//--------------------------------------------------------------------
#ifdef FARRELEASE
unsigned int Snd_A1600_GetModeCode(unsigned char *DataPtr)
{
return *(DataPtr+2);
}
#else
unsigned int Snd_A1600_GetModeCode(LPTR DataPtr)
{
return( RVUI(DataPtr+2) );
}
#endif
//--------------------------------------------------------------------
unsigned int Snd_A1600_GetWordsPerFrame( void )
{
#ifdef FARRELEASE
unsigned int *ulTmp;
#else
unsigned long ulTmp;
#endif
#ifdef FARRELEASE
ulTmp = &T_WordsPerFrame;
ulTmp = ulTmp + SACM_A1600_ModeCode - 0x8004;
return (*ulTmp);
#else
ulTmp = LB2LP(T_WordsPerFrame);
ulTmp = ulTmp + SACM_A1600_ModeCode - 0x8004;
return( RVUI(ulTmp) );
#endif
}
//--------------------------------------------------------------------
// Syntax: unsigned long Snd_Get_A1600SkipOffset(unsigned long StartTime)
// Parameter: unsigned long StartTime
// Return: NONE
// Description: Must known _SACM_A1600_ModeCode first
//--------------------------------------------------------------------
unsigned long Snd_Get_A1600SkipOffset(unsigned long StartTime)
{
unsigned int uiWordsPerFrame;
unsigned long ulFrameNumber;
uiWordsPerFrame = Snd_A1600_GetWordsPerFrame();
#ifdef FARRELEASE
ulFrameNumber = (unsigned long) ( (double)(StartTime>>4) * pow(2, SndSACM_curSpeed/12) );
#else
ulFrameNumber = (unsigned long) ( (float)(StartTime>>4) * powf((float)2, (float)SndSACM_curSpeed/(float)12) );
#endif
return ( ulFrameNumber * (unsigned long)uiWordsPerFrame );
}
//-------------------------------------------------
unsigned long Snd_A1600_GetCurrentTime()
{
unsigned long ulFrameNumber;
#ifdef FARRELEASE
ulFrameNumber = (unsigned long)( (double)(ulFrame_Count<<4)/pow(2, SndSACM_curSpeed/12) );
#else
ulFrameNumber = (unsigned long)( (ulFrame_Count<<4)/powf((float)2, (float)SndSACM_curSpeed/(float)12) );
#endif
return ulFrameNumber;
}
//----------------------------------------------------------
#endif //C_SND_A1600_SKIPPLAY_SUPPORT
#endif //C_SND_A1600_SUPPORT