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

📄 idctdecode.cpp

📁 一个优化的H.263解码器,性能达到商用级
💻 CPP
字号:
// IDCTDecode.cpp: implementation of the CIDCTDecode class.
//
//////////////////////////////////////////////////////////////////////

#include "IDCTDecode.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CIDCTDecode::CIDCTDecode()
{

}

CIDCTDecode::~CIDCTDecode()
{

}
void CIDCTDecode::De_idct(short *block)
{

	short *blk;
	int x0, x1, x2, x3, x4, x5, x6, x7, x8, i;

	//idct row
	for (i = 0; i < 8; i++)
	{
		//idctrow (block + 8 * i);
		blk = block + 8 * i;

		/* shortcut */
		if (!((x1 = blk[4] << 11) | (x2 = blk[6]) | (x3 = blk[2]) |
			(x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
		{
			blk[0] = blk[1] = blk[2] = blk[3] = blk[4] = blk[5] = blk[6] = blk[7] = blk[0] << 3;
			continue;
		}
		x0 = (blk[0] << 11) + 128;    /* for proper rounding in the fourth stage */

		/* first stage */
		x8 = W7 * (x4 + x5);
		x4 = x8 + (W1 - W7) * x4;
		x5 = x8 - (W1 + W7) * x5;
		x8 = W3 * (x6 + x7);
		x6 = x8 - (W3 - W5) * x6;
		x7 = x8 - (W3 + W5) * x7;

		/* second stage */
		x8 = x0 + x1;
		x0 -= x1;
		x1 = W6 * (x3 + x2);
		x2 = x1 - (W2 + W6) * x2;
		x3 = x1 + (W2 - W6) * x3;
		x1 = x4 + x6;
		x4 -= x6;
		x6 = x5 + x7;
		x5 -= x7;

		/* third stage */
		x7 = x8 + x3;
		x8 -= x3;
		x3 = x0 + x2;
		x0 -= x2;
		x2 = (181 * (x4 + x5) + 128) >> 8;
		x4 = (181 * (x4 - x5) + 128) >> 8;

		/* fourth stage */
		blk[0] = (x7 + x1) >> 8;
		blk[1] = (x3 + x2) >> 8;
		blk[2] = (x0 + x4) >> 8;
		blk[3] = (x8 + x6) >> 8;
		blk[4] = (x8 - x6) >> 8;
		blk[5] = (x0 - x4) >> 8;
		blk[6] = (x3 - x2) >> 8;
		blk[7] = (x7 - x1) >> 8;	
	}

	//idct col
	for (i = 0; i < 8; i++)
	{
		//idctcol (block + i);
		blk = block + i;

		if (!((x4 = blk[8]) | (x3 = blk[16]) | (x7 = blk[24]) |
			(x1 = (blk[32] << 8)) | (x6 = blk[40]) | (x2 = blk[48]) | (x5 = blk[56])))
		{
			blk[0] = blk[8] = blk[16] = blk[24] = blk[32] = blk[40] = blk[48] = blk[56] =
				iclp[(blk[0] + 32) >> 6];
			continue;
		}
		x0 = (blk[0] << 8) + 8192;

		/* first stage */
		x8 = W7 * (x4 + x5) + 4;
		x4 = (x8 + (W1 - W7) * x4) >> 3;
		x5 = (x8 - (W1 + W7) * x5) >> 3;
		x8 = W3 * (x6 + x7) + 4;
		x6 = (x8 - (W3 - W5) * x6) >> 3;
		x7 = (x8 - (W3 + W5) * x7) >> 3;

		/* second stage */
		x8 = x0 + x1;
		x0 -= x1;
		x1 = W6 * (x3 + x2) + 4;
		x2 = (x1 - (W2 + W6) * x2) >> 3;
		x3 = (x1 + (W2 - W6) * x3) >> 3;
		x1 = x4 + x6;
		x4 -= x6;
		x6 = x5 + x7;
		x5 -= x7;

		/* third stage */
		x7 = x8 + x3;
		x8 -= x3;
		x3 = x0 + x2;
		x0 -= x2;
		x2 = (181 * (x4 + x5) + 128) >> 8;
		x4 = (181 * (x4 - x5) + 128) >> 8;

		/* fourth stage */
		blk[0]  = iclp[(x7 + x1) >> 14];
		blk[8]  = iclp[(x3 + x2) >> 14];
		blk[16] = iclp[(x0 + x4) >> 14];
		blk[24] = iclp[(x8 + x6) >> 14];
		blk[32] = iclp[(x8 - x6) >> 14];
		blk[40] = iclp[(x0 - x4) >> 14];
		blk[48] = iclp[(x3 - x2) >> 14];
		blk[56] = iclp[(x7 - x1) >> 14];
	}
}

void CIDCTDecode::De_init_idct()
{
	int i;
	iclp = iclip + 512;
	for (i = -512; i < 512; i++)
		iclp[i] = (i < -256) ? -256 : ((i > 255) ? 255 : i);

}

⌨️ 快捷键说明

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