📄 entropystatic.cpp
字号:
ileNumber][nComNumber][r];
delete []m_pcoordSot_EotResTiles[nTileNumber][nComNumber][r];
}
for (l=0;l<m_niniLayerNums;l++)
{
delete []m_pnTruncIndex[nTileNumber][l][nComNumber];
}
delete []m_pBlkRateDistStats[nTileNumber][nComNumber];
delete []m_pcoordSot_EotResTiles[nTileNumber][nComNumber];
delete []m_pPrecNums[nTileNumber][nComNumber];
}
for (l=0;l<m_niniLayerNums;l++)
{
delete []m_pnTruncIndex[nTileNumber][l];
}
delete []m_pBlkRateDistStats[nTileNumber];
delete []m_pcoordSot_EotResTiles[nTileNumber];
delete []m_pnTruncIndex[nTileNumber];
delete []m_pnMrl[nTileNumber];
delete []m_pPrecNums[nTileNumber];
}
delete []m_pnTruncIndex;
delete []m_pBlkRateDistStats;
delete []m_pcoordSot_EotResTiles;
delete []m_pnMrl;
delete []m_pPrecNums;
}
CCoord *** CEBCOTRateAllocator::GetPrecNums()
{
return m_pPrecNums;
}
CCoord **** CEBCOTRateAllocator::GetSot_EotResTiles()
{
return m_pcoordSot_EotResTiles;
}
int CEBCOTRateAllocator::GetLimitedSIndexFromSlope(double slope)
{
int idx;
idx = (int)floor(log2(slope)) + RD_SUMMARY_OFF;
if (idx < 0)
{
return 0;
}
else
if (idx >= RD_SUMMARY_SIZE)
{
return RD_SUMMARY_SIZE-1;
}
else
{
return idx;
}
}
double CEBCOTRateAllocator::GetSlopeFromSIndex(int index)
{
return (double)pow(2,(index-RD_SUMMARY_OFF));
}
void CEBCOTRateAllocator::Initialize()
{
int nTileNums,nComNums;
nTileNums=m_pCodedImgBlkData->GetTileNums();
nComNums=m_pCodedImgBlkData->GetImgComNums();
/*-----------------估计整个码流的字节数------------------------*/
//粗略估计整个压缩码流的字节数,包括包头以及压缩码流头等;
//对包头进行粗略估计,假设每个包头平均有2个字节;
int nTotLength=0;
nTotLength=m_pnRDSlopesRates[0];
int nAvgPktLenth=0;
int nTileNumber,nComNumber;
int mrl,r;
int nMaxPktNums;
CCoord coordTileOrg,coordTileSiz;
CUnitInfo TileInfo;
bool bIsPrecUsed;
for (nTileNumber=0;nTileNumber<nTileNums;nTileNumber++)
{
nAvgPktLenth=2;
if (pEncoderSpec->pEPHUsed->IsTileSpecified(nTileNumber))
nAvgPktLenth+=CMarkers::EPH_LENGTH;
if (pEncoderSpec->pSOPUsed->IsTileSpecified(nTileNumber))
nAvgPktLenth+=CMarkers::SOP_LENGTH;
for (nComNumber=0;nComNumber<nComNums;nComNumber++)
{
mrl=m_pnMrl[nTileNumber][nComNumber];
bIsPrecUsed=pEncoderSpec->pPrecinctSize->IsPrecinctPartitionUsed(nTileNumber,nComNumber);
if (!bIsPrecUsed)// 未用precinct,则把每一个分辨率看成是一个precinct;
{
nTotLength+=m_nLayerNums*nAvgPktLenth*mrl;
}
else
{
for(r=0;r<mrl;r++)
{
nMaxPktNums=m_pPrecNums[nTileNumber][nComNumber][r].m_nX*m_pPrecNums[nTileNumber][nComNumber][r].m_nY;
nTotLength+=nMaxPktNums*nAvgPktLenth*m_nLayerNums;
}
}
}
}//结束估计TotLength;
/*-------------估计每一层的最小字节数-----------------*/
//如果某一层的目标比特率大于nTotlength,则将该层的目标比特率置为nTotlength;
//估计header的长度;
int nHeaderLength=m_pHeadEncoder->GetBufferLength();//表示码流头的长度;
for (nTileNumber=0;nTileNumber<nTileNums;nTileNumber++)
{
m_pHeadEncoder->Reset();
m_pHeadEncoder->WriteTilePartHeader(0,nTileNumber);
nHeaderLength+=m_pHeadEncoder->GetBufferLength();
}
double fPixelBits;//整个图像的象素数除以8bit;
fPixelBits=m_pCodedImgBlkData->GetImgInfo().GetImgHeight()*m_pCodedImgBlkData->GetImgInfo().GetImgWidth()/8.0;
m_pEBCOTLayer=new CEBCOTLayer[m_nLayerNums];
int nMinLayerSize=0;//每一层的最小字节数;
for (nTileNumber=0;nTileNumber<nTileNums;nTileNumber++)
{
for (nComNumber=0;nComNumber<nComNums;nComNumber++)
{
bIsPrecUsed=pEncoderSpec->pPrecinctSize->IsPrecinctPartitionUsed(nTileNumber,nComNumber);
mrl=m_pnMrl[nTileNumber][nComNumber];
if (!bIsPrecUsed)// 未用precinct,则把每一个分辨率看成是一个precinct;
{
nMinLayerSize+=MIN_AVG_PACKET_SZ*mrl;
}
else
{
for(r=0;r<mrl;r++)
{
nMaxPktNums=m_pPrecNums[nTileNumber][nComNumber][r].m_nX*m_pPrecNums[nTileNum
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -