⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g723_oal_win32.cpp

📁 windows环境下利用IPP库的例子代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		rt.top+=15;
		rt.bottom+=15;
	}
}

int dtxEnable(HMENU h)
{
	CheckMenuItem(g_hDtxMenu, IDM_SETTINGS_DTXON, MF_CHECKED);
	CheckMenuItem(g_hDtxMenu, IDM_SETTINGS_DTXOFF, MF_UNCHECKED);
	g_dtxEnable=1;
	g_propertiesDisplayed=0;
	return(1);
}

int dtxDisable(HMENU h)
{
	CheckMenuItem(g_hDtxMenu, IDM_SETTINGS_DTXON, MF_UNCHECKED);
	CheckMenuItem(g_hDtxMenu, IDM_SETTINGS_DTXOFF, MF_CHECKED);
	g_dtxEnable=0;
	g_propertiesDisplayed=0;
	return(1);
}

int setBitrate53kbps(HMENU h)
{
	CheckMenuItem(g_hBitrateMenu, IDM_SETTINGS_53KBPS, MF_CHECKED);
	CheckMenuItem(g_hBitrateMenu, IDM_SETTINGS_63KBPS, MF_UNCHECKED);
	g_bitrate=IPP_SPCHBR_5300;
	g_propertiesDisplayed=0;
	return(1);
}

int setBitrate63kbps(HMENU h)
{
	CheckMenuItem(h, IDM_SETTINGS_53KBPS, MF_UNCHECKED);
	CheckMenuItem(h, IDM_SETTINGS_63KBPS, MF_CHECKED);
	g_bitrate=IPP_SPCHBR_6300;
	g_propertiesDisplayed=0;
	return(1);
}

/* Callback for CPU utilization display */
VOID CALLBACK PerfDisplayTimer(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
	if (idEvent==PERF_TIMER_ID)
	{
		ShowPerformance(hwnd);

		if (!g_propertiesDisplayed)
		{
			g_propertiesDisplayed=1;
			DisplayStreamProperties(g_filename,g_dtxEnable,g_bitrate);
			if (g_G723Done)
			{
				KillTimer(g_hwnd,PERF_TIMER_ID);
				ClearStreamProperties();
			}
		}
	}
}

void DisplayStreamProperties(TCHAR *InputFile, 
							 int dtxEnable, 
							 int bitrate)
{
	int i;
	TCHAR *dstr[]={_T("DTX: Off"),_T("DTX: On")};
	TCHAR *bstr[]={_T("Rate: 5.3 kbps"),_T("Rate: 6.3 kbps")};
	TCHAR tstr[MAXFN];
	RECT rt;
	HDC hdc;

	/* Clear prompt */
	hdc = GetDC(g_hwnd);
	rt.left=TXT_LEFT; rt.right=280; rt.top=GUI_TOP; rt.bottom=60;
	sprintf(tstr,_T("                                                          "));
	for(i=0;i<20;i++)
	{
		DrawText(hdc,tstr,-1,&rt,DT_LEFT);
		rt.top+=5; rt.bottom+=5;
	}

	/* display filename */
	i=strlen(InputFile);
	while(InputFile[i]!='\\')
		i--;
	sprintf(tstr,_T("%s\0"),&(InputFile[i+1]));
	rt.left=TXT_LEFT; rt.right=280; rt.top=GUI_TOP; rt.bottom=60;
	DrawText(hdc,tstr,-1,&rt,DT_LEFT);

	/* display stream properties */
	sprintf(tstr,_T("%s\0"),bstr[bitrate==IPP_SPCHBR_6300]);
	rt.top+=15; rt.bottom+=15;
	DrawText(hdc,tstr,-1,&rt,DT_LEFT);
	sprintf(tstr,_T("%s\0"),dstr[dtxEnable]);
	rt.top+=15; rt.bottom+=15;
	DrawText(hdc,tstr,-1,&rt,DT_LEFT);
} 

void ClearStreamProperties()
{
	int i;
	RECT rt;
	HDC hdc;
	TCHAR tstr[MAXFN];

	/* Clear filename */
	hdc = GetDC(g_hwnd);
	rt.left=TXT_LEFT; rt.right=280; rt.top=GUI_TOP; rt.bottom=110;
	sprintf(tstr,_T("                                                         "));
	for(i=0;i<25;i++)
	{
		DrawText(hdc,tstr,-1,&rt,DT_LEFT);
		rt.top+=5; rt.bottom+=5;
	}
	rt.left=TXT_LEFT; rt.right=280; rt.top=GUI_TOP; rt.bottom=110;
	sprintf(tstr,_T("Please choose a PCM input stream"));
	DrawText(hdc,tstr,-1,&rt,DT_LEFT);
} 

// Get test vector configuration file path 
LRESULT CALLBACK GetTVPath_G723(HWND hWnd, TCHAR *tvPath)
{
	OPENFILENAME	ofn;									  
	DWORD zsize;
	static TCHAR pszName[256];
	TCHAR title[MAXFN];
	HWND hWndd;

	/* Init ofn */
	zsize=sizeof(ofn);
	strcpy(pszName,_T("g723.cfg"));
	memset(&ofn,0,zsize);
	ofn.hwndOwner=hWnd;
	ofn.lStructSize=zsize;
	ofn.lpstrFilter=_T("Test Configuration Files (*.cfg)\0*.cfg\0\0");
	ofn.lpstrFile=pszName;
	ofn.nMaxFile=MAXFN;
	strcpy(title,_T("Select Test Vector Configuration File\0"));
	ofn.lpstrTitle=title;

	/* Request test vector path from user */
	if (GetOpenFileName(&ofn))
	{
		strcpy(tvPath,(TCHAR *)ofn.lpstrFile);
		hWndd=GetActiveWindow();
		EndDialog(hWndd,0);
		return TRUE;
	}
	return FALSE;
}


// Load and parse test vector configuration file
int ReadTestConfigFile_G723(TCHAR *tvpath, int *NumVect, 
					   TCHAR ***tv, int **type, int **hpf, 
					   int **postfilt, IppSpchBitRate **rate,
					   int **vad)
{
	int i;
	FILE *fcfg;
	TCHAR tstr[MAXSTR], type_s[MAXSTR], rate_s[MAXSTR], hpf_s[MAXSTR], pf_s[MAXSTR], vad_s[MAXSTR];
	
	/* Open config file/trap file errors */
	fcfg=FOPEN_TV(tvpath,_T("rt"));
	if (fcfg==NULL)
		return(0);

	/* Get number of test vectors */
	fscanf(fcfg,_T("%d\n"),NumVect);

	/* Allocate space for test vector name string and parameter tables */
	*tv=(TCHAR **)malloc(*NumVect*sizeof(TCHAR *));
	for(i=0;i<*NumVect;i++)
		(*tv)[i]=(TCHAR *)malloc(MAXSTR*sizeof(TCHAR));
	*type=(int *)malloc(*NumVect*sizeof(int));
	*hpf=(int *)malloc(*NumVect*sizeof(int));
	*postfilt=(int *)malloc(*NumVect*sizeof(int));
	*rate=(IppSpchBitRate *)malloc(*NumVect*sizeof(IppSpchBitRate));
	*vad=(int *)malloc(*NumVect*sizeof(int));

	/* Skip comment/label line */
	fgets(tstr,MAXSTR,fcfg);

	/* Load test vector configurations, line-by-line */
	for(i=0;i<*NumVect;i++)
	{
		/* Read raw text */
		fscanf(fcfg,_T("%s\t%s\t%s\t%s\t%s\t%s\n"),(*tv)[i],type_s,rate_s,vad_s,hpf_s,pf_s);

		/* Convert raw text to test configuration parameters */
		/* Bit rate */
		if (strcmp(rate_s,_T("6.3\0"))==0)
			(*rate)[i]=IPP_SPCHBR_6300;
		else
			(*rate)[i]=IPP_SPCHBR_5300;

		/* VAD enable */
		if (strcmp(vad_s,_T("on\0"))==0)
			(*vad)[i]=1;
		else
			(*vad)[i]=0;

		/* Highpass filter */
		(*hpf)[i] = ~(strcmp(hpf_s,_T("on\0")))&0x1; 

		/* Postfilter */
		(*postfilt)[i] = ~(strcmp(pf_s,_T("on\0")))&0x1; 

		/* UUT */
		if (strcmp(type_s,_T("encoder\0"))==0)
			(*type)[i]=TV_ENCODER;
		else if (strcmp(type_s,_T("decoder\0"))==0)
			(*type)[i]=TV_DECODER;
		else if (strcmp(type_s,_T("decoder_crc\0"))==0)
			(*type)[i]=TV_CRC_DECODER;
		else
			(*type)[i]=TV_MIX_ENCODER;
	}

	/* Close config file */
	fclose(fcfg);

	/* Success */
	return(1);
}

// Run test vector compliance tests for all vectors and configurations
// specified in the .cfg file
int TestCodecCompliance_G723(int testsel, TCHAR *cfgfile, HWND hWnd)
{
	int i, result, TestPass=1, TestIncomplete=0;
	RECT rt;
	HDC hdc;
	COLORREF black;
	int NumTv;
	TCHAR **tv;
	int *tv_type;
	int *tv_hpf;
	int *tv_pf;
	int *tv_vad;
	IppSpchBitRate *tv_rate;
	TCHAR tvpath[MAXFN];

	hdc = GetDC(CTW_HANDLE);
	rt.left=70; rt.right=240; rt.top=GUI_TV_TOP; rt.bottom=120;
	black=GetTextColor(hdc);

	/* Test title */
	if (testsel==ENCODER_TEST)
		sprintf(g_tstr,_T("Testing encoder . . .\0"));
	else
		sprintf(g_tstr,_T("Testing decoder . . .\0"));
	DrawText(hdc,g_tstr,-1,&rt,DT_LEFT);
	rt.top+=25; rt.bottom+=25;

	if (ReadTestConfigFile_G723(cfgfile,&NumTv,&tv,&tv_type,&tv_hpf,&tv_pf,&tv_rate,&tv_vad)==0)
	{
		MessageBox(NULL,_T("Unable to open .cfg file!"),_T("Error"),MB_OK|MB_ICONERROR);
		return(0);
	}

	/* Extract leading path from config file name */
	for(i=strlen(cfgfile)-1;(cfgfile[i]!='\\'&&i>=0);i--) ;
	strncpy(tvpath,cfgfile,i);
	tvpath[i]='\0';

	/* Run specified test for each of NumTv test vectors */
	for (i=0;i<NumTv;i++)
	{
		if ( (testsel==DECODER_TEST)&&((tv_type[i]==TV_DECODER)||(tv_type[i]==TV_CRC_DECODER)) || 
			 (testsel==ENCODER_TEST)&&((tv_type[i]==TV_ENCODER)||(tv_type[i]==TV_MIX_ENCODER)) )
		{
			SetTextColor(hdc,BLUE);
			sprintf(g_tstr,_T("Now Testing:  %s\0"), tv[i]);
			rt.left=70;
			DrawText(hdc,g_tstr,-1,&rt,DT_LEFT);
			g_err=0;
			if (testsel==DECODER_TEST)
				result=RunTestVector_G723(tvpath, tv[i], tv_type[i], tv_rate[i], tv_pf[i], tv_vad[i]);
			else
				result=RunTestVector_G723(tvpath, tv[i], tv_type[i], tv_rate[i], tv_hpf[i], tv_vad[i]);
			SetTextColor(hdc,black);
			sprintf(g_tstr,_T("%s                                    "), tv[i]);
			rt.left=70;
			DrawText(hdc,g_tstr,-1,&rt,DT_LEFT);
			rt.left=150;
			switch (result)
			{
				case TV_PASS:
					SetTextColor(hdc,GREEN);
					sprintf(g_tstr,_T("Pass\0"));
					break;
				case TV_FAIL:
					SetTextColor(hdc,RED);
					sprintf(g_tstr,_T("Fail (%d)\0"),g_err);
					TestPass=0;
					break;
				case TV_MISSING:
					SetTextColor(hdc,RED);
					sprintf(g_tstr,_T("Missing\0"));
					TestIncomplete=1;
					TestPass=0;
					break;
			}
			DrawText(hdc,g_tstr,-1,&rt,DT_LEFT);
			rt.top+=15; rt.bottom+=15;
		}
	}
	rt.top+=15; rt.bottom+=15;
	sprintf(g_tstr,_T("RESULT:"));
	SetTextColor(hdc,black);
	rt.left=70;
	DrawText(hdc,g_tstr,-1,&rt,DT_LEFT);
	if ((i!=0)&&TestPass)
	{
		sprintf(g_tstr,_T("PASS\0"));
		SetTextColor(hdc,GREEN);
	}
	else if ((i==0)||TestIncomplete)
	{
		sprintf(g_tstr,_T("INCOMPLETE"));
		SetTextColor(hdc,YELLOW);
	}
	else
	{
		sprintf(g_tstr,_T("FAIL"));
		SetTextColor(hdc,RED);
	}
	rt.left=150;
	DrawText(hdc,g_tstr,-1,&rt,DT_LEFT);

	/* zindex of continue button may change if this dialog is modified 
	   in the resource editor */
	HWND ContinueButton;
	ContinueButton=GetWindow(GetForegroundWindow(),GW_CHILD); 
	ShowWindow(ContinueButton,SW_SHOW); 

	/* Release dynamic storage used for test vector parameters */
	for(i=0;i<NumTv;i++)
		free(tv[i]);
	free(tv);
	free(tv_type);
	free(tv_hpf);
	free(tv_pf);
	free(tv_rate);

	/* Test session successfully completed */
	return(1);
}

/* Run an individual test vector */
int RunTestVector_G723(TCHAR *path, TCHAR *name, int type, IppSpchBitRate rate, int filterEnable, int vadEnable)
{
	int i,j,frames;
	Ipp8u y[30],ytst[30];
	Ipp16s x[IPP_G723_FRAME_LEN],xtst[IPP_G723_FRAME_LEN],c;
	TCHAR fnx[MAXFN],fny[MAXFN],fnc[MAXFN];	/* Uncompressed, compressed, and reference filenames */
	HANDLE fhx,fhy,fhc;							/* Uncompressed, compressed, and reference file handles */
	IppG723DecoderState DecoderState;			/* G.723.1 test vector decoder state */
	IppG723EncoderState EncoderState;			/* G.723.1 test vector encoder state */
	DWORD len,bytesread;						
	int status=TV_PASS;
	int StreamBytes, xStreamBytes;
	IppPcmStream speech;
	IppBitstream bitstream;

	/* Init filenames */
	strcpy(fnx,path);
	strcat(fnx,_T("\\"));
	strcat(fnx,name);
	if ((type==TV_ENCODER)||(type==TV_MIX_ENCODER))
		strcat(fnx,_T(".tin"));				/* Test vector extensions in accordance with ITU conventions */
	else
		strcat(fnx,_T(".rou"));
	strcpy(fny,path);
	strcat(fny,_T("\\"));
	strcat(fny,name);
	if ((type==TV_ENCODER)||(type==TV_MIX_ENCODER))
		strcat(fny,_T(".rco"));
	else
		strcat(fny,_T(".tco"));

	/* Open CRC file for CRC tests */
	if (type==TV_CRC_DECODER)
	{
		strcpy(fnc,path);
		strcat(fnc,_T("\\"));
		strcat(fnc,name);
		strcat(fnc,_T(".crc"));
		fhc=CreateFile((LPCTSTR)fnc,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL);
	}

	/* Open rate control file for mixed-rate encoder tests */
	if (type==TV_MIX_ENCODER)
	{
		strcpy(fnc,path);
		strcat(fnc,_T("\\"));
		strcat(fnc,name);
		strcat(fnc,_T(".rat"));
		fhc=CreateFile((LPCTSTR)fnc,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL);
	}

	/* Open test bitstream and reference output vector */
	fhx=CreateFile((LPCTSTR)fnx,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL);
	fhy=CreateFile((LPCTSTR)fny,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL);

	/* Verify presence of required test and reference vectors */
	if ((fhx==INVALID_HANDLE_VALUE)||(fhy==INVALID_HANDLE_VALUE))
		return(status=TV_MISSING);
	if ((type==TV_CRC_DECODER)&&(fhc==INVALID_HANDLE_VALUE))
		return(status=TV_MISSING);
	if ((type==TV_MIX_ENCODER)&&(fhc==INVALID_HANDLE_VALUE))
		return(status=TV_MISSING);

	/* Determine file length and number of frames */
	len=GetFileSize(fhx,NULL);
	frames=len/(sizeof(Ipp16s)*IPP_G723_FRAME_LEN);

	/* Init unit under test */
	if ((type==TV_ENCODER)||(type==TV_MIX_ENCODER))
	{
		EncoderInit_G723(&EncoderState);
	}
	else
	{
		DecoderInit_G723(&DecoderState);
	}

	/* Determine number of compressed stream bytes per frame */
	switch(rate)
	{
		case IPP_SPCHBR_5300:
			StreamBytes=xStreamBytes=20;
			break;
		case IPP_SPCHBR_6300:
			StreamBytes=xStreamBytes=24;
			break;
	}

	/* Run test - read test bitstream, decode, compare against reference */
	for(i=0;i<frames;i++)
	{
		StreamBytes=xStreamBytes;
		/* Read test and reference vectors */
		ReadFile(fhx, (LPVOID) x, IPP_G723_FRAME_LEN*sizeof(Ipp16s), &bytesread, NULL); 
		ReadFile(fhy, (LPVOID) y, 1, &bytesread, NULL);
		switch(y[0]&0x3)
		{
			case 3:
				StreamBytes=1;
				break;
			case 2:
				StreamBytes=4;
				break;
			case 1:
				StreamBytes=20;
				break;
			case 0:
				StreamBytes=24;
				break;
			default:
				break;
		}
		ReadFile(fhy, (LPVOID) &(y[1]), StreamBytes-1, &bytesread, NULL);
				
		/* Run normal or CRC test */
		if (type==TV_CRC_DECODER)
			ReadFile(fhc, (LPVOID) &c, sizeof(Ipp16s), &bytesread, NULL); 
		else
			c=0; 

		/* Run externally rate-controlled test */
		if (type==TV_MIX_ENCODER)
		{
			ReadFile(fhc, (LPVOID) &c, sizeof(Ipp8s), &bytesread, NULL); 
			if (c==0)
				rate=IPP_SPCHBR_6300;
			else
				rate=IPP_SPCHBR_5300;
		}

		/* Generate test output */
		if ((type==TV_ENCODER)||(type==TV_MIX_ENCODER))
		{
			speech.pBuf=(Ipp16s *)x;
			bitstream.pBuf=(Ipp8u *)ytst;
			Encode_G723_16s8u(&speech,&bitstream,rate,vadEnable,filterEnable,&EncoderState);
		}
		else
		{
			speech.pBuf=(Ipp16s *)xtst;
			bitstream.pBuf=(Ipp8u *)y;
			Decode_G723_8u16s(&bitstream,&speech,c,filterEnable,&DecoderState);
		}

		/* Compare test output against reference output */
		if ((type==TV_ENCODER)||(type==TV_MIX_ENCODER))
		{
			for(j=0;j<StreamBytes;j++)
				if (ytst[j]!=y[j])
				{
					LogEncoderError_G723(i,j,y[j],ytst[j]);
					status=TV_FAIL;
				}
		}
		else
		{
			for(j=0;j<IPP_G723_FRAME_LEN;j++)
				if (xtst[j]!=x[j])
				{
					LogDecoderError_G723(i,j,x[j],xtst[j]);
					status=TV_FAIL;
				}
		}
	}

	/* Close files */
	CloseHandle(fhx);
	CloseHandle(fhy);
	if ((type==TV_CRC_DECODER)||(type==TV_MIX_ENCODER))
		CloseHandle(fhc);
	return(status);
}

/* Accumulate decoder errors */
void LogDecoderError_G723(int frame, int byte, Ipp16s expected, Ipp16s actual)
{
	g_err++;
}

/* Accumulate encoder errors */
void LogEncoderError_G723(int frame, int byte, Ipp8u expected, Ipp8u actual)
{
	g_err++;
}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -