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 + -
显示快捷键?