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

📄 vopsedec.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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)) {		repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ1);		repeatPadUV (m_pvopcRefQ1);		//reset by in RefQ1 so that no left-over from last frame		if (m_volmd.fAUsage != RECTANGLE)       {			if (m_volmd.fAUsage == EIGHT_BIT)				repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsA () + m_iOffsetForPadY, m_pvopcRefQ1);		}	}	// update buffers for temporal scalability	Added by Sharp(1998-02-10)	if(m_volmd.volType != BASE_LAYER)  updateBuffVOPsEnhc ();	return TRUE;}Int CVideoObjectDecoder::findStartCode(int dontloop){	// 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 || dontloop != 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;}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);	decodeVOBody();}Void CVideoObjectDecoder::decodeVOBody (){	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(){  int ver_id;	/* 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)	{	  ver_id = m_pbitstrmIn -> getBits (4); // video_oject_layer_verid		m_pbitstrmIn -> getBits (3); // video_oject_layer_priority	} else {	  ver_id = 1;	}	//assert(uiOLI == 0);		UInt uiAspect = m_pbitstrmIn -> getBits (4);	if(uiAspect==15) // extended PAR	{	  /* UInt iParWidth = wmay */ m_pbitstrmIn -> getBits (8);	  /* UInt iParHeight = wmay */ m_pbitstrmIn -> getBits (8);	}	UInt uiMark;	UInt uiCTP = m_pbitstrmIn -> getBits (1); //VOL_Control_Parameter, useless flag for now	if(uiCTP)	{	  /* UInt uiChromaFormat = wmay */ m_pbitstrmIn -> getBits (2);	  /* UInt uiLowDelay = wmay */m_pbitstrmIn -> getBits (1);		UInt uiVBVParams = m_pbitstrmIn -> getBits (1);				if(uiVBVParams)		{		  /* UInt uiFirstHalfBitRate = wmay */m_pbitstrmIn -> getBits (15);			uiMark = m_pbitstrmIn -> getBits (1);			assert(uiMark==1);			/* UInt uiLatterHalfBitRate = wmay */ m_pbitstrmIn -> getBits (15);			uiMark = m_pbitstrmIn -> getBits (1);			assert(uiMark==1);			/* UInt uiFirstHalfVbvBufferSize = wmay */m_pbitstrmIn -> getBits (15);			uiMark = m_pbitstrmIn -> getBits (1);			assert(uiMark==1);			/* UInt uiLatterHalfVbvBufferSize = wmay */m_pbitstrmIn -> getBits (3);			/* UInt uiFirstHalfVbvBufferOccupany = wmay */m_pbitstrmIn -> getBits (11);			uiMark = m_pbitstrmIn -> getBits (1);			assert(uiMark==1);			/* UInt uiLatterHalfVbvBufferOccupany = wmay */m_pbitstrmIn -> getBits (15);			uiMark = m_pbitstrmIn -> getBits (1);			assert(uiMark==1);		}	}	//assert(uiCTP == 0);	UInt uiAUsage = m_pbitstrmIn -> getBits (NUMBITS_VOL_SHAPE);	uiMark = m_pbitstrmIn -> getBits (1);	assert(uiMark==1);	m_volmd.iClockRate = m_pbitstrmIn -> getBits (NUMBITS_TIME_RESOLUTION);#ifdef DEBUG_OUTPUT	cout << m_volmd.iClockRate << "\n";#endif	uiMark = m_pbitstrmIn -> getBits (1);	assert(uiMark==1);	Int iClockRate = m_volmd.iClockRate;	assert (iClockRate >= 1 && iClockRate < 65536);	for (m_iNumBitsTimeIncr = 1; m_iNumBitsTimeIncr < NUMBITS_TIME_RESOLUTION; m_iNumBitsTimeIncr++)	{			if (iClockRate == 1)						break;		iClockRate = (iClockRate >> 1);	}	Bool bFixFrameRate = m_pbitstrmIn -> getBits (1);	//assert (bFixFrameRate == FALSE);	if(bFixFrameRate)	{	  UInt uiFixedVOPTimeIncrement = m_pbitstrmIn -> getBits (m_iNumBitsTimeIncr);	  m_volmd.iClockRate = m_volmd.iClockRate / uiFixedVOPTimeIncrement;		// not used		//		//	}	if(uiAUsage==2)  // shape-only mode	{	  /* UInt uiResyncMarkerDisable = wmay */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;		m_volmd.volType = BASE_LAYER;		m_volmd.bDeblockFilterDisable = TRUE;				m_uiSprite = 0;		m_volmd.bNot8Bit = 0;		m_volmd.bComplexityEstimationDisable = 1;		m_volmd.bDataPartitioning = 0;		m_volmd.bReversibleVlc = FALSE;		m_volmd.bDeblockFilterDisable = TRUE;		return;	}	m_volmd.bShapeOnly=FALSE;	if(uiAUsage==3)		uiAUsage=2;	m_volmd.fAUsage = (AlphaUsage) uiAUsage;	if (m_volmd.fAUsage == RECTANGLE) {		UInt uiMarker = m_pbitstrmIn -> getBits (1);		//wmay for divx assert(uiMarker==1);		m_ivolWidth = m_pbitstrmIn -> getBits (NUMBITS_VOP_WIDTH);		uiMarker  = m_pbitstrmIn -> getBits (1);		// wmay for divx assert(uiMarker==1);		m_ivolHeight = m_pbitstrmIn -> getBits (NUMBITS_VOP_HEIGHT);		uiMarker  = m_pbitstrmIn -> getBits (1);		// wmay for dixv assert(uiMarker==1);	}	m_vopmd.bInterlace = m_pbitstrmIn -> getBits (1); // interlace (was vop flag)	m_volmd.bAdvPredDisable = m_pbitstrmIn -> getBits (1);  //VOL_obmc_Disable	// decode sprite info	// wmay m_uiSprite = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_USAGE);	m_uiSprite = m_pbitstrmIn->getBits(ver_id == 1 ? 1 : 2);	if (m_uiSprite == 1) { // sprite information		Int isprite_hdim = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_HDIM);		Int iMarker = m_pbitstrmIn -> getBits (MARKER_BIT);		assert (iMarker == 1);		Int isprite_vdim = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_VDIM);		iMarker = m_pbitstrmIn -> getBits (MARKER_BIT);		assert (iMarker == 1);		Int isprite_left_edge = (m_pbitstrmIn -> getBits (1) == 0) ?		    m_pbitstrmIn->getBits (NUMBITS_SPRITE_LEFT_EDGE - 1) : ((Int)m_pbitstrmIn->getBits (NUMBITS_SPRITE_LEFT_EDGE - 1) - (1 << 12));		assert(isprite_left_edge%2 == 0);		iMarker = m_pbitstrmIn -> getBits (MARKER_BIT);		assert (iMarker == 1);		Int isprite_top_edge = (m_pbitstrmIn -> getBits (1) == 0) ?		    m_pbitstrmIn->getBits (NUMBITS_SPRITE_TOP_EDGE - 1) : ((Int)m_pbitstrmIn->getBits (NUMBITS_SPRITE_LEFT_EDGE - 1) - (1 << 12));		assert(isprite_top_edge%2 == 0);		iMarker = m_pbitstrmIn -> getBits (MARKER_BIT);		assert (iMarker == 1);		m_rctSpt.left = isprite_left_edge;		m_rctSpt.right = isprite_left_edge + isprite_hdim;		m_rctSpt.top = isprite_top_edge;		m_rctSpt.bottom = isprite_top_edge + isprite_vdim;		m_rctSpt.width = isprite_hdim;        m_rctSptPieceY = m_rctSpt; //initialization; will be overwritten by first vop header		m_iNumOfPnts = m_pbitstrmIn -> getBits (NUMBITS_NUM_SPRITE_POINTS);		m_rgstSrcQ = new CSiteD [m_iNumOfPnts];		m_rgstDstQ = new CSiteD [m_iNumOfPnts];		m_uiWarpingAccuracy = m_pbitstrmIn -> getBits (NUMBITS_WARPING_ACCURACY);		/* Bool bLightChange = wmay */m_pbitstrmIn -> getBits (1);// Begin: modified by Hughes	  4/9/98		Bool bsptMode = m_pbitstrmIn -> getBits (1);  // Low_latency_sprite_enable		if (  bsptMode)			m_sptMode = LOW_LATENCY ;		else						m_sptMode = BASIC_SPRITE ;// End: modified by Hughes	  4/9/98	}	m_volmd.bNot8Bit = (Bool) m_pbitstrmIn -> getBits(1);	if (m_volmd.bNot8Bit) {		m_volmd.uiQuantPrecision = (UInt) m_pbitstrmIn -> getBits (4);		m_volmd.nBits = (UInt) m_pbitstrmIn -> getBits (4);		assert(m_volmd.nBits>3);	} else {		m_volmd.uiQuantPrecision = 5;		m_volmd.nBits = 8;	}	if (m_volmd.fAUsage == EIGHT_BIT)	{		m_volmd.bNoGrayQuantUpdate = m_pbitstrmIn -> getBits (1);		/* UInt uiCompMethod = wmay */m_pbitstrmIn -> getBits (1);		/* UInt uiLinearComp = wmay */m_pbitstrmIn -> getBits (1);	}	m_volmd.fQuantizer = (Quantizer) m_pbitstrmIn -> getBits (1); 	if (m_volmd.fQuantizer == Q_MPEG) {		m_volmd.bLoadIntraMatrix = m_pbitstrmIn -> getBits (1);		if (m_volmd.bLoadIntraMatrix) {			UInt i = 0;			Int iElem;			do {				iElem = m_pbitstrmIn -> getBits (NUMBITS_QMATRIX);				m_volmd.rgiIntraQuantizerMatrix [grgiStandardZigzag[i]] = iElem;			} while (iElem != 0 && ++i < BLOCK_SQUARE_SIZE);			for (UInt j = i; j < BLOCK_SQUARE_SIZE; j++) {				m_volmd.rgiIntraQuantizerMatrix [grgiStandardZigzag[j]] = m_volmd.rgiIntraQuantizerMatrix [grgiStandardZigzag[i - 1]];			}		}		else {			memcpy (m_volmd.rgiIntraQuantizerMatrix, rgiDefaultIntraQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));		}		m_volmd.bLoadInterMatrix = m_pbitstrmIn -> getBits (1);		if (m_volmd.bLoadInterMatrix) {			UInt i = 0;			Int iElem;			do {				iElem = m_pbitstrmIn -> getBits (NUMBITS_QMATRIX);				m_volmd.rgiInterQuantizerMatrix [grgiStandardZigzag[i]] = iElem;			} while (iElem != 0 && ++i < BLOCK_SQUARE_SIZE);			for (UInt j = i; j < BLOCK_SQUARE_SIZE; j++) {				m_volmd.rgiInterQuantizerMatrix [grgiStandardZigzag[j]] = m_volmd.rgiInterQuantizerMatrix [grgiStandardZigzag[i - 1]];			}		}		else {			memcpy (m_volmd.rgiInterQuantizerMatrix, rgiDefaultInterQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));		}		if (m_volmd.fAUsage == EIGHT_BIT)	{			m_volmd.bLoadIntraMatrixAlpha = m_pbitstrmIn -> getBits (1);			if (m_volmd.bLoadIntraMatrixAlpha) {				for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++)	{					Int iElem = m_pbitstrmIn -> getBits (NUMBITS_QMATRIX);					if (iElem != 0)						m_volmd.rgiIntraQuantizerMatrixAlpha [grgiStandardZigzag[i]] = iElem;					else						m_volmd.rgiIntraQuantizerMatrixAlpha [i] = m_volmd.rgiIntraQuantizerMatrixAlpha [grgiStandardZigzag[i - 1]];				}			}			else {#ifdef _FOR_GSSP_				memcpy (m_volmd.rgiIntraQuantizerMatrixAlpha, rgiDefaultIntraQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));#else				for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++)					m_volmd.rgiIntraQuantizerMatrixAlpha [i] = 16;#endif			}			m_volmd.bLoadInterMatrixAlpha = m_pbitstrmIn -> getBits (1);			if (m_volmd.bLoadInterMatrixAlpha) {				for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++)	{					Int iElem = m_pbitstrmIn -> getBits (NUMBITS_QMATRIX);					if (iElem != 0)						m_volmd.rgiInterQuantizerMatrixAlpha [grgiStandardZigzag[i]] = iElem;					else						m_volmd.rgiInterQuantizerMatrixAlpha [i] = m_volmd.rgiInterQuantizerMatrixAlpha [grgiStandardZigzag[i - 1]];				}			}			else {#ifdef _FOR_GSSP_				memcpy (m_volmd.rgiInterQuantizerMatrixAlpha, rgiDefaultInterQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));#else				for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++)					m_volmd.rgiInterQuantizerMatrixAlpha [i] = 16;#endif			}		}	}	if (ver_id != 1) // wmay	  m_pbitstrmIn->getBits(1); // wmay vol quarter pixel		// Bool bComplxityEsti = m_pbitstrmIn->getBits (1); //Complexity estimation; don't know how to use it// START: Complexity Estimation syntax support - Marc Mongenet (EPFL) - 15 Jun 1998	m_volmd.bComplexityEstimationDisable = m_pbitstrmIn -> getBits (1);	if (! m_volmd.bComplexityEstimationDisable) {		m_volmd.iEstimationMethod = m_pbitstrmIn -> getBits (2);		if (m_volmd.iEstimationMethod != 0) {			fprintf (stderr, "ERROR: Unknown complexity estimation method number %d.\n", m_volmd.iEstimationMethod);			exit (1);		}		m_volmd.bShapeComplexityEstimationDisable = m_pbitstrmIn -> getBits (1);		if (! m_volmd.bShapeComplexityEstimationDisable) {			m_volmd.bOpaque = m_pbitstrmIn -> getBits (1);			m_volmd.bTransparent = m_pbitstrmIn -> getBits (1);			m_volmd.bIntraCAE = m_pbitstrmIn -> getBits (1);			m_volmd.bInterCAE = m_pbitstrmIn -> getBits (1);			m_volmd.bNoUpdate = m_pbitstrmIn -> getBits (1);			m_volmd.bUpsampling = m_pbitstrmIn -> getBits (1);			if (!(m_volmd.bOpaque ||				  m_volmd.bTransparent ||				  m_volmd.bIntraCAE ||				  m_volmd.bInterCAE ||				  m_volmd.bNoUpdate ||				  m_volmd.bUpsampling)) {				fatal_error("Shape complexity estimation is enabled,\nbut no correponding flag is enabled.");			}		}		else			m_volmd.bOpaque =			m_volmd.bTransparent =			m_volmd.bIntraCAE =			m_volmd.bInterCAE =			m_volmd.bNoUpdate =			m_volmd.bUpsampling = false;		m_volmd.bTextureComplexityEstimationSet1Disable = m_pbitstrmIn -> getBits (1);

⌨️ 快捷键说明

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