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

📄 sys_decoder_vopsedec.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//~OBSS_SAIT_991015		}	}//OBSS_SAIT_991015	else if(m_volmd.volType == ENHN_LAYER && m_volmd.bSpatialScalability && pvopcBVOPQuant != NULL)	// Spatial Scalability Enhancement Layer		updateAllRefVOPs (pvopcBVOPQuant);//~OBSS_SAIT_991015	// select reference frames for Base/Temporal-Enhc/Spatial-Enhc Layer	End	    Sharp(1998-02-10)	switch(m_vopmd.vopPredType)	{	case IVOP:#ifdef DEBUG_OUTPUT		cout << "\tIVOP";#endif/*Added by SONY (98/03/30)*/		if(m_bLinkisBroken == TRUE && m_bUseGOV == TRUE)        m_bLinkisBroken = FALSE;/*Added by SONY (98/03/30) END*/		break;	case PVOP:#ifdef DEBUG_OUTPUT		cout << "\tPVOP (reference: t=" << m_tPastRef <<")";#endif		break;// GMC	case SPRITE:#ifdef DEBUG_OUTPUT		cout << "\tSVOP(GMC) (reference: t=" << m_tPastRef <<")";#endif		break;// ~GMC	case BVOP:#ifdef DEBUG_OUTPUT		cout << "\tBVOP (past ref: t=" << m_tPastRef			<< ", future ref: t=" << m_tFutureRef <<")";#endif		break;	default:		break;	}#ifdef DEBUG_OUTPUT	cout << "\n";	cout.flush ();#endif/* 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( int dont_loop ){	// 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 || dont_loop != 0)				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;}Int CVideoObjectDecoder::decodeVSHead (){	UInt uiSC = m_pbitstrmIn->getBits (NUMBITS_START_CODE_SUFFIX);	if (uiSC != VSS_START_CODE)		return 1;	// visual session header	/*UInt uiProfile = */m_pbitstrmIn->getBits (NUMBITS_VSS_PROFILE);	if (findStartCode())		return 1;	uiSC = m_pbitstrmIn->getBits (NUMBITS_START_CODE_SUFFIX);	if (uiSC != VSO_START_CODE)		return 1;	// visual object header	UInt uiIsVisualObjectIdent = m_pbitstrmIn->getBits (1);	if (uiIsVisualObjectIdent) {		UInt uiVSOVerID = m_pbitstrmIn->getBits (NUMBITS_VSO_VERID);		if (uiVSOVerID != VSO_VERID)			return 1;		/* UInt uiVSOPriority = */m_pbitstrmIn->getBits (NUMBITS_VSO_PRIORITY);	}	UInt uiVSOType = m_pbitstrmIn->getBits (NUMBITS_VSO_TYPE);	if (uiVSOType != VSO_TYPE)		return 1;	UInt uiVideoSignalType = m_pbitstrmIn->getBits (1);	if (uiVideoSignalType) {	  /*UInt uiFormat = */m_pbitstrmIn->getBits (3);	  /*UInt uiRange = */ m_pbitstrmIn->getBits (1);		UInt uiColor = m_pbitstrmIn->getBits (1);		if (uiColor) {		  /*UInt uiPrimaries = */m_pbitstrmIn->getBits (8);		  /* UInt uiCharacter = */m_pbitstrmIn->getBits (8);		  /*UInt uiMatrix = */m_pbitstrmIn->getBits (8);		}	}	if (findStartCode())		return 1;		return 0;}Void CVideoObjectDecoder::decodeVOHead (){	findStartCode(); 	if( m_pbitstrmIn->peekBits(NUMBITS_START_CODE_SUFFIX)==VSS_START_CODE){		if(decodeVSHead())			exit(fprintf(stderr,"Failed to decoder visual sequence headers\n")); 	} 	//	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);	decodeVOLBody();}Void CVideoObjectDecoder::decodeVOLBody(){   /* UInt uiVOLId =  wmay */ m_pbitstrmIn -> getBits (NUMBITS_VOL_ID);// Begin: modified by Hughes	  4/9/98	  per clause 2.1.7. in N2171 document   /* Bool bRandom = wmay */  m_pbitstrmIn->getBits (1); //VOL_Random_Access// End: modified by Hughes	  4/9/98   /* UInt uiOLType = wmay */ 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);		m_ivolAspectRatio = m_pbitstrmIn -> getBits (4);	if(m_ivolAspectRatio==15) // extended PAR	{	  m_ivolAspectWidth = m_pbitstrmIn -> getBits (8);	  m_ivolAspectHeight = 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);

⌨️ 快捷键说明

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