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

📄 huffman.cpp

📁 《Visual C++小波变换技术与工程实践》靳济芳编著的光盘程序。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    return lNextNodeOrSymbol;
}

CHuffmanEncoder::~CHuffmanEncoder ()
{
	delete m_pCodeTable; 
	delete m_pSizeTable;
}

CHuffmanEncoder::CHuffmanEncoder(COutBitStream &bitStream)
{
    attachStream(bitStream);
}

CHuffmanEncoder::CHuffmanEncoder(COutBitStream &bitStream, VlcTable *pVlc)
{
	attachStream(bitStream);

	loadTable(pVlc);
}

Void CHuffmanEncoder::loadTable(istream &huffmanTable)
{
    Int lNOfSymbols;
    Int lMaxCodeSize;
    profileTable(huffmanTable,lNOfSymbols,lMaxCodeSize);
    assert(lNOfSymbols>1);
    assert(lMaxCodeSize);
    m_lCodeTableEntrySize=lMaxCodeSize/8;
    if(lMaxCodeSize%8)
        m_lCodeTableEntrySize++;
    m_pSizeTable = new Int [lNOfSymbols];
    m_pCodeTable = new Int [lNOfSymbols];
    Char *pCode=new Char[lMaxCodeSize];
    huffmanTable.clear();
    huffmanTable.seekg(0,ios::beg);
    while(huffmanTable.peek()!=EOF)
    {
        Int lCodeSize;
        Int lSymbol;
        Int iBitPosition=0;
        if(processOneLine(huffmanTable,lSymbol,lCodeSize,pCode))
        {
            assert(lSymbol<lNOfSymbols);                                                 
            assert(lCodeSize >=0 && lCodeSize <= (Int) sizeof (Int) * 8);
            m_pSizeTable[lSymbol]=lCodeSize;                                             
            Int* pCodeTableEntry=&m_pCodeTable[lSymbol]; 
            for(Int i=0;i<lCodeSize;i++)                                                
            {                                                                            
                if(iBitPosition==0)                                                      
                    *pCodeTableEntry=0;                                                  
                assert((pCode[lCodeSize - i - 1]==0)||(pCode[lCodeSize - i - 1]==1));                                    
                if(pCode[lCodeSize - i - 1]==0)                                                          
                    *pCodeTableEntry&=~(0x01<<iBitPosition);                             
                else                                                                     
                    *pCodeTableEntry|=0x01<<iBitPosition;                                
                iBitPosition++;                                                          
				/*
                if(iBitPosition>=8)                                                      
                {                                                                        
                    iBitPosition=0;                                                      
                    pCodeTableEntry++;                                                   
                } 
				*/
            }                                                                           
        }
    }
    delete pCode;
}

Void CHuffmanEncoder::loadTable(VlcTable *pVlc)
{
    Int lNOfSymbols = 0;
    Int lMaxCodeSize = 0;

	VlcTable *pVlcTmp;

	for(pVlcTmp = pVlc; pVlcTmp->pchBits!=NULL; pVlcTmp++)
	{
        lNOfSymbols++;
		Int lCodeSize = strlen(pVlcTmp->pchBits);

		assert(pVlcTmp->lSymbol>=0 && pVlcTmp->lSymbol<1000);
		assert(lCodeSize>0);

        if(lCodeSize>lMaxCodeSize)
			lMaxCodeSize=lCodeSize;
    }
    assert(lNOfSymbols>1);
    assert(lMaxCodeSize>0);

    m_lCodeTableEntrySize=lMaxCodeSize/8;
    if(lMaxCodeSize%8)
        m_lCodeTableEntrySize++;
    m_pSizeTable = new Int [lNOfSymbols];
    m_pCodeTable = new Int [lNOfSymbols];
	
	for(pVlcTmp = pVlc; pVlcTmp->pchBits!=NULL; pVlcTmp++)
    {
        Int lCodeSize = strlen(pVlcTmp->pchBits);
        Int lSymbol = pVlcTmp->lSymbol;
        Int iBitPosition=0;

        assert(lSymbol<lNOfSymbols);                                                 
        assert(lCodeSize >=0 && lCodeSize <= (Int) sizeof (Int) * 8);
        m_pSizeTable[lSymbol]=lCodeSize;                                             
        Int* pCodeTableEntry=&m_pCodeTable[lSymbol]; 
        for(Int i=0;i<lCodeSize;i++)                                                
        {                                                                            
	        if(iBitPosition==0)                                                      
		        *pCodeTableEntry=0;                                                  
			Int iBitC = pVlcTmp->pchBits[lCodeSize - i - 1];
            assert(iBitC=='0' || iBitC=='1');
            if(iBitC=='0')                                                          
				*pCodeTableEntry&=~(0x01<<iBitPosition);                             
            else                                                                     
                *pCodeTableEntry|=0x01<<iBitPosition;                                
            iBitPosition++;                                                          
			/*
                if(iBitPosition>=8)                                                      
                {                                                                        
                    iBitPosition=0;                                                      
                    pCodeTableEntry++;                                                   
                } 
			*/                                                                         
        }
    }
}

