pktheaderbitreader.cpp
来自「jpeg 2000 压缩算法源代码 核心ebcot」· C++ 代码 · 共 173 行
CPP
173 行
][nComNumber][r][s],sizeof(int)*nBlkNums);
memcpy(m_pnbakprevCBlkTruncIndex[nTileNumber][nComNumber][r][s],m_pnlastCBlkTruncIndex[nTileNumber][nComNumber][r][s],sizeof(int)*nBlkNums);
for (nPrecNumber=0;nPrecNumber<nPrecNums;nPrecNumber++)
{
m_ptagtreeCBlkInclusion[nTileNumber][nComNumber][r][s][nPrecNumber].Save();
m_ptagtreeCBlkMaxBitPlane[nTileNumber][nComNumber][r][s][nPrecNumber].Save();
}
}
}
/*
分辨率r=0时;
*/
nPrecNums=(m_pcoordPrecNums[nTileNumber][nComNumber][0].m_nX)*(m_pcoordPrecNums[nTileNumber][nComNumber][0].m_nY);
nBlkNums=m_pnBlkNumsInSuband[nTileNumber][nComNumber][0];
memcpy(m_pnbakLBlock[nTileNumber][nComNumber][0][0],m_pnLBlock[nTileNumber][nComNumber][r][0],sizeof(int)*nBlkNums);
memcpy(m_pnbakprevCBlkTruncIndex[nTileNumber][nComNumber][0][0],m_pnlastCBlkTruncIndex[nTileNumber][nComNumber][r][0],sizeof(int)*nBlkNums);
for (nPrecNumber=0;nPrecNumber<nPrecNums;nPrecNumber++)
{
m_ptagtreeCBlkInclusion[nTileNumber][nComNumber][0][0][nPrecNumber].Save();
m_ptagtreeCBlkMaxBitPlane[nTileNumber][nComNumber][0][0][nPrecNumber].Save();
}
}
m_bSaved=true;
}
bool CPacketEncoder::EncodePacket(int Layer, int nComNumber, int nTileNumber, int r, int nPrecIndex, CBlkRateDistStats ***pBlkRateDistStats, int **pnBlkTruncIndex)
{
int starts,ends,s;
if (r==0)
{
starts=0;
ends=0;
}
else
{
starts=1;
ends=3;
}
bool bIsPrecUsed=pEncoderSpec->pPrecinctSize->IsPrecinctPartitionUsed(nTileNumber,nComNumber);
/*-------首先,判断与该precinct对应的packet是否为空-----*/
bool bIsPktEmpty=true;
int *pnCBlkInPrec=0;
for (s=starts;s<=ends;s++)
{
if (m_pPrecInResTile[nTileNumber][nComNumber][r][s]==0)
{
continue;
}
else
{
pnCBlkInPrec=GetBlkInPrec(nTileNumber,nComNumber,r,s,nPrecIndex);
if (pnCBlkInPrec==0)//没有码块位于这个PrecIndex所指的区域中;
{
continue;
}
else
{
bIsPktEmpty=false;
delete []pnCBlkInPrec;
pnCBlkInPrec=0;
break;
}
}
}
/*
重置包头编码缓冲区,以编码新包;
*/
m_PktHeaderBuf.Reset();
/*
重置包体,释放所占的空间;
*/
if (m_pPktBody!=0)
{
delete []m_pPktBody;
m_pPktBody=0;
m_nPktBodyLenth=0;
}
/*---如果包是空的---*/
if (bIsPktEmpty)
{
m_bIsPktWritable=true;
m_PktHeaderBuf.WriteBit(0);
return true;
}
/*-------若包不为空-------*/
m_PktHeaderBuf.WriteBit(1);
int nXBlkNums,nYBlkNums;
int nBlkIndex,nBlkNumber;
int nBlkInPrecNums;
int nXBlkNumber,nYBlkNumber;
int nfirstXBlkNumber,nfirstYBlkNumber;
int nSkipBP;
int **pnlastCBlkTruncIndex=m_pnlastCBlkTruncIndex[nTileNumber][nComNumber][r];
CTagTreeEncoder **ptagtreeCBlkInclusion=m_ptagtreeCBlkInclusion[nTileNumber][nComNumber][r];
CTagTreeEncoder **ptagtreeCBlkMaxBitPlane=m_ptagtreeCBlkMaxBitPlane[nTileNumber][nComNumber][r];
int i,thmax;
int nNewpassNums;
int nMaxpassIndex;
int nBlkInPktLenth;
int nMinBits;
int nPredBits;
int nBits;
bool bIsPrecExist=false;
/*---------------------------
* 包的头信息编码
----------------------------*/
/*
按LL,HL,LH,HH子带顺序依次进行编码;
参考P64;
*/
for (s=starts;s<=ends;s++)
{
if (m_pPrecInResTile[nTileNumber][nComNumber][r][s]==0)
{
continue;
}
/*判断由nPrecIndex所指的区域是否在s子带上;
m_pPrecInResTile[nTileNumber][nComNumber][r][s][nPrecIndex]的UnitNumber初始化
为-1;
*/
if (m_pPrecInResTile[nTileNumber][nComNumber][r][s][nPrecIndex].GetUnitNumber()<0)
//
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?