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

📄 stat.cpp

📁 H.263的编码程序,加了CPU指令优化,VC版.
💻 CPP
字号:
#include "HEnc.h"
#include <math.h>

double computeSNRY(H263VencStatus *encoder)
{
	double dRtn;
	int i, j, k;
	int lx = encoder->mv_outside_frame ? encoder->pels + 32 : encoder->pels;
	int iTotal = encoder->pels * encoder->lines;
	unsigned char *p1 = encoder->frame_buf[encoder->zero_index].pLum;
	unsigned char *p2 = encoder->frameToEncode.pLum;	
	// Attention!! The size of the following 2 variables depends on compiler
	__int64 iDiff;
	__int64 iSquare;

	if (encoder->PTYPE == B_IMG)
	{
		p1 = encoder->BPicture[0].pLum;
		p2 = encoder->BPicture[encoder->B_count].pLum;
		lx = encoder->pels;
	}

	iSquare = 0;
	
	for (j = 0, k = 0; j < encoder->lines; j++, k+=lx)
	{
		for (i = 0; i < encoder->pels; i++)
		{
			iDiff = *p2++ - p1[k+i];
			iSquare += iDiff * iDiff;
		}
	}
	dRtn = (double)iSquare/(double)iTotal;
	if(dRtn != 0)
	{
		dRtn = (double)(255 * 255)/dRtn;
		dRtn = 10 * (double)log10(dRtn);
	}
	else
		dRtn = (float)99.99;
	encoder->frmsnr.snrY  = dRtn;
	return dRtn;
}

double computeSNRCB(H263VencStatus *encoder)
{
	double dRtn;
	int i, j, k;
	int iTotal = encoder->lines * encoder->pels / 4;
	int lx = encoder->mv_outside_frame ? encoder->pels/2 + 16 : encoder->pels/2;
	unsigned char *p1 = encoder->frame_buf[encoder->zero_index].pCb;
	unsigned char *p2 = encoder->frameToEncode.pCb;	
	// Attention!! The size of the following 2 variables depends on compiler
	__int64 iDiff;
	__int64 iSquare;

	if (encoder->PTYPE == B_IMG)
	{
		p1 = encoder->BPicture[0].pCb;
		p2 = encoder->BPicture[encoder->B_count].pCb;
		lx = encoder->pels/2;
	}
	iSquare = 0;
	
	for(j = 0, k = 0; j < encoder->lines/2; j++, k += lx)
	{
		for (i = 0; i < encoder->pels/2; i ++)
		{
			iDiff = *p2++ - p1[k+i];
			iSquare+=iDiff * iDiff;
		}
	}
	dRtn = (double)iSquare/(double)iTotal;
	if(dRtn != 0)
	{
		dRtn = (double)(255 * 255)/dRtn;
		dRtn = 10 * (double)log10(dRtn);
	}
	else
		dRtn = (float)99.99;
	encoder->frmsnr.snrCB = dRtn;

	return dRtn;
}
double computeSNRCR(H263VencStatus *encoder)
{
	double dRtn;
	int i, j, k;
	int iTotal = encoder->lines * encoder->pels  / 4;
	int lx = encoder->mv_outside_frame ? encoder->pels/2 + 16 : encoder->pels/2;
	unsigned char *p1 = encoder->frame_buf[encoder->zero_index].pCr;
	unsigned char *p2 = encoder->frameToEncode.pCr;	
	// Attention!! The size of the following 2 variables depends on compiler
	__int64 iDiff;
	__int64 iSquare;

	if (encoder->PTYPE == B_IMG)
	{
		p1 = encoder->BPicture[0].pCr;
		p2 = encoder->BPicture[encoder->B_count].pCr;
		lx = encoder->pels / 2;
	}
	iSquare = 0;
	
	for(j = 0, k = 0; j < encoder->lines/2; j++, k += lx)
	{
		for (i = 0; i < encoder->pels/2; i ++)
		{
			iDiff = *p2++ - p1[k+i];
			iSquare+=iDiff * iDiff;
		}
	}
	dRtn = (double)iSquare/(double)iTotal;
	if(dRtn != 0)
	{
		dRtn = (double)(255 * 255)/dRtn;
		dRtn = 10 * (double)log10(dRtn);
	}
	else
		dRtn = (float)99.99;
	encoder->frmsnr.snrCR = dRtn;

	return dRtn;
}

⌨️ 快捷键说明

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