|
|
//
// ITU-T G.723 Floating Point Speech Coder ANSI C Source Code. Version 1.00
// copyright (c) 1995, AudioCodes, DSP Group, France Telecom,
// Universite de Sherbrooke, Intel Corporation. All rights reserved.
//
#include "timer.h"
#include "ctiming.h"
#include "opt.h"
#include <stdlib.h>
#include <stdio.h>
#include "typedef.h"
#include "cst_lbc.h"
#include "tab_lbc.h"
#include "coder.h"
#include "lpc.h"
#include "lsp.h"
#include "exc_lbc.h"
#include "util_lbc.h"
#include "memory.h"
#include "mmxutil.h"
#ifdef LOG_ENCODE_TIMINGS_ON // { LOG_ENCODE_TIMINGS_ON
#pragma message ("Current log encode timing computations handle 2057 frames max")
void OutputEncodeTimingStatistics(char * szFileName, ENC_TIMING_INFO * pEncTimingInfo, unsigned long dwFrameCount); void OutputEncTimingDetail(FILE * pFile, ENC_TIMING_INFO * pEncTimingInfo); #endif // } LOG_ENCODE_TIMINGS_ON
//
// This file includes the coder main functions
//
//--------------------------------------------------
void Init_Coder(CODDEF *CodStat) { int i;
// Init prev Lsp to Dc
for (i=0; i < LpcOrder; i++) CodStat->PrevLsp[i] = LspDcTable[i]; CodStat->p = 9; CodStat->q = 9; CodStat->VadAct = 1;
/* Initialize the taming procedure */ for(i=0; i<SizErr; i++) CodStat->Err[i] = Err0;
}
//---------------------------------------------------
Flag Coder(float *DataBuff, Word32 *Vout, CODDEF *CodStat, int quality, int UseCpuId, int UseMMX) { int i,j,flags ;
static int qual2flags[16] = {SC_DEF,SC_DEF,SC_DEF,SC_DEF,SC_DEF,SC_DEF,SC_DEF,SC_DEF, SC_DEF,SC_DEF,SC_DEF,SC_DEF, SC_LAG1 | SC_GAIN | SC_FINDB, SC_GAIN | SC_FINDB, SC_FINDB, 0};
// Local variables
float UnqLpc[SubFrames*LpcOrder]; float QntLpc[SubFrames*LpcOrder]; float PerLpc[2*SubFrames*LpcOrder];
float LspVect[LpcOrder]; LINEDEF Line; PWDEF Pw[SubFrames];
float ImpResp[SubFrLen]; float Dpnt[PitchMax+Frame]; float *dptr; #if defined(ENCODE_TIMINGS_ON) || defined(DETAILED_ENCODE_TIMINGS_ON) // { #if defined(ENCODE_TIMINGS_ON) || defined(DETAILED_ENCODE_TIMINGS_ON)
unsigned long dwStartLow; unsigned long dwStartHigh; unsigned long dwElapsed; unsigned long dwBefore; unsigned long dwEncode = 0; int bTimingThisFrame = 0; #endif // } #if defined(ENCODE_TIMINGS_ON) || defined(DETAILED_ENCODE_TIMINGS_ON)
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
unsigned long dwRem_Dc = 0; unsigned long dwComp_Lpc = 0; unsigned long dwAtoLsp = 0; unsigned long dwLsp_Qnt = 0; unsigned long dwLsp_Inq = 0; unsigned long dwLsp_Int = 0; unsigned long dwMem_Shift = 0; unsigned long dwWght_Lpc = 0; unsigned long dwError_Wght = 0; unsigned long dwFew_Lps_In_Coder = 0; unsigned long dwFilt_Pw = 0; unsigned long dwComp_Ir = 0; unsigned long dwSub_Ring = 0; unsigned long dwFind_Acbk = 0; unsigned long dwFind_Fcbk = 0; unsigned long dwDecode_Acbk = 0; unsigned long dwReconstr_Excit = 0; unsigned long dwUpd_Ring = 0; unsigned long dwLine_Pack = 0; unsigned long dwComp_IrTemp = 0; unsigned long dwSub_RingTemp = 0; unsigned long dwFind_AcbkTemp = 0; unsigned long dwFind_FcbkTemp = 0; unsigned long dwDecode_AcbkTemp = 0; unsigned long dwReconstr_ExcitTemp = 0; unsigned long dwUpd_RingTemp = 0; #endif // } DETAILED_ENCODE_TIMINGS_ON
#ifdef LOG_ENCODE_TIMINGS_ON // { LOG_ENCODE_TIMINGS_ON
ENC_TIMING_INFO * pEncTimingInfo = NULL; #endif // } LOG_ENCODE_TIMINGS_ON
#if defined(ENCODE_TIMINGS_ON) || defined(DETAILED_ENCODE_TIMINGS_ON) // { #if defined(ENCODE_TIMINGS_ON) || defined(DETAILED_ENCODE_TIMINGS_ON)
TIMER_START(bTimingThisFrame,dwStartLow,dwStartHigh); #endif // } #if defined(ENCODE_TIMINGS_ON) || defined(DETAILED_ENCODE_TIMINGS_ON)
#ifdef LOG_ENCODE_TIMINGS_ON // { LOG_ENCODE_TIMINGS_ON
if (CodStat->dwStatFrameCount < ENC_TIMING_INFO_FRAME_COUNT) { CodStat->dwStartLow = dwStartLow; CodStat->dwStartHigh = dwStartHigh; } CodStat->bTimingThisFrame = bTimingThisFrame; #endif // } LOG_ENCODE_TIMINGS_ON
if (quality < 0 || quality > 15) quality = 0; flags = qual2flags[quality];
// If UseCpuId is set, determine whether to use MMX based on the
// actual hardware CPUID. Otherwise, just use the passed-in parameter.
#if COMPILE_MMX
if (UseCpuId) UseMMX = IsMMX(); #else
UseMMX = UseCpuId = FALSE; #endif //COMPILE_MMX
//Coder Start
Line.Crc = 0; #ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Rem_Dc(DataBuff, CodStat);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwRem_Dc); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Compute the Unquantized Lpc set for whole frame
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
#if COMPILE_MMX
if (UseMMX) Comp_LpcInt(UnqLpc, CodStat->PrevDat, DataBuff, CodStat); else #endif
Comp_Lpc(UnqLpc, CodStat->PrevDat, DataBuff, CodStat);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwComp_Lpc); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Convert to Lsp
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
AtoLsp(LspVect, &UnqLpc[LpcOrder*(SubFrames-1)], CodStat->PrevLsp);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwAtoLsp); #endif // } DETAILED_ENCODE_TIMINGS_ON
// VQ Lsp vector
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Line.LspId = Lsp_Qnt(LspVect, CodStat->PrevLsp, UseMMX);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwLsp_Qnt); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Inverse quantization of the LSP
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Lsp_Inq(LspVect, CodStat->PrevLsp, Line.LspId, Line.Crc);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwLsp_Inq); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Interpolate the Lsp vectors
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Lsp_Int(QntLpc, LspVect, CodStat->PrevLsp);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwLsp_Int); #endif // } DETAILED_ENCODE_TIMINGS_ON
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Mem_Shift(CodStat->PrevDat, DataBuff);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwMem_Shift); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Compute Percetual filter Lpc coefficeints
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Wght_Lpc(PerLpc, UnqLpc);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwWght_Lpc); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Apply the perceptual weighting filter
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Error_Wght(DataBuff, PerLpc,CodStat);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwError_Wght); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Compute Open loop pitch estimates
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Construct the buffer
memcpy(Dpnt,CodStat->PrevWgt,4*PitchMax); memcpy(&Dpnt[PitchMax],DataBuff,4*Frame); /*
for (i=0; i < PitchMax;i++) Dpnt[i] = CodStat->PrevWgt[i]; for (i=0;i < Frame;i++) Dpnt[PitchMax+i] = DataBuff[i]; */
j = PitchMax; for (i=0; i < SubFrames/2; i++) { #if COMPILE_MMX
if (UseMMX) Line.Olp[i] = Estim_Int(Dpnt, j); else #endif
Line.Olp[i] = Estim_Pitch(Dpnt, j); j += 2*SubFrLen; }
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwFew_Lps_In_Coder); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Compute the Hmw
j = PitchMax; for (i=0; i < SubFrames; i++) { Pw[i] = Comp_Pw(Dpnt, j, Line.Olp[i>>1]); j += SubFrLen; }
// Reload the buffer
for (i=0; i < PitchMax; i++) Dpnt[i] = CodStat->PrevWgt[i]; for (i=0; i < Frame; i++) Dpnt[PitchMax+i] = DataBuff[i];
// Save PrevWgt
for (i=0; i < PitchMax; i++) CodStat->PrevWgt[i] = Dpnt[Frame+i];
// Apply the Harmonic filter
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
j = 0; for (i=0; i < SubFrames; i++) { Filt_Pw(DataBuff, Dpnt, j , Pw[i]); j += SubFrLen; } #ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwFilt_Pw); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Start the sub frame processing loop
dptr = DataBuff;
for (i=0; i < SubFrames; i++) { // Compute full impulse responce
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Comp_Ir(ImpResp, &QntLpc[i*LpcOrder], &PerLpc[i*2*LpcOrder], Pw[i]);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwComp_IrTemp); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Subtruct the ringing of previos sub-frame
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Sub_Ring(dptr, &QntLpc[i*LpcOrder], &PerLpc[i*2*LpcOrder], CodStat->PrevErr, Pw[i], CodStat);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwSub_RingTemp); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Compute adaptive code book contribution
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
#if COMPILE_MMX
if(UseMMX) Find_AcbkInt(dptr, ImpResp, CodStat->PrevExc, &Line,i, CodStat->WrkRate, flags, CodStat); else #endif
Find_Acbk(dptr, ImpResp, CodStat->PrevExc, &Line,i, CodStat->WrkRate, flags, CodStat);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwFind_AcbkTemp); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Compute fixed code book contribution
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Find_Fcbk(dptr, ImpResp, &Line, i, CodStat->WrkRate, flags, UseMMX);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwFind_FcbkTemp); #endif // } DETAILED_ENCODE_TIMINGS_ON
// Reconstruct the excitation
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Decod_Acbk(ImpResp, CodStat->PrevExc, Line.Olp[i>>1], Line.Sfs[i].AcLg, Line.Sfs[i].AcGn, CodStat->WrkRate);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwDecode_AcbkTemp); #endif // } DETAILED_ENCODE_TIMINGS_ON
for (j=SubFrLen; j < PitchMax; j++) CodStat->PrevExc[j-SubFrLen] = CodStat->PrevExc[j];
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
for (j=0; j < SubFrLen; j++) { dptr[j] = dptr[j]*2.0f+ImpResp[j]; CodStat->PrevExc[PitchMax-SubFrLen+j] = dptr[j]; /* Clip the new samples */ #if 1 //do clipping
//clip to +/- 32767.0 doing abs & compare with integer unit
//if clipping is needed shift sign bit to use as lookup table index
#define FLTCLIP(x) \
{\ const float T[2] = {32767.0f, -32767.0f};\ if ((asint(x) & 0x7fffffff) > asint(T[0]))\ x = T[((unsigned)asint(x)) >> 31];\ }
FLTCLIP(CodStat->PrevExc[PitchMax-SubFrLen+j]); #endif //optclip
}
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwReconstr_ExcitTemp); #endif // } DETAILED_ENCODE_TIMINGS_ON
/* Update exc_err */ Update_Err(Line.Olp[i>>1], Line.Sfs[i].AcLg, Line.Sfs[i].AcGn, CodStat);
// Update the ringing delays
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Upd_Ring(dptr, &QntLpc[i*LpcOrder], &PerLpc[i*2*LpcOrder], CodStat->PrevErr, CodStat);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwUpd_RingTemp); #endif // } DETAILED_ENCODE_TIMINGS_ON
dptr += SubFrLen;
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
// Sum stats
dwComp_Ir += dwComp_IrTemp; dwComp_IrTemp = 0; dwSub_Ring += dwSub_RingTemp; dwSub_RingTemp = 0; dwFind_Acbk += dwFind_AcbkTemp; dwFind_AcbkTemp = 0; dwFind_Fcbk += dwFind_FcbkTemp; dwFind_FcbkTemp = 0; dwDecode_Acbk += dwDecode_AcbkTemp; dwDecode_AcbkTemp = 0; dwReconstr_Excit += dwReconstr_ExcitTemp; dwReconstr_ExcitTemp = 0; dwUpd_Ring += dwUpd_RingTemp; dwUpd_RingTemp = 0; #endif // } DETAILED_ENCODE_TIMINGS_ON
}
// Pack the Line structure
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_BEFORE(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore); #endif // } DETAILED_ENCODE_TIMINGS_ON
Line_Pack(&Line, Vout,&(CodStat->VadAct),CodStat->WrkRate);
#ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
TIMER_AFTER_P5(bTimingThisFrame,dwStartLow,dwStartHigh,dwBefore,dwElapsed,dwLine_Pack); #endif // } DETAILED_ENCODE_TIMINGS_ON
#if defined(ENCODE_TIMINGS_ON) || defined(DETAILED_ENCODE_TIMINGS_ON) // { #if defined(ENCODE_TIMINGS_ON) || defined(DETAILED_ENCODE_TIMINGS_ON)
TIMER_STOP(bTimingThisFrame,dwStartLow,dwStartHigh,dwEncode); #endif // } ENCODE_TIMINGS_ON
#ifdef LOG_ENCODE_TIMINGS_ON // { LOG_ENCODE_TIMINGS_ON
if (bTimingThisFrame && (CodStat->dwStatFrameCount < ENC_TIMING_INFO_FRAME_COUNT)) { pEncTimingInfo = &CodStat->EncTimingInfo[CodStat->dwStatFrameCount]; pEncTimingInfo->dwEncode = dwEncode; #ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
pEncTimingInfo->dwRem_Dc = dwRem_Dc; pEncTimingInfo->dwComp_Lpc = dwComp_Lpc; pEncTimingInfo->dwAtoLsp = dwAtoLsp; pEncTimingInfo->dwLsp_Qnt = dwLsp_Qnt; pEncTimingInfo->dwLsp_Inq = dwLsp_Inq; pEncTimingInfo->dwLsp_Int = dwLsp_Int; pEncTimingInfo->dwMem_Shift = dwMem_Shift; pEncTimingInfo->dwWght_Lpc = dwWght_Lpc; pEncTimingInfo->dwError_Wght = dwError_Wght; pEncTimingInfo->dwFew_Lps_In_Coder = dwFew_Lps_In_Coder; pEncTimingInfo->dwFilt_Pw = dwFilt_Pw; pEncTimingInfo->dwComp_Ir = dwComp_Ir; pEncTimingInfo->dwSub_Ring = dwSub_Ring; pEncTimingInfo->dwFind_Acbk = dwFind_Acbk; pEncTimingInfo->dwFind_Fcbk = dwFind_Fcbk; pEncTimingInfo->dwDecode_Acbk = dwDecode_Acbk; pEncTimingInfo->dwReconstr_Excit = dwReconstr_Excit; pEncTimingInfo->dwUpd_Ring = dwUpd_Ring; pEncTimingInfo->dwLine_Pack = dwLine_Pack; #endif // } DETAILED_ENCODE_TIMINGS_ON
CodStat->dwStatFrameCount++; } else { _asm int 3; } #endif // } #if defined(ENCODE_TIMINGS_ON) || defined(DETAILED_ENCODE_TIMINGS_ON)
return (Flag) True; }
#ifdef LOG_ENCODE_TIMINGS_ON // { LOG_ENCODE_TIMINGS_ON
void OutputEncodeTimingStatistics(char * szFileName, ENC_TIMING_INFO * pEncTimingInfo, unsigned long dwFrameCount) { FILE * pFile; ENC_TIMING_INFO * pTempEncTimingInfo; ENC_TIMING_INFO etiTemp; int i; int iCount;
pFile = fopen(szFileName, "a"); if (pFile == NULL) goto done;
#if 0
// Too verbose !!!
/* Output the detail information
*/ fprintf(pFile,"\nDetail Timing Information\n"); for ( i = 0, pTempEncTimingInfo = pEncTimingInfo ; i < dwFrameCount ; i++, pTempEncTimingInfo++ ) { fprintf(pFile, "Frame %d Detail Timing Information\n", i); OutputEncTimingDetail(pFile, pTempEncTimingInfo); } #endif
/* Compute the total information
*/ memset(&etiTemp, 0, sizeof(ENC_TIMING_INFO)); iCount = 0;
for ( i = 0, pTempEncTimingInfo = pEncTimingInfo ; i < dwFrameCount ; i++, pTempEncTimingInfo++ ) { iCount++; etiTemp.dwEncode += pTempEncTimingInfo->dwEncode; #ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
etiTemp.dwRem_Dc += pTempEncTimingInfo->dwRem_Dc; etiTemp.dwComp_Lpc += pTempEncTimingInfo->dwComp_Lpc; etiTemp.dwAtoLsp += pTempEncTimingInfo->dwAtoLsp; etiTemp.dwLsp_Qnt += pTempEncTimingInfo->dwLsp_Qnt; etiTemp.dwLsp_Inq += pTempEncTimingInfo->dwLsp_Inq; etiTemp.dwLsp_Int += pTempEncTimingInfo->dwLsp_Int; etiTemp.dwMem_Shift += pTempEncTimingInfo->dwMem_Shift; etiTemp.dwWght_Lpc += pTempEncTimingInfo->dwWght_Lpc; etiTemp.dwError_Wght += pTempEncTimingInfo->dwError_Wght; etiTemp.dwFew_Lps_In_Coder += pTempEncTimingInfo->dwFew_Lps_In_Coder; etiTemp.dwFilt_Pw += pTempEncTimingInfo->dwFilt_Pw; etiTemp.dwComp_Ir += pTempEncTimingInfo->dwComp_Ir; etiTemp.dwSub_Ring += pTempEncTimingInfo->dwSub_Ring; etiTemp.dwFind_Acbk += pTempEncTimingInfo->dwFind_Acbk; etiTemp.dwFind_Fcbk += pTempEncTimingInfo->dwFind_Fcbk; etiTemp.dwDecode_Acbk += pTempEncTimingInfo->dwDecode_Acbk; etiTemp.dwReconstr_Excit += pTempEncTimingInfo->dwReconstr_Excit; etiTemp.dwUpd_Ring += pTempEncTimingInfo->dwUpd_Ring; etiTemp.dwLine_Pack += pTempEncTimingInfo->dwLine_Pack; #endif // } DETAILED_ENCODE_TIMINGS_ON
}
if (iCount > 0) { /* Output the total information
*/ fprintf(pFile,"Total for %d frames\n", iCount); OutputEncTimingDetail(pFile, &etiTemp);
/* Compute the average
*/ etiTemp.dwEncode = (etiTemp.dwEncode + (iCount / 2)) / iCount; #ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
etiTemp.dwRem_Dc = (etiTemp.dwRem_Dc + (iCount / 2)) / iCount; etiTemp.dwComp_Lpc = (etiTemp.dwComp_Lpc + (iCount / 2)) / iCount; etiTemp.dwAtoLsp = (etiTemp.dwAtoLsp + (iCount / 2)) / iCount; etiTemp.dwLsp_Qnt = (etiTemp.dwLsp_Qnt + (iCount / 2)) / iCount; etiTemp.dwLsp_Inq = (etiTemp.dwLsp_Inq + (iCount / 2)) / iCount; etiTemp.dwLsp_Int = (etiTemp.dwLsp_Int + (iCount / 2)) / iCount; etiTemp.dwMem_Shift = (etiTemp.dwMem_Shift + (iCount / 2)) / iCount; etiTemp.dwWght_Lpc = (etiTemp.dwWght_Lpc + (iCount / 2)) / iCount; etiTemp.dwError_Wght = (etiTemp.dwError_Wght + (iCount / 2)) / iCount; etiTemp.dwFew_Lps_In_Coder = (etiTemp.dwFew_Lps_In_Coder + (iCount / 2)) / iCount; etiTemp.dwFilt_Pw = (etiTemp.dwFilt_Pw + (iCount / 2)) / iCount; etiTemp.dwComp_Ir = (etiTemp.dwComp_Ir + (iCount / 2)) / iCount; etiTemp.dwSub_Ring = (etiTemp.dwSub_Ring + (iCount / 2)) / iCount; etiTemp.dwFind_Acbk = (etiTemp.dwFind_Acbk + (iCount / 2)) / iCount; etiTemp.dwFind_Fcbk = (etiTemp.dwFind_Fcbk + (iCount / 2)) / iCount; etiTemp.dwDecode_Acbk = (etiTemp.dwDecode_Acbk + (iCount / 2)) / iCount; etiTemp.dwReconstr_Excit = (etiTemp.dwReconstr_Excit + (iCount / 2)) / iCount; etiTemp.dwUpd_Ring = (etiTemp.dwUpd_Ring + (iCount / 2)) / iCount; etiTemp.dwLine_Pack = (etiTemp.dwLine_Pack + (iCount / 2)) / iCount; #endif // } DETAILED_ENCODE_TIMINGS_ON
/* Output the average information
*/ fprintf(pFile,"Average over %d frames\n", iCount); OutputEncTimingDetail(pFile, &etiTemp); }
fclose(pFile); done:
return; }
void OutputEncTimingDetail(FILE * pFile, ENC_TIMING_INFO * pEncTimingInfo) { unsigned long dwOther; unsigned long dwRoundUp; unsigned long dwDivisor;
fprintf(pFile, "\tEncode = %10u (%d milliseconds at 166Mhz)\n", pEncTimingInfo->dwEncode, (pEncTimingInfo->dwEncode + 83000) / 166000); dwOther = pEncTimingInfo->dwEncode; #ifdef DETAILED_ENCODE_TIMINGS_ON // { DETAILED_ENCODE_TIMINGS_ON
/* This is needed because of the integer truncation.
*/ dwDivisor = pEncTimingInfo->dwEncode / 100; // to yield a percent
dwRoundUp = dwDivisor / 2; if (dwDivisor) { fprintf(pFile, "\tRem_Dc = %10u (%2d%%)\n", pEncTimingInfo->dwRem_Dc, (pEncTimingInfo->dwRem_Dc + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwRem_Dc; fprintf(pFile, "\tComp_Lpc = %10u (%2d%%)\n", pEncTimingInfo->dwComp_Lpc, (pEncTimingInfo->dwComp_Lpc + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwComp_Lpc; fprintf(pFile, "\tAtoLsp = %10u (%2d%%)\n", pEncTimingInfo->dwAtoLsp, (pEncTimingInfo->dwAtoLsp + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwAtoLsp;
fprintf(pFile, "\tLsp_Qnt = %10u (%2d%%)\n", pEncTimingInfo->dwLsp_Qnt, (pEncTimingInfo->dwLsp_Qnt + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwLsp_Qnt; fprintf(pFile, "\tLsp_Inq = %10u (%2d%%)\n", pEncTimingInfo->dwLsp_Inq, (pEncTimingInfo->dwLsp_Inq + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwLsp_Inq; fprintf(pFile, "\tLsp_Int = %10u (%2d%%)\n", pEncTimingInfo->dwLsp_Int, (pEncTimingInfo->dwLsp_Int + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwLsp_Int; fprintf(pFile, "\tMem_Shift = %10u (%2d%%)\n", pEncTimingInfo->dwMem_Shift, (pEncTimingInfo->dwMem_Shift + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwMem_Shift; fprintf(pFile, "\tWght_Lpc = %10u (%2d%%)\n", pEncTimingInfo->dwWght_Lpc, (pEncTimingInfo->dwWght_Lpc + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwWght_Lpc; fprintf(pFile, "\tError_Wght = %10u (%2d%%)\n", pEncTimingInfo->dwError_Wght, (pEncTimingInfo->dwError_Wght + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwError_Wght; fprintf(pFile, "\tFew_Lps_In_Coder = %10u (%2d%%)\n", pEncTimingInfo->dwFew_Lps_In_Coder, (pEncTimingInfo->dwFew_Lps_In_Coder + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwFew_Lps_In_Coder; fprintf(pFile, "\tFilt_Pw = %10u (%2d%%)\n", pEncTimingInfo->dwFilt_Pw, (pEncTimingInfo->dwFilt_Pw + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwFilt_Pw; fprintf(pFile, "\tComp_Ir = %10u (%2d%%)\n", pEncTimingInfo->dwComp_Ir, (pEncTimingInfo->dwComp_Ir + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwComp_Ir; fprintf(pFile, "\tSub_Ring = %10u (%2d%%)\n", pEncTimingInfo->dwSub_Ring, (pEncTimingInfo->dwSub_Ring + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwSub_Ring; fprintf(pFile, "\tFind_Acbk = %10u (%2d%%)\n", pEncTimingInfo->dwFind_Acbk, (pEncTimingInfo->dwFind_Acbk + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwFind_Acbk; fprintf(pFile, "\tFind_Fcbk = %10u (%2d%%)\n", pEncTimingInfo->dwFind_Fcbk, (pEncTimingInfo->dwFind_Fcbk + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwFind_Fcbk; fprintf(pFile, "\tDecode_Acbk = %10u (%2d%%)\n", pEncTimingInfo->dwDecode_Acbk, (pEncTimingInfo->dwDecode_Acbk + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwDecode_Acbk; fprintf(pFile, "\tReconstr_Excit = %10u (%2d%%)\n", pEncTimingInfo->dwReconstr_Excit, (pEncTimingInfo->dwReconstr_Excit + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwReconstr_Excit; fprintf(pFile, "\tUpd_Ring = %10u (%2d%%)\n", pEncTimingInfo->dwUpd_Ring, (pEncTimingInfo->dwUpd_Ring + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwUpd_Ring; fprintf(pFile, "\tLine_Pack = %10u (%2d%%)\n", pEncTimingInfo->dwLine_Pack, (pEncTimingInfo->dwLine_Pack + dwRoundUp) / dwDivisor); dwOther -= pEncTimingInfo->dwLine_Pack; fprintf(pFile, "\tOther = %10u (%2d%%)\n", dwOther, (dwOther + dwRoundUp) / dwDivisor); } #endif // } DETAILED_ENCODE_TIMINGS_ON
} #endif // { LOG_ENCODE_TIMINGS_ON
|