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

📄 dct.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
字号:
/*************************************************************************This software module was originally developed by 	Ming-Chieh Lee (mingcl@microsoft.com), Microsoft Corporation	Wei-ge Chen (wchen@microsoft.com), Microsoft Corporation	Bruce Lin (blin@microsoft.com), Microsoft Corporation	Chuang Gu (chuanggu@microsoft.com), Microsoft Corporation	(date: March, 1996)and edited by	Wei Wu (weiwu@stallion.risc.rockwell.com) Rockwell Science Centerin the course of development of the MPEG-4 Video (ISO/IEC 14496-2). This software module is an implementation of a part of one or more MPEG-4 Video tools as specified by the MPEG-4 Video. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. The original developer of this software module and his/her company, the subsequent editors and their companies, and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. Copyright is not released for non MPEG-4 Video conforming products. Microsoft retains full right to use the code for his/her own purpose, assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. This copyright notice must be included in all copies or derivative works. Copyright (c) 1996, 1997.Module Name:	vopSes.cppAbstract:	Base class for the encoder for one VOP session.Revision History:*************************************************************************/#include <stdio.h>#include "typeapi.h"#include "dct.hpp"#ifdef __MFC_#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif#define new DEBUG_NEW				   #endif // __MFC_CBlockDCT::~CBlockDCT (){/* NBIT: change	m_rgchClipTbl -= 512;*/	m_rgchClipTbl -= (1<<(m_nBits+1));	delete [] m_rgchClipTbl;}/* NBITCBlockDCT::CBlockDCT ()*/CBlockDCT::CBlockDCT (UInt nBits) : m_nBits(nBits){	Int ClipTblSize = 1<<(m_nBits+2); // NBIT	Int offset = ClipTblSize/2; // NBIT	Int maxVal = (1<<m_nBits)-1; // NBIT/* NBIT: change	m_rgchClipTbl = new PixelC [1024];	m_rgchClipTbl += 512;	Int i;	for (i = -512; i < 512; i++)	{		if (i < 0)			m_rgchClipTbl [i] = 0;		else if (i >= 0 && i < 256)			m_rgchClipTbl [i] = i;		else 			m_rgchClipTbl [i] = 255;	}*/	m_rgchClipTbl = new PixelC [ClipTblSize];	m_rgchClipTbl += offset;	Int i;	for (i = -offset; i < offset; i++)	{		if (i < 0)			m_rgchClipTbl [i] = 0;		else if (i >= 0 && i <= maxVal)			m_rgchClipTbl [i] = i;		else 			m_rgchClipTbl [i] = maxVal;	}	m_c0 = 0.7071068;	m_c1 = 0.4903926;	m_c2 = 0.4619398;	m_c3 = 0.4157348;	m_c4 = 0.3535534;	m_c5 = 0.2777851;	m_c6 = 0.1913417;	m_c7 = 0.0975452;}Void CBlockDCT::apply (const PixelC* rgchSrc, Int nColSrc, Int* rgiDst, Int nColDst){	// transform here	const PixelC* pchRowSrc = rgchSrc;	for (CoordI iRow = 0; iRow < BLOCK_SIZE; iRow++)	{		xformRow (pchRowSrc, iRow);		pchRowSrc += nColSrc;	}	Int* piColDst = rgiDst;	for (CoordI iCol = 0; iCol < BLOCK_SIZE; iCol++)	{		xformColumn (piColDst, iCol, nColDst);		piColDst++;	}}Void CBlockDCT::apply (const Int* rgiSrc, Int nColSrc, PixelC* rgchDst, Int nColDst){	// transform here	const PixelI* piRowSrc = rgiSrc;	for (CoordI iRow = 0; iRow < BLOCK_SIZE; iRow++)	{		xformRow (piRowSrc, iRow);		piRowSrc += nColSrc;	}	PixelC* pchColDst = rgchDst;	for (CoordI iCol = 0; iCol < BLOCK_SIZE; iCol++)	{		xformColumn (pchColDst, iCol, nColDst);		pchColDst++;	}}Void CBlockDCT::apply (const Int* rgiSrc, Int nColSrc, Int* rgiDst, Int nColDst){	// transform here	const PixelI* piRowSrc = rgiSrc;	for (CoordI iRow = 0; iRow < BLOCK_SIZE; iRow++)	{		xformRow (piRowSrc, iRow);		piRowSrc += nColSrc;	}	Int* piColDst = rgiDst;	for (CoordI iCol = 0; iCol < BLOCK_SIZE; iCol++)	{		xformColumn (piColDst, iCol, nColDst);		piColDst++;	}}Void CBlockDCT::xformRow (const PixelC* ppxlcRowSrc, CoordI i){	UInt j;	for (j = 0; j < BLOCK_SIZE; j++) 		m_rgfltBuf1 [j] = (Float) *ppxlcRowSrc++;	oneDimensionalDCT ();	for (j = 0; j < BLOCK_SIZE; j++) 		m_rgfltAfterRowXform [i] [j] = m_rgfltAfter1dXform [j];}Void CBlockDCT::xformRow (const PixelI* ppxlfRowSrc, CoordI i){	UInt j;	for (j = 0; j < BLOCK_SIZE; j++) 		m_rgfltBuf1 [j] = (Float) *ppxlfRowSrc++;	oneDimensionalDCT ();	for (j = 0; j < BLOCK_SIZE; j++) 		m_rgfltAfterRowXform [i] [j] = m_rgfltAfter1dXform [j];}Void CBlockDCT::xformColumn (PixelC* ppxlcColDst, CoordI i, Int nColDst){	UInt j;	for (j = 0; j < BLOCK_SIZE; j++)			m_rgfltBuf1[j] = m_rgfltAfterRowXform[j][i];		oneDimensionalDCT ();	for (j = 0; j < BLOCK_SIZE; j++)	{ 		Int iValue = 				(m_rgfltAfter1dXform[j] >= 0) ? (PixelI) (m_rgfltAfter1dXform[j] + .5) :											(PixelI) (m_rgfltAfter1dXform[j] - .5);		*ppxlcColDst = m_rgchClipTbl [iValue];		ppxlcColDst += nColDst;	}}Void CBlockDCT::xformColumn (PixelI* ppxliColDst, CoordI i, Int nColDst){	UInt j;	for (j = 0; j < BLOCK_SIZE; j++)			m_rgfltBuf1[j] = m_rgfltAfterRowXform[j][i];	oneDimensionalDCT ();	for (j = 0; j < BLOCK_SIZE; j++)	{ 		PixelI vl = 			(m_rgfltAfter1dXform[j] >= 0) ? (PixelI) (m_rgfltAfter1dXform[j] + .5) :											(PixelI) (m_rgfltAfter1dXform[j] - .5);		*ppxliColDst = vl;		ppxliColDst += nColDst;	}}/* NBIT: changeCFwdBlockDCT::CFwdBlockDCT () : CBlockDCT ()*/CFwdBlockDCT::CFwdBlockDCT (UInt nBits) : CBlockDCT (nBits){}Void CFwdBlockDCT::oneDimensionalDCT (){	Int j, j1;	for (j = 0; j < 4; j++) {		j1 = 7 - j;		m_rgfltBuf2[j] = m_rgfltBuf1[j] + m_rgfltBuf1[j1];		m_rgfltBuf2[j1] = m_rgfltBuf1[j] - m_rgfltBuf1[j1];	}	m_rgfltBuf1[0] = m_rgfltBuf2[0] + m_rgfltBuf2[3];	m_rgfltBuf1[1] = m_rgfltBuf2[1] + m_rgfltBuf2[2];	m_rgfltBuf1[2] = m_rgfltBuf2[1] - m_rgfltBuf2[2];	m_rgfltBuf1[3] = m_rgfltBuf2[0] - m_rgfltBuf2[3];	m_rgfltBuf1[4] = m_rgfltBuf2[4];	m_rgfltBuf1[5] = (m_rgfltBuf2[6] - m_rgfltBuf2[5]) * m_c0;	m_rgfltBuf1[6] = (m_rgfltBuf2[6] + m_rgfltBuf2[5]) * m_c0;	m_rgfltBuf1[7] = m_rgfltBuf2[7];	m_rgfltAfter1dXform[0] = (m_rgfltBuf1[0] + m_rgfltBuf1[1]) * m_c4;	m_rgfltAfter1dXform[4] = (m_rgfltBuf1[0] - m_rgfltBuf1[1]) * m_c4;	m_rgfltAfter1dXform[2] = m_rgfltBuf1[2] * m_c6 + m_rgfltBuf1[3] * m_c2;	m_rgfltAfter1dXform[6] = m_rgfltBuf1[3] * m_c6 - m_rgfltBuf1[2] * m_c2;	m_rgfltBuf2[4] = m_rgfltBuf1[4] + m_rgfltBuf1[5];	m_rgfltBuf2[7] = m_rgfltBuf1[7] + m_rgfltBuf1[6];		m_rgfltBuf2[5] = m_rgfltBuf1[4] - m_rgfltBuf1[5];	m_rgfltBuf2[6] = m_rgfltBuf1[7] - m_rgfltBuf1[6];	m_rgfltAfter1dXform[1] = m_rgfltBuf2[4] * m_c7 + m_rgfltBuf2[7] * m_c1;	m_rgfltAfter1dXform[5] = m_rgfltBuf2[5] * m_c3 + m_rgfltBuf2[6] * m_c5;	m_rgfltAfter1dXform[7] = m_rgfltBuf2[7] * m_c7 - m_rgfltBuf2[4] * m_c1;	m_rgfltAfter1dXform[3] = m_rgfltBuf2[6] * m_c3 - m_rgfltBuf2[5] * m_c5;}/* NBIT: changeCInvBlockDCT::CInvBlockDCT () : CBlockDCT ()*/CInvBlockDCT::CInvBlockDCT (UInt nBits) : CBlockDCT (nBits){}Void CInvBlockDCT::oneDimensionalDCT (){	Float flt1 = m_rgfltBuf1[1] * m_c7 - m_rgfltBuf1[7] * m_c1;	Float flt2 = m_rgfltBuf1[7] * m_c7 + m_rgfltBuf1[1] * m_c1;	Float flt3 = m_rgfltBuf1[5] * m_c3 - m_rgfltBuf1[3] * m_c5;	Float flt4 = m_rgfltBuf1[3] * m_c3 + m_rgfltBuf1[5] * m_c5;	m_rgfltBuf2[0] = (m_rgfltBuf1[0] + m_rgfltBuf1[4]) * m_c4;	m_rgfltBuf2[1] = (m_rgfltBuf1[0] - m_rgfltBuf1[4]) * m_c4;	m_rgfltBuf2[2] = m_rgfltBuf1[2] * m_c6 - m_rgfltBuf1[6] * m_c2;	m_rgfltBuf2[3] = m_rgfltBuf1[6] * m_c6 + m_rgfltBuf1[2] * m_c2;	m_rgfltBuf1[4] = flt1 + flt3;	m_rgfltBuf2[5] = flt1 - flt3;	m_rgfltBuf2[6] = flt2 - flt4;	m_rgfltBuf1[7] = flt2 + flt4;    	m_rgfltBuf1[5] = (m_rgfltBuf2[6] - m_rgfltBuf2[5]) * m_c0;	m_rgfltBuf1[6] = (m_rgfltBuf2[6] + m_rgfltBuf2[5]) * m_c0;	m_rgfltBuf1[0] = m_rgfltBuf2[0] + m_rgfltBuf2[3];	m_rgfltBuf1[1] = m_rgfltBuf2[1] + m_rgfltBuf2[2];	m_rgfltBuf1[2] = m_rgfltBuf2[1] - m_rgfltBuf2[2];	m_rgfltBuf1[3] = m_rgfltBuf2[0] - m_rgfltBuf2[3];	Int j, j1;	for (j = 0; j < 4; j++) {		j1 = 7 - j;		m_rgfltAfter1dXform[j] = m_rgfltBuf1[j] + m_rgfltBuf1[j1];		m_rgfltAfter1dXform[j1] = m_rgfltBuf1[j] - m_rgfltBuf1[j1];	}}

⌨️ 快捷键说明

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