void CHuffmanEncoder::attachStream(COutBitStream &bitStream)
{
    m_pBitStream=&bitStream;
}

UInt CHuffmanEncoder::encodeSymbol (Int lSymbol, Char* rgchSymbolName, Bool bDontSendBits)
{
    Int lSize=m_pSizeTable[lSymbol];
	if (bDontSendBits == TRUE)					//for counting bits
		return (lSize);
// Added for Data Partitioning by Toshiba (98-1-16)
	if(m_pBitStream -> GetDontSendBits()) 
		return (lSize);
// End Toshiba(1998-1-16)

    Int iCode=m_pCodeTable[lSymbol];
	Int lPrevCounter = m_pBitStream -> getCounter ();
    m_pBitStream -> putBits (iCode,lSize, rgchSymbolName);
	return (m_pBitStream -> getCounter () - lPrevCounter);
}


CEntropyEncoderSet::CEntropyEncoderSet (COutBitStream &bitStream)
{
	m_pentrencDCT = new CHuffmanEncoder (bitStream, g_rgVlcDCT);
	m_pentrencDCTIntra = new CHuffmanEncoder (bitStream, g_rgVlcDCTIntra);
 	//	Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)
 	m_pentrencDCTRVLC = new CHuffmanEncoder (bitStream, g_rgVlcDCTRVLC);
 	m_pentrencDCTIntraRVLC = new CHuffmanEncoder (bitStream, g_rgVlcDCTIntraRVLC);
 	//	End Toshiba(1998-1-16:DP+RVLC)
	m_pentrencMV = new CHuffmanEncoder (bitStream, g_rgVlcMV);
	m_pentrencMCBPCintra = new CHuffmanEncoder (bitStream, g_rgVlcMCBPCintra);
	m_pentrencMCBPCinter = new CHuffmanEncoder (bitStream, g_rgVlcMCBPCinter);
	m_pentrencCBPY = new CHuffmanEncoder (bitStream, g_rgVlcCBPY);
	m_pentrencCBPY1 = new CHuffmanEncoder (bitStream, g_rgVlcCBPY1);
	m_pentrencCBPY2 = new CHuffmanEncoder (bitStream, g_rgVlcCBPY2);
	m_pentrencCBPY3 = new CHuffmanEncoder (bitStream, g_rgVlcCBPY3);
	m_pentrencIntraDCy = new CHuffmanEncoder (bitStream, g_rgVlcIntraDCy);
	m_pentrencIntraDCc = new CHuffmanEncoder (bitStream, g_rgVlcIntraDCc);
	m_pentrencMbTypeBVOP = new CHuffmanEncoder (bitStream, g_rgVlcMbTypeBVOP);
 	m_pentrencWrpPnt = new CHuffmanEncoder (bitStream, g_rgVlcWrpPnt);
	m_ppentrencShapeMode [0] = new CHuffmanEncoder (bitStream, g_rgVlcShapeMode0);
	m_ppentrencShapeMode [1] = new CHuffmanEncoder (bitStream, g_rgVlcShapeMode1);
	m_ppentrencShapeMode [2] = new CHuffmanEncoder (bitStream, g_rgVlcShapeMode2);
	m_ppentrencShapeMode [3] = new CHuffmanEncoder (bitStream, g_rgVlcShapeMode3);
	m_ppentrencShapeMode [4] = new CHuffmanEncoder (bitStream, g_rgVlcShapeMode4);
	m_ppentrencShapeMode [5] = new CHuffmanEncoder (bitStream, g_rgVlcShapeMode5);
	m_ppentrencShapeMode [6] = new CHuffmanEncoder (bitStream, g_rgVlcShapeMode6);
//OBSS_SAIT_991015
	m_ppentrencShapeSSModeInter [0] = new CHuffmanEncoder (bitStream, g_rgVlcShapeSSModeInter0);	
	m_ppentrencShapeSSModeInter [1] = new CHuffmanEncoder (bitStream, g_rgVlcShapeSSModeInter1);	
	m_ppentrencShapeSSModeInter [2] = new CHuffmanEncoder (bitStream, g_rgVlcShapeSSModeInter2);	
	m_ppentrencShapeSSModeInter [3] = new CHuffmanEncoder (bitStream, g_rgVlcShapeSSModeInter3);	
	m_ppentrencShapeSSModeIntra [0] = new CHuffmanEncoder (bitStream, g_rgVlcShapeSSModeIntra0);	
	m_ppentrencShapeSSModeIntra [1] = new CHuffmanEncoder (bitStream, g_rgVlcShapeSSModeIntra1);	
//~OBSS_SAIT_991015
	m_pentrencShapeMV1 = new CHuffmanEncoder (bitStream, g_rgVlcShapeMV1);
	m_pentrencShapeMV2 = new CHuffmanEncoder (bitStream, g_rgVlcShapeMV2);
	

}

CEntropyEncoderSet::~CEntropyEncoderSet()
{
	delete m_pentrencDCT;
	delete m_pentrencDCTIntra;
	delete m_pentrencMV;
	delete m_pentrencMCBPCintra;
	delete m_pentrencMCBPCinter;
	delete m_pentrencCBPY;
	delete m_pentrencCBPY2;
	delete m_pentrencCBPY3;
	delete m_pentrencIntraDCy;
	delete m_pentrencIntraDCc;
	delete m_pentrencMbTypeBVOP;
	delete m_pentrencWrpPnt;
	for (UInt iShapeMd = 0; iShapeMd < 7; iShapeMd++)
		delete m_ppentrencShapeMode [iShapeMd];

//OBSS_SAIT_991015
	for (UInt iShapeSSMdInter = 0; iShapeSSMdInter < 4; iShapeSSMdInter++)
		delete m_ppentrencShapeSSModeInter [iShapeSSMdInter];
	for (UInt iShapeSSMdIntra = 0; iShapeSSMdIntra < 2; iShapeSSMdIntra++)
		delete m_ppentrencShapeSSModeIntra [iShapeSSMdIntra];
//~OBSS_SAIT_991015

	delete m_pentrencShapeMV1;
	delete m_pentrencShapeMV2;
 	//	Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)
 	delete m_pentrencDCTRVLC;
 	delete m_pentrencDCTIntraRVLC;
 	//	End Toshiba(1998-1-16:DP+RVLC)
}

CEntropyDecoderSet::CEntropyDecoderSet (CInBitStream &bitStream)
{
	m_pentrdecDCT = new CHuffmanDecoder (bitStream, g_rgVlcDCT);
	m_pentrdecDCTIntra = new CHuffmanDecoder (bitStream, g_rgVlcDCTIntra);
 	//	Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)
 	m_pentrdecDCTRVLC = new CHuffmanDecoder (bitStream, g_rgVlcDCTRVLC);
 	m_pentrdecDCTIntraRVLC = new CHuffmanDecoder (bitStream, g_rgVlcDCTIntraRVLC);
 	//	End Toshiba(1998-1-16:DP+RVLC)
	m_pentrdecMV = new CHuffmanDecoder (bitStream, g_rgVlcMV);
	m_pentrdecMCBPCintra = new CHuffmanDecoder (bitStream, g_rgVlcMCBPCintra);
	m_pentrdecMCBPCinter = new CHuffmanDecoder (bitStream, g_rgVlcMCBPCinter);
	m_pentrdecCBPY = new CHuffmanDecoder (bitStream, g_rgVlcCBPY);
	m_pentrdecCBPY1 = new CHuffmanDecoder (bitStream, g_rgVlcCBPY1);
	m_pentrdecCBPY2 = new CHuffmanDecoder (bitStream, g_rgVlcCBPY2);
	m_pentrdecCBPY3 = new CHuffmanDecoder (bitStream, g_rgVlcCBPY3);
	m_pentrdecIntraDCy = new CHuffmanDecoder (bitStream, g_rgVlcIntraDCy);
	m_pentrdecIntraDCc = new CHuffmanDecoder (bitStream, g_rgVlcIntraDCc);
	m_pentrdecMbTypeBVOP = new CHuffmanDecoder (bitStream, g_rgVlcMbTypeBVOP);
 	m_pentrdecWrpPnt = new CHuffmanDecoder (bitStream, g_rgVlcWrpPnt);
	m_ppentrdecShapeMode [0] = new CHuffmanDecoder (bitStream, g_rgVlcShapeMode0);
	m_ppentrdecShapeMode [1] = new CHuffmanDecoder (bitStream, g_rgVlcShapeMode1);
	m_ppentrdecShapeMode [2] = new CHuffmanDecoder (bitStream, g_rgVlcShapeMode2);
	m_ppentrdecShapeMode [3] = new CHuffmanDecoder (bitStream, g_rgVlcShapeMode3);
	m_ppentrdecShapeMode [4] = new CHuffmanDecoder (bitStream, g_rgVlcShapeMode4);
	m_ppentrdecShapeMode [5] = new CHuffmanDecoder (bitStream, g_rgVlcShapeMode5);
	m_ppentrdecShapeMode [6] = new CHuffmanDecoder (bitStream, g_rgVlcShapeMode6);
//OBSS_SAIT_991015
	m_ppentrdecShapeSSModeInter [0] = new CHuffmanDecoder (bitStream, g_rgVlcShapeSSModeInter0);
	m_ppentrdecShapeSSModeInter [1] = new CHuffmanDecoder (bitStream, g_rgVlcShapeSSModeInter1);
	m_ppentrdecShapeSSModeInter [2] = new CHuffmanDecoder (bitStream, g_rgVlcShapeSSModeInter2);
	m_ppentrdecShapeSSModeInter [3] = new CHuffmanDecoder (bitStream, g_rgVlcShapeSSModeInter3);
	m_ppentrdecShapeSSModeIntra [0] = new CHuffmanDecoder (bitStream, g_rgVlcShapeSSModeIntra0);
	m_ppentrdecShapeSSModeIntra [1] = new CHuffmanDecoder (bitStream, g_rgVlcShapeSSModeIntra1);
//~OBSS_SAIT_991015
	m_pentrdecShapeMV1 = new CHuffmanDecoder (bitStream, g_rgVlcShapeMV1);
	m_pentrdecShapeMV2 = new CHuffmanDecoder (bitStream, g_rgVlcShapeMV2);


}

CEntropyDecoderSet::~CEntropyDecoderSet()
{
	delete m_pentrdecDCT;
	delete m_pentrdecDCTIntra;
	delete m_pentrdecMV;
	delete m_pentrdecMCBPCintra;
	delete m_pentrdecMCBPCinter;
	delete m_pentrdecCBPY;
	delete m_pentrdecCBPY1;
	delete m_pentrdecCBPY2;
	delete m_pentrdecCBPY3;
	delete m_pentrdecIntraDCy;
	delete m_pentrdecIntraDCc;
	delete m_pentrdecMbTypeBVOP;
	delete m_pentrdecWrpPnt ;
	for (UInt iShapeMd = 0; iShapeMd < 7; iShapeMd++)
		delete m_ppentrdecShapeMode [iShapeMd];
//OBSS_SAIT_991015
	for (UInt iShapeSSMdInter = 0; iShapeSSMdInter < 4; iShapeSSMdInter++)
		delete m_ppentrdecShapeSSModeInter [iShapeSSMdInter];
	for (UInt iShapeSSMdIntra = 0; iShapeSSMdIntra < 2; iShapeSSMdIntra++)
		delete m_ppentrdecShapeSSModeIntra [iShapeSSMdIntra];
//~OBSS_SAIT_991015
	delete m_pentrdecShapeMV1;
	delete m_pentrdecShapeMV2;
 	//	Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)
 	delete m_pentrdecDCTRVLC;
 	delete m_pentrdecDCTIntraRVLC;
 	//	End Toshiba(1998-1-16:DP+RVLC)
}

⌨️ 快捷键说明

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