📄 huffman.cpp
字号:
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 + -