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

📄 entropyencoderstd.h

📁 jpeg 2000 压缩算法源代码 核心ebcot
💻 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 + -