📄 entropyencoderstd.h
字号:
CKET_SZ=32;
double CEBCOTRateAllocator::FLOAT_ABS_PRECISION=1e-10;
double CEBCOTRateAllocator::FLOAT_REL_PRECISION=1e-4;
CEBCOTRateAllocator::CEBCOTRateAllocator()
{
m_pCodedImgBlkData=0;
m_pBlkRateDistStats=0;
m_pcoordSot_EotResTiles=0;
m_pEBCOTLayer=0;
m_pnRDSlopesRates=0;
m_pPrecNums=0;
pEncoderSpec=0;
m_pnMrl=0;
}
CEBCOTRateAllocator::~CEBCOTRateAllocator()
{
freeArray();
delete []m_pnRDSlopesRates;
delete []m_pEBCOTLayer;
delete m_pPktEncoder;
delete m_pHeadEncoder;
}
// EBCOT速率分配
CEBCOTRateAllocator::CEBCOTRateAllocator(CImgBlkWTData *pCodedImgData, CEncoderSpec &EncoderSpec, CLayersInfo *pLayers)
{
m_pCodedImgBlkData=0;
m_pCodedImgBlkData=pCodedImgData;
pEncoderSpec=0;
pEncoderSpec=&EncoderSpec;
m_pLayersInfo=0;
m_pLayersInfo=pLayers;
m_nLayerNums=pLayers->GetTotLyrs();
m_niniLayerNums=m_nLayerNums;
m_pBlkRateDistStats=0;
m_pnTruncIndex=0;
m_pnRDSlopesRates=0;
m_pnRDSlopesRates=new int[RD_SUMMARY_SIZE];
int rdsvalue=0;
InitializeArray(m_pnRDSlopesRates,RD_SUMMARY_SIZE,rdsvalue);
m_pPrecNums=0;
m_pEBCOTLayer=0;
m_pcoordSot_EotResTiles=0;
m_pnMrl=0;
m_pPktEncoder=0;
m_pHeadEncoder=0;
int nTileNums,nComNums;
nTileNums=pCodedImgData->GetTileNums();
nComNums=pCodedImgData->GetImgComNums();
m_pnTruncIndex=new int*****[nTileNums];
m_pPrecNums=new CCoord **[nTileNums];
m_pcoordSot_EotResTiles=new CCoord ***[nTileNums];
// 码块率失真状态变量
m_pBlkRateDistStats=new CBlkRateDistStats*****[nTileNums];
m_pnMrl=new int *[nTileNums];
int nTileNumber,nComNumber;
int nlyrs;
for (nTileNumber=0;nTileNumber<nTileNums;nTileNumber++)
{
m_pnTruncIndex[nTileNumber]=new int ****[m_nLayerNums];
m_pPrecNums[nTileNumber]=new CCoord *[nComNums];
m_pcoordSot_EotResTiles[nTileNumber]=new CCoord **[nComNums];
m_pnMrl[nTileNumber]=new int[nComNums];
m_pBlkRateDistStats[nTileNumber]=new CBlkRateDistStats****[nComNums];
for (nlyrs=0;nlyrs<m_niniLayerNums;nlyrs++)
{
m_pnTruncIndex[nTileNumber][nlyrs]=new int ***[nComNums];
}
}
// int tx0,ty0,tx1,ty1;
int trx0,try0,trx1,try1;
int tcx0,tcy0,tcx1,tcy1;
// int xrsiz,yrsiz;
int mrl, r;
CTileBlkWTData *pCodedTileComBlkData=0;
CBandBlkWTData *pCodedBandBlkData=0;
CBlkWTData *pCodedBlk=0;
CDataBlk *pCodedBlkData=0;
CCoord coordTileComOrg,coordTileComSiz;
CCoord nOrgVal(0,0);
CSiz PrecSiz;
int nPPX,nPPY;
int nBlkNums,nBlkNumber;
double twoPPX,twoPPY;
int startSIdx,endSIdx,s;
int norgval=-1;
CBlkRateDistStats *pCCB=0;
double fslope;
int sidx,last_sidx;
for (nTileNumber=0;nTileNumber<nTileNums;nTileNumber++)
for (nComNumber=0;nComNumber<nComNums;nComNumber++)
{
pCodedTileComBlkData=pCodedImgData->GetTileBlkWTData(nTileNumber,nComNumber);
mrl=pCodedTileComBlkData->GetTileDecLev()+1;
m_pnMrl[nTileNumber][nComNumber]=mrl;
m_pPrecNums[nTileNumber][nComNumber]=new CCoord[mrl];
m_pBlkRateDistStats[nTileNumber][nComNumber]=new CBlkRateDistStats***[mrl];
InitializeArray(m_pPrecNums[nTileNumber][nComNumber],mrl,nOrgVal);
m_pcoordSot_EotResTiles[nTileNumber][nComNumber]=new CCoord* [mrl];
coordTileComOrg=pCodedTileComBlkData->GetTileInfo().GetCoordUnitOrg();
coordTileComSiz=pCodedTileComBlkData->GetTileInfo().GetCoordUnitSiz();
tcx0=coordTileComOrg.m_nX;
tcy0=coordTileComOrg.m_nY;
tcx1=coordTileComSiz.m_nX;
tcy1=coordTileComSiz.m_nY;
for (nlyrs=0;nlyrs<m_niniLayerNums;nlyrs++)
{
m_pnTruncIndex[nTileNumber][nlyrs][nComNumber]=new int **[mrl];
}
for (r=mrl-1;r>=0;r--)
{
trx0=(int)(ceil(tcx0/((double)(1<<(mrl-1-r)))));
try0=(int)(ceil(tcy0/((double)(1<<(mrl-1-r)))));
trx1=(int)(ceil(tcx1/((double)(1<<(mrl-1-r)))));
try1=(int)(ceil(tcy1/((double)(1<<(mrl-1-r)))));
m_pcoordSot_EotResTiles[nTileNumber][nComNumber][r]=new CCoord [2];
m_pcoordSot_EotResTiles[nTileNumber][nComNumber][r][0].SetCoord(trx0,try0);
m_pcoordSot_EotResTiles[nTileNumber][nComNumber][r][1].SetCoord(trx1,try1);
PrecSiz=pEncoderSpec->pPrecinctSize->GetPrecinctSiz(nTileNumber,nComNumber,r);
nPPX=PrecSiz.GetWidth();
nPPY=PrecSiz.GetHeight();
if (nPPX<15)
{
twoPPX=(double)(1<<nPPX);
if (trx1>trx0)
{
m_pPrecNums[nTileNumber][nComNumber][r].m_nX=(int)(ceil(trx1/twoPPX))-(int)(floor(trx0/twoPPX));
}
}
else
{
m_pPrecNums[nTileNumber][nComNumber][r].m_nX=1;
}
if (nPPY<15)
{
twoPPY=(double)(1<<nPPY);
if (try1>try0)
{
m_pPrecNums[nTileNumber][nComNumber][r].m_nY=(int)(ceil(try1/twoPPY))-(int)(floor(try0/twoPPY));
}
}
else
{
m_pPrecNums[nTileNumber][nComNumber][r].m_nY=1;
}
m_pBlkRateDistStats[nTileNumber][nComNumber][r]=new CBlkRateDistStats **[4];
for (nlyrs=0;nlyrs<m_niniLayerNums;nlyrs++)
{
m_pnTruncIndex[nTileNumber][nlyrs][nComNumber][r]=new int*[4];
}
startSIdx=1;
endSIdx=3;
if (r==0)
{
startSIdx=0;
endSIdx=0;
mrl-=1;
}
for (s=startSIdx;s<=endSIdx;s++)
{
pCodedBandBlkData=pCodedTileComBlkData->GetBandBlkWTData(mrl-r,s);
pCodedBlk=pCodedBandBlkData->GetBandBlkWTData();
nBlkNums=pCodedBandBlkData->GetBlkNums();
m_pBlkRateDistStats[nTileNumber][nComNumber][r][s]=new CBlkRateDistStats *[nBlkNums];
for (nBlkNumber=0;nBlkNumber<nBlkNums;nBlkNumber++)
{
// m_pnTruncIndex[nTileNumber][nlyrs][nComNumber][r][s][nBlkNumber]=-1;
pCodedBlkData=pCodedBlk[nBlkNumber].
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -