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

📄 vopsedec.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	} 	short_video_header=*p_short_video_header; 	postVO_VOLHeadInit(iDisplayWidth, iDisplayHeight, pbSpatialScalability);}void CVideoObjectDecoder::postVO_VOLHeadInit (Int iDisplayWidth, 					      Int iDisplayHeight,					      Bool *pbSpatialScalability){/* (98/03/30 added by SONY)*/	m_bLinkisBroken = FALSE;	m_bUseGOV = FALSE;/* (98/03/30 added by SONY)*/	//	Added for error resilient mode by Toshiba(1997-11-14): Moved (1998-1-16)	g_iMaxHeading = MAXHEADING_ERR;	g_iMaxMiddle = MAXMIDDLE_ERR;	g_iMaxTrailing = MAXTRAILING_ERR;	//	End Toshiba(1997-11-14)	setClipTab(); // NBIT	if(m_volmd.volType == ENHN_LAYER){ // check scalability type		if(pbSpatialScalability != NULL)			if(m_volmd.iHierarchyType == 0)				*pbSpatialScalability = TRUE;			else 					*pbSpatialScalability = FALSE;	}	if (m_volmd.fAUsage == RECTANGLE) {		if (m_volmd.volType == ENHN_LAYER &&			(m_volmd.ihor_sampling_factor_n != m_volmd.ihor_sampling_factor_m ||	     	 m_volmd.iver_sampling_factor_n != m_volmd.iver_sampling_factor_m )){			iDisplayWidth = m_ivolWidth;			iDisplayHeight= m_ivolHeight;		}		else if (iDisplayWidth == -1 && iDisplayHeight == -1) {		  iDisplayWidth = m_ivolWidth;		  iDisplayHeight = m_ivolHeight;		}		else if (iDisplayWidth != m_ivolWidth || iDisplayHeight != m_ivolHeight){			fprintf(stderr, "\nDecode aborted! This rectangular VOP stream requires display\nwidth and height to be set to %dx%d.\n",				m_ivolWidth, m_ivolHeight);			exit(1);		}	}	m_rctDisplayWindow = CRct (0, 0, iDisplayWidth, iDisplayHeight); //same as m_rctOrg? will fixe later/*	if (m_volmd.fAUsage == RECTANGLE) {		if (m_volmd.volType == ENHN_LAYER &&			(m_volmd.ihor_sampling_factor_n/m_volmd.ihor_sampling_factor_m != 1||	     	 m_volmd.iver_sampling_factor_n/m_volmd.iver_sampling_factor_m != 1)){			iDisplayWidth = m_ivolWidth;			iDisplayHeight= m_ivolHeight;			if(pbSpatialScalability!=NULL)				*pbSpatialScalability = TRUE;			fprintf(stderr,"display size %d %d \n",iDisplayWidth, iDisplayHeight);		}		else if (iDisplayWidth != m_ivolWidth || iDisplayHeight != m_ivolHeight){			fprintf(stderr, "\nDecode aborted! This rectangular VOP stream requires display\nwidth and height to be set to %dx%d.\n",				m_ivolWidth, m_ivolHeight);			exit(1);		}		else if(pbSpatialScalability!=NULL)			*pbSpatialScalability = FALSE;	}	m_rctDisplayWindow = CRct (0, 0, iDisplayWidth, iDisplayHeight); //same as m_rctOrg? will fixe later*/		if (m_uiSprite == 1) { // change iDisplay size in order to get the first sprite piece		iDisplayWidth = (Int) m_rctSpt.width;		iDisplayHeight = (Int) m_rctSpt.height ();	}	Int iMod = iDisplayWidth % MB_SIZE;	Int iDisplayWidthRound = (iMod > 0) ? iDisplayWidth + MB_SIZE - iMod : iDisplayWidth;	iMod = iDisplayHeight % MB_SIZE;	Int iDisplayHeightRound = (iMod > 0) ? iDisplayHeight + MB_SIZE - iMod : iDisplayHeight;	m_rctRefFrameY = CRct (		-EXPANDY_REF_FRAME, -EXPANDY_REF_FRAME, 		EXPANDY_REF_FRAME + iDisplayWidthRound, EXPANDY_REF_FRAME + iDisplayHeightRound	);	m_rctRefFrameUV = m_rctRefFrameY.downSampleBy2 ();	allocateVOLMembers (iDisplayWidth, iDisplayHeight);	if (m_volmd.fAUsage == RECTANGLE) {		//wchen: if sprite; set it according to the initial piece instead		m_rctCurrVOPY = (m_uiSprite == 0) ? CRct (0, 0, iDisplayWidthRound, iDisplayHeightRound) : m_rctSpt;		m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 ();		m_rctRefVOPY0 = m_rctCurrVOPY;		m_rctRefVOPY0.expand (EXPANDY_REFVOP);		m_rctRefVOPUV0 = m_rctRefVOPY0.downSampleBy2 ();				m_rctRefVOPY1 = m_rctRefVOPY0;		m_rctRefVOPUV1 = m_rctRefVOPUV0;		computeVOLConstMembers (); // these VOP members are the same for all frames	}	// buffer for shape decoding	m_pvopcRightMB = new CVOPU8YUVBA (m_volmd.fAUsage, CRct (0, 0, MB_SIZE, MB_SIZE));	m_ppxlcRightMBBY = (PixelC*) m_pvopcRightMB->pixelsBY ();	m_ppxlcRightMBBUV = (PixelC*) m_pvopcRightMB->pixelsBUV ();	// buffers for Temporal Scalabe Decoding	Added by Sharp(1998-02-10)	if (m_volmd.volType == ENHN_LAYER) {		m_pBuffP1 = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ());		m_pBuffP2 = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ());		m_pBuffB1 = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ());		m_pBuffB2 = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ());		m_pBuffE  = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ());	}	// buffers for Temporal Scalabe Decoding	End	 Sharp(1998-02-10)	m_iClockRateScale = 1; // added by Sharp (98/6/26)	// Set sprite_transmit_mode to STOP	for the duration of VOL if (fSptUsage () == 0),	// and later set to PIECE by decode_init_sprite () if (fSptUsage () == 1)	m_vopmd.SpriteXmitMode = STOP;	  }// for back/forward shape	Added by Sharp(1998-02-10)CVideoObjectDecoder::CVideoObjectDecoder (	Int iDisplayWidth, Int iDisplayHeight) : CVideoObject (){	m_pistrm = -1;	m_pbitstrmIn = NULL;	m_pentrdecSet = NULL;	m_uiVOId = 0;	Void set_modes(VOLMode* volmd, VOPMode* vopmd);	set_modes(&m_volmd, &m_vopmd); // set VOL modes, VOP modes	m_vopmd.iVopConstantAlphaValue = 255;	Int iMod = iDisplayWidth % MB_SIZE;	Int iDisplayWidthRound = (iMod > 0) ? iDisplayWidth + MB_SIZE - iMod : iDisplayWidth;	iMod = iDisplayHeight % MB_SIZE;	Int iDisplayHeightRound = (iMod > 0) ? iDisplayHeight + MB_SIZE - iMod : iDisplayHeight;	m_rctRefFrameY = CRct (		-EXPANDY_REF_FRAME, -EXPANDY_REF_FRAME,		EXPANDY_REF_FRAME + iDisplayWidthRound, EXPANDY_REF_FRAME + iDisplayHeightRound	);	m_rctRefFrameUV = m_rctRefFrameY.downSampleBy2 ();	allocateVOLMembers (iDisplayWidth, iDisplayHeight);	// buffer for shape decoding	m_pvopcRightMB = new CVOPU8YUVBA (m_volmd.fAUsage, CRct (0, 0, MB_SIZE, MB_SIZE));	m_ppxlcRightMBBY = (PixelC*) m_pvopcRightMB->pixelsBY ();	m_ppxlcRightMBBUV = (PixelC*) m_pvopcRightMB->pixelsBUV ();}// for back/forward shape	End	 Sharp(1998-02-10)Int CVideoObjectDecoder::decode (const CVOPU8YUVBA* pvopcBVOPQuant, /*strstreambuf* pistrm, */ Bool waitForI, Bool drop){#if 0	if (pistrm != NULL) {		delete (istream *)m_pistrm;		delete m_pbytestrmIn;		delete m_pbitstrmIn;		delete m_pentrdecSet;		m_pistrm = (ifstream *)new istream (pistrm);		m_pbytestrmIn = new CInByteStreamFile(*m_pistrm);		m_pbitstrmIn = new CInBitStream (m_pbytestrmIn);		m_pentrdecSet = new CEntropyDecoderSet (*m_pbitstrmIn);	}#endif	//printf("start decoding\n");	//sprite piece should not come here	assert ((m_vopmd.SpriteXmitMode == STOP) || ( m_vopmd.SpriteXmitMode == PAUSE));	if (findStartCode () == EOF)		return EOF;	Bool bCoded = decodeVOPHead (); // set the bounding box here	if (waitForI && 	    !(m_vopmd.vopPredType == IVOP)) {#ifdef DEBUG_OUTPUT	  cout << "\tFrame is not IVOP " << m_vopmd.vopPredType << "\n";	  cout.flush();#endif	  return -1;	}	if (drop && m_vopmd.vopPredType == BVOP) {	  return -1;	}#ifdef DEBUG_OUTPUT	cout << "\t" << "Time..." << m_t << " (" << m_t / (double)m_volmd.iClockRate << " sec)\n";	if(bCoded == FALSE)		cout << "\tNot coded.\n";	cout.flush ();#endif	Bool bPrevRefVopWasCoded = m_bCodedFutureRef;	if(m_vopmd.vopPredType==IVOP || m_vopmd.vopPredType==PVOP)		m_bCodedFutureRef = bCoded; // flag used by bvop prediction	if (m_vopmd.vopPredType == SPRITE)	{		decodeSpt ();		return TRUE;	}	// set time stamps for Base/Temporal-Enhc/Spatial-Enhc Layer	Modified by Sharp(1998-02-10)	if(m_volmd.volType == BASE_LAYER) {		if(m_vopmd.vopPredType==IVOP || m_vopmd.vopPredType==PVOP) {			if(bPrevRefVopWasCoded)				m_tPastRef = m_tFutureRef;			m_tFutureRef = m_t;			m_iBCount = 0;		}		// count B-VOPs		if(m_vopmd.vopPredType==BVOP)			m_iBCount++;	}	else if (pvopcBVOPQuant != NULL) {	// Spatial Scalability Enhancement Layer/* (98/03/30) modified by SONY */		if(m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0) {			if(bPrevRefVopWasCoded)				m_tPastRef = m_tFutureRef;			m_tFutureRef = m_t;			m_iBCount = 0;		} if(m_vopmd.vopPredType == PVOP && m_vopmd.iRefSelectCode == 3) {			m_tPastRef = m_t;			m_tFutureRef = m_t;			m_iBCount = 0;		}/* (98/03/30) modified by SONY */		// count B-VOPs		if(m_vopmd.vopPredType==BVOP)			m_iBCount++;	}	// set time stamps for Base/Temporal-Enhc/Spatial-Enhc Layer	End 	    Sharp(1998-02-10)	// select reference frames for Base/Temporal-Enhc/Spatial-Enhc Layer	Modified by Sharp(1998-02-10)	if(bPrevRefVopWasCoded)	{		if(m_volmd.volType == BASE_LAYER) {			updateAllRefVOPs ();            // update all reconstructed VOP's		}		else {			if (pvopcBVOPQuant == NULL)		// Temporal Scalability Enhancement Layer				updateRefVOPsEnhc ();			else {					// Spatial Scalability Enhancement Layer					updateAllRefVOPs (pvopcBVOPQuant);			}		}	}	// 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;	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		}		return FALSE;	}	if (m_volmd.fAUsage != RECTANGLE)		resetBYPlane ();		if (m_volmd.fAUsage != RECTANGLE) {		setRefStartingPointers ();		computeVOPMembers ();	}	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);	// 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();		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;	}	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)			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) ? 10 : 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)

⌨️ 快捷键说明

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