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

📄 vopsedec.cpp

📁 《Visual C++小波变换技术与工程实践》作者:靳济芳。书上的代码。第8章:在数字视频处理中的应用。包括:视频图像的分类
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		break;
	default:
		break;
	}
	cout << "\n";
	cout.flush ();
/* Added by SONY (98/03/30)*/
	if(m_bLinkisBroken == TRUE && m_bUseGOV == TRUE)
		fprintf(stderr,"WARNING: broken_link = 1  --- Output image must be broken.\n");
/*Added by SONY (98/03/30) End*/

	if(bCoded==FALSE)
	{
		if (m_vopmd.vopPredType != BVOP
			&& m_volmd.fAUsage != RECTANGLE && bPrevRefVopWasCoded)
		{
			// give the current object a dummy size
			m_iNumMBX = m_iNumMBY = m_iNumMB = 1;
			saveShapeMode(); // save the previous reference vop shape mode
		}
//OBSS_SAIT_991015
		if (m_volmd.fAUsage != RECTANGLE){								
			// give the current object a dummy size						
			m_iNumMBX = m_iNumMBY = m_iNumMB = 1;						
			saveBaseShapeMode(); // save the base layer shape mode		
		}																
//~OBSS_SAIT_991015
		return FALSE;
	}

	if (m_volmd.fAUsage != RECTANGLE)
		resetBYPlane ();

	if (m_volmd.fAUsage != RECTANGLE) {
		setRefStartingPointers ();
		computeVOPMembers ();
	}

// RRV insertion
	redefineVOLMembersRRV ();
// ~RRV	

	decodeVOP ();

	//wchen: added by sony-probably not the best way
	if(m_volmd.volType == ENHN_LAYER &&
		(m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0))
		swapVOPU8Pointers(m_pvopcCurrQ,m_pvopcRefQ1);

//OBSSFIX_MODE3
	//Case for base layer has rectangular shape & enhancement layer has arbitrary shape
    if(m_pvopcCurrQ->fAUsage() == RECTANGLE &&   m_pvopcCurrQ->fAUsage() != m_pvopcRefQ1->fAUsage() ){
     delete m_pvopcCurrQ;
     m_pvopcCurrQ = new CVOPU8YUVBA(m_volmd.fAUsage, m_rctRefFrameY, m_volmd.iAuxCompCount);
    }
//~OBSSFIX_MODE3

	// store the direct mode data
	if (m_vopmd.vopPredType != BVOP ||
		(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) {
		if(m_volmd.fAUsage != RECTANGLE && bPrevRefVopWasCoded)
			saveShapeMode();
//OBSS_SAIT_991015
		if(m_volmd.fAUsage != RECTANGLE) 
			saveBaseShapeMode();				
//~OBSS_SAIT_991015
		CMBMode* pmbmdTmp = m_rgmbmd;
		m_rgmbmd = m_rgmbmdRef;
		m_rgmbmdRef = pmbmdTmp;
		CMotionVector* pmvTmp = m_rgmv;
		m_rgmv = m_rgmvRef;
		m_rgmvRef = pmvTmp;
		m_rgmvBackward = m_rgmv + BVOP_MV_PER_REF_PER_MB * m_iSessNumMB;
	}
//OBSS_SAIT_991015
	else if (m_volmd.volType == BASE_LAYER && m_vopmd.vopPredType == BVOP ){
		if( m_volmd.fAUsage != RECTANGLE) 
			saveBaseShapeMode();	
	}
//~OBSS_SAIT_991015

	if (m_volmd.fAUsage != RECTANGLE)	{
		if (m_vopmd.vopPredType != BVOP ||
			(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) {
			m_iNumMBRef = m_iNumMB;
			m_iNumMBXRef = m_iNumMBX;
			m_iNumMBYRef = m_iNumMBY;
			m_iOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
			m_iOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);
			m_rctPrevNoExpandY = m_rctCurrVOPY;
			m_rctPrevNoExpandUV = m_rctCurrVOPUV;
			
			m_rctRefVOPY1 = m_rctCurrVOPY;
			m_rctRefVOPY1.expand (EXPANDY_REFVOP);
			m_rctRefVOPUV1 = m_rctCurrVOPUV;
			m_rctRefVOPUV1.expand (EXPANDUV_REFVOP);
			m_pvopcRefQ1->setBoundRct (m_rctRefVOPY1);
		}
		else {				// For Temporal Scalability	Added by Sharp(1998-02-10)
//OBSS_SAIT_991015		//for Base layer BVOP padding 
		    if (m_volmd.volType == BASE_LAYER && m_vopmd.vopPredType == BVOP) {
				if(!m_volmd.bShapeOnly){	
					m_iOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
					m_iOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);
					m_rctPrevNoExpandY = m_rctCurrVOPY;
					m_rctPrevNoExpandUV = m_rctCurrVOPUV;
				}
			}
//~OBSS_SAIT_991015		
			m_iBVOPOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
			m_iBVOPOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);
			m_rctBVOPPrevNoExpandY = m_rctCurrVOPY;
			m_rctBVOPPrevNoExpandUV = m_rctCurrVOPUV;

			m_rctBVOPRefVOPY1 = m_rctCurrVOPY;
			m_rctBVOPRefVOPY1.expand (EXPANDY_REFVOP);
			m_rctBVOPRefVOPUV1 = m_rctCurrVOPUV;
			m_rctBVOPRefVOPUV1.expand (EXPANDUV_REFVOP);
		}				// For Temporal Scalability	End	 Sharp(1998-02-10)

		//give a comment that this is ac/dc pred stuff
		Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 6+m_volmd.iAuxCompCount*4 : 6;
		delete [] m_rgblkmCurrMB;
		for (Int iMB = 0; iMB < m_iNumMBX; iMB++)	{
			for (Int iBlk = 0; iBlk < nBlk; iBlk++)	{
				delete [] (m_rgpmbmAbove [iMB]->rgblkm) [iBlk];
				delete [] (m_rgpmbmCurr  [iMB]->rgblkm) [iBlk];
			}
			delete [] m_rgpmbmAbove [iMB]->rgblkm;
			delete m_rgpmbmAbove [iMB];
			delete [] m_rgpmbmCurr [iMB]->rgblkm;
			delete m_rgpmbmCurr [iMB];
		}
		delete [] m_rgpmbmAbove;
		delete [] m_rgpmbmCurr;
	}
	else {				// For Temporal Scalability	Added by Sharp(1998-02-10)
		m_iBVOPOffsetForPadY = m_iOffsetForPadY;
		m_iBVOPOffsetForPadUV = m_iOffsetForPadUV;
		m_rctBVOPPrevNoExpandY = m_rctPrevNoExpandY;
		m_rctBVOPPrevNoExpandUV = m_rctPrevNoExpandUV;

		m_rctBVOPRefVOPY1 = m_rctRefVOPY1;
		m_rctBVOPRefVOPUV1 = m_rctRefVOPUV1;
	}				// For Temporal Scalability	End	 Sharp(1998-02-10)


    if (m_vopmd.vopPredType != BVOP ||
		(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) {
		if(!m_volmd.bShapeOnly){	//OBSS_SAIT_991015
			repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ1);
			repeatPadUV (m_pvopcRefQ1);
		}							//OBSS_SAIT_991015

		//reset by in RefQ1 so that no left-over from last frame
		if (m_volmd.fAUsage != RECTANGLE)       {
      if (m_volmd.fAUsage == EIGHT_BIT) {
        for(Int iAuxComp=0; iAuxComp<m_volmd.iAuxCompCount; iAuxComp++ ) { // MAC (SB) 1-Dec-99
				  repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsA (iAuxComp) + m_iOffsetForPadY, m_pvopcRefQ1);
        }
      }
		}
	}
//OBSS_SAIT_991015	//Base layer BVOP padding for OBSS
    if (m_volmd.volType == BASE_LAYER && m_vopmd.vopPredType == BVOP) {
		if(!m_volmd.bShapeOnly){	
			repeatPadYOrA ((PixelC*) m_pvopcCurrQ->pixelsY () + m_iOffsetForPadY, m_pvopcCurrQ);
			repeatPadUV (m_pvopcCurrQ);
		}

		if (m_volmd.fAUsage != RECTANGLE)  {
      if (m_volmd.fAUsage == EIGHT_BIT) {
        for(Int iAuxComp=0; iAuxComp<m_volmd.iAuxCompCount; iAuxComp++ ) { // MAC (SB) 1-Dec-99
				  repeatPadYOrA ((PixelC*) m_pvopcCurrQ->pixelsA (iAuxComp) + m_iOffsetForPadY, m_pvopcCurrQ);
        }
      }
		}
	}
//~OBSS_SAIT_991015	
	// update buffers for temporal scalability	Added by Sharp(1998-02-10)
	if(m_volmd.volType != BASE_LAYER)  updateBuffVOPsEnhc ();

	return TRUE;
}

Int CVideoObjectDecoder::findStartCode()
{
	// ensure byte alignment
	m_pbitstrmIn->flush ();

	Int bUserData;
	do {
		bUserData = 0;
		while(m_pbitstrmIn->peekBits(NUMBITS_START_CODE_PREFIX)!=START_CODE_PREFIX)
		{
			m_pbitstrmIn->getBits(8);
			if(m_pbitstrmIn->eof()==EOF)
				return EOF;
		}
		m_pbitstrmIn->getBits(NUMBITS_START_CODE_PREFIX);
		if(m_pbitstrmIn->peekBits(NUMBITS_START_CODE_SUFFIX)==USER_DATA_START_CODE)
			bUserData = 1;
	} while(bUserData);

	return 0;
}

Void CVideoObjectDecoder::decodeVOHead ()
{
	findStartCode();
 	//	Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)(for Skip Session_Start_Code)
 	if( m_pbitstrmIn->peekBits(NUMBITS_START_CODE_SUFFIX)==SESSION_START_CODE){
 		m_pbitstrmIn -> getBits (NUMBITS_START_CODE_SUFFIX);
 		if (findStartCode () == EOF)
 			assert(FALSE);
 	}
 	//	End Toshiba(1998-1-16:DP+RVLC)
	UInt uiVoStartCode = m_pbitstrmIn -> getBits (NUMBITS_VO_START_CODE);
	assert(uiVoStartCode == VO_START_CODE);

	m_uiVOId = m_pbitstrmIn -> getBits (NUMBITS_VO_ID);
}

Void CVideoObjectDecoder::decodeVOLHead ()
{
	findStartCode();
	UInt uiVolStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOL_START_CODE);
	assert(uiVolStartCode == VOL_START_CODE);
	UInt uiVOLId = m_pbitstrmIn -> getBits (NUMBITS_VOL_ID);
// Begin: modified by Hughes	  4/9/98	  per clause 2.1.7. in N2171 document
	Bool bRandom = m_pbitstrmIn->getBits (1); //VOL_Random_Access
// End: modified by Hughes	  4/9/98
	UInt uiOLType = m_pbitstrmIn -> getBits(8); // VOL_type_indication
	UInt uiOLI = m_pbitstrmIn -> getBits (1); //VOL_Is_Object_Layer_Identifier, useless flag for now
	if(uiOLI)
	{
// GMC
		m_volmd.uiVerID = m_pbitstrmIn -> getBits (4); // video_oject_layer_verid
	    // Here, is_object_layer_identifier is used for Version1/Version2
	    // identification at this moment (tentative solution).
	    // vol_type_indicator is not useless for version 2 at present.
	    // need discussion at Video Group about this issue.
//		m_pbitstrmIn -> getBits (4); // video_oject_layer_verid
		m_pbitstrmIn -> getBits (3); // video_oject_layer_priority
	}
	else{
		m_volmd.uiVerID = 1;
// ~GMC
	}
	//assert(uiOLI == 0);
	
	UInt uiAspect = m_pbitstrmIn -> getBits (4);
	if(uiAspect==15) // extended PAR
	{
		UInt iParWidth = m_pbitstrmIn -> getBits (8);
		UInt iParHeight = m_pbitstrmIn -> getBits (8);
	}

	UInt uiMark;
	UInt uiCTP = m_pbitstrmIn -> getBits (1); //VOL_Control_Parameter, useless flag for now
	if(uiCTP)
	{
		UInt uiChromaFormat = m_pbitstrmIn -> getBits (2);
		UInt uiLowDelay = m_pbitstrmIn -> getBits (1);
		UInt uiVBVParams = m_pbitstrmIn -> getBits (1);
		
		if(uiVBVParams)
		{
			UInt uiFirstHalfBitRate = m_pbitstrmIn -> getBits (15);
			uiMark = m_pbitstrmIn -> getBits (1);
			assert(uiMark==1);
			UInt uiLatterHalfBitRate = m_pbitstrmIn -> getBits (15);
			uiMark = m_pbitstrmIn -> getBits (1);
			assert(uiMark==1);
			UInt uiFirstHalfVbvBufferSize = m_pbitstrmIn -> getBits (15);
			uiMark = m_pbitstrmIn -> getBits (1);
			assert(uiMark==1);
			UInt uiLatterHalfVbvBufferSize = m_pbitstrmIn -> getBits (3);
			UInt uiFirstHalfVbvBufferOccupany = m_pbitstrmIn -> getBits (11);
			uiMark = m_pbitstrmIn -> getBits (1);
			assert(uiMark==1);
			UInt uiLatterHalfVbvBufferOccupany = m_pbitstrmIn -> getBits (15);
			uiMark = m_pbitstrmIn -> getBits (1);
			assert(uiMark==1);
		}
	}


  UInt uiAUsage = m_pbitstrmIn -> getBits (NUMBITS_VOL_SHAPE);

// MAC (SB) 1-Dec-99
  if (uiAUsage==3) { // gray scale
    if (m_volmd.uiVerID!=1) {
      m_volmd.iAlphaShapeExtension = m_pbitstrmIn -> getBits (4);
      m_volmd.iAuxCompCount =  CVideoObject::getAuxCompCount(m_volmd.iAlphaShapeExtension);
    } else {
      m_volmd.iAuxCompCount = 1;
    }
  } else
    m_volmd.iAuxCompCount = 0;
//~MAC

	uiMark = m_pbitstrmIn -> getBits (1);
	assert(uiMark==1);
	m_volmd.iClockRate = m_pbitstrmIn -> getBits (NUMBITS_TIME_RESOLUTION);
	cout << m_volmd.iClockRate << "\n";
	uiMark = m_pbitstrmIn -> getBits (1);
	assert(uiMark==1);
	Int iClockRate = m_volmd.iClockRate - 1;
	assert (iClockRate < 65536);
	if(iClockRate>0)
	{
		for (m_iNumBitsTimeIncr = 1; m_iNumBitsTimeIncr < NUMBITS_TIME_RESOLUTION; m_iNumBitsTimeIncr++)	{	
			if (iClockRate == 1)			
				break;
			iClockRate = (iClockRate >> 1);
		}
	}
	else
		m_iNumBitsTimeIncr = 0;

	Bool bFixFrameRate = m_pbitstrmIn -> getBits (1);
	//assert (bFixFrameRate == FALSE);
	if(bFixFrameRate)
	{
		UInt uiFixedVOPTimeIncrement = 0;
		if(m_iNumBitsTimeIncr!=0)
			uiFixedVOPTimeIncrement = m_pbitstrmIn -> getBits (m_iNumBitsTimeIncr);
		// not used
		//
		//
	}

	if(uiAUsage==2)  // shape-only mode
	{
//OBSS_SAIT_991015
		if(m_volmd.uiVerID == 2) {
			m_volmd.volType = (m_pbitstrmIn -> getBits (1) == 0) ? BASE_LAYER : ENHN_LAYER;
			m_volmd.iEnhnType = 0;			//OBSSFIX_BSO
			m_volmd.iHierarchyType = 0;		//OBSSFIX_BSO
			m_volmd.ihor_sampling_factor_n = 1;
			m_volmd.ihor_sampling_factor_m = 1;
			m_volmd.iver_sampling_factor_n = 1;
			m_volmd.iver_sampling_factor_m = 1;	
			m_volmd.ihor_sampling_factor_n_shape = 1;
			m_volmd.ihor_sampling_factor_m_shape = 1;
			m_volmd.iver_sampling_factor_n_shape = 1;
			m_volmd.iver_sampling_factor_m_shape = 1;	
			if (m_volmd.volType == ENHN_LAYER)	{
				m_volmd.ihor_sampling_factor_n_shape = m_pbitstrmIn->getBits (5);
				m_volmd.ihor_sampling_factor_m_shape = m_pbitstrmIn->getBits (5);
				m_volmd.iver_sampling_factor_n_shape = m_pbitstrmIn->getBits (5);
				m_volmd.iver_sampling_factor_m_shape = m_pbitstrmIn->getBits (5);
				m_volmd.ihor_sampling_factor_n = m_volmd.ihor_sampling_factor_n_shape;
				m_volmd.ihor_sampling_factor_m = m_volmd.ihor_sampling_factor_m_shape;
				m_volmd.iver_sampling_factor_n = m_volmd.iver_sampling_factor_n_shape;
				m_volmd.iver_sampling_factor_m = m_volmd.iver_sampling_factor_m_shape;	
			}
		}
//~OBSS_SAIT_991015
		UInt uiResyncMarkerDisable = m_pbitstrmIn -> getBits (1);

		// default to some values - probably not all needed
		m_volmd.bShapeOnly=TRUE;
		m_volmd.fAUsage=ONE_BIT;
		m_volmd.bAdvPredDisable = 0;
		m_volmd.fQuantizer = Q_H263;
//OBSS_SAIT_991015
		m_volmd.bSadctDisable = 1;
		m_volmd.bNewpredEnable = 0;
		m_volmd.bQuarterSample = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -