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

📄 vopseenc.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		exit(1);#endif // __TRACE_AND_STATS_		if (m_vopmd.vopPredType == IVOP) { // !!!! check whether CRct has been expanded			Double dMad = 				(m_pvopcOrig->getPlane (Y_PLANE)->sumAbs (m_rctCurrVOPY)) / 				(Double) (m_rctCurrVOPY.area ());			m_statRC.reset (				m_nFirstFrame, 				m_nLastFrame, 				m_volmd.iTemporalRate, 				m_iBufferSize, 				dMad, 				m_statsVOL.nBitsTotal,				m_volmd.dFrameHz			);		}		else if (m_vopmd.vopPredType == PVOP)			m_statRC.updateRCModel (m_statsVOP.total (), m_statsVOP.head ());	}	// store the direct mode data (by swaping pointers)	if (m_vopmd.vopPredType != BVOP) {		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;		//wchen: should not only for pvop		//if (m_vopmd.vopPredType == PVOP) 		m_rgmvBackward = m_rgmv + BVOP_MV_PER_REF_PER_MB * m_iSessNumMB;		#if 0 // Debugging .. use the same anchor VOPs as reference implementation		static FILE *pfRefPicInputFile = NULL;		if (pfRefPicInputFile == NULL) {			pfRefPicInputFile = fopen("ref.yuv", "rb");			assert(pfRefPicInputFile != NULL);		}		Int iLeadingPixels = m_t * m_rctPrevNoExpandY.area ();		fseek (pfRefPicInputFile, iLeadingPixels + iLeadingPixels / 2, SEEK_SET);	//4:2:0		static Int iYDataHeight = m_rctPrevNoExpandY.height ();		static Int iUVDataHeight = m_rctPrevNoExpandY.height () / 2;		static Int iYFrmWidth = m_pvopcRefQ1->whereY ().width;		static Int iUvFrmWidth = m_pvopcRefQ1->whereUV ().width;		static Int nSkipYPixel = iYFrmWidth * EXPANDY_REF_FRAME + EXPANDY_REF_FRAME;		static Int nSkipUvPixel = iUvFrmWidth * EXPANDUV_REF_FRAME + EXPANDUV_REF_FRAME;		PixelC* ppxlcY = (PixelC*) m_pvopcRefQ1->pixelsY () + nSkipYPixel;		PixelC* ppxlcU = (PixelC*) m_pvopcRefQ1->pixelsU () + nSkipUvPixel;		PixelC* ppxlcV = (PixelC*) m_pvopcRefQ1->pixelsV () + nSkipUvPixel;		for (CoordI y = 0; y < iYDataHeight; y++) {			Int size = (Int) fread (ppxlcY, sizeof (U8), m_rctPrevNoExpandY.width, pfRefPicInputFile);			if (size == 0)				fprintf (stderr, "Unexpected end of file\n");			ppxlcY += iYFrmWidth;		}		for (y = 0; y < iUVDataHeight; y++) {			Int size = (Int) fread (ppxlcU, sizeof (U8), m_rctPrevNoExpandY.width / 2, pfRefPicInputFile);			if (size == 0)				fprintf (stderr, "Unexpected end of file\n");			ppxlcU += iUvFrmWidth;		}		for (y = 0; y < iUVDataHeight; y++) {			Int size = (Int) fread (ppxlcV, sizeof (U8), m_rctPrevNoExpandY.width / 2, pfRefPicInputFile);			if (size == 0)				fprintf (stderr, "Unexpected end of file\n");			ppxlcV += iUvFrmWidth;		}#endif	}		if (m_volmd.fAUsage != RECTANGLE) {		if (m_vopmd.vopPredType != BVOP) {			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);		}// begin:  added by by Sharp (98/2/10)		if ( bTemporalScalability && m_vopmd.vopPredType == BVOP ) {			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);		}// end: added by Sharp (98/2/10)		//this is ac/dc pred stuff; clean the memory		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;	}// begin: added by Sharp (98/2/10)	if ( bTemporalScalability && m_volmd.fAUsage == RECTANGLE ) {		m_iBVOPOffsetForPadY = m_iOffsetForPadY;		m_iBVOPOffsetForPadUV = m_iOffsetForPadUV;		m_rctBVOPPrevNoExpandY = m_rctPrevNoExpandY;		m_rctBVOPPrevNoExpandUV = m_rctPrevNoExpandUV;		m_rctBVOPRefVOPY1 = m_rctRefVOPY1;		m_rctBVOPRefVOPUV1 = m_rctRefVOPUV1;	}// end: added by Sharp (98/2/10)		// __LOW_LATENCY_SPRITE_	if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP)		return;    if (m_vopmd.vopPredType != BVOP || m_volmd.volType == ENHN_LAYER)	{		repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ1);		repeatPadUV (m_pvopcRefQ1);		if (m_volmd.fAUsage != RECTANGLE)       {			if (m_volmd.fAUsage == EIGHT_BIT)				repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsA () + m_iOffsetForPadY, m_pvopcRefQ1);		}	}	if( m_volmd.volType == ENHN_LAYER && 		m_vopmd.vopPredType == BVOP &&		m_vopmd.iRefSelectCode == 0){		repeatPadYOrA ((PixelC*) m_pvopcCurrQ->pixelsY () + m_iOffsetForPadY, m_pvopcCurrQ);		repeatPadUV (m_pvopcCurrQ);	}	if (m_volmd.bOriginalForME) {		if (m_vopmd.vopPredType == IVOP || m_vopmd.vopPredType == PVOP || 		    (m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0))			updateAllOrigRefVOPs (); // update all original reference (MotionEsti) VOP's	}}Void CVideoObjectEncoder::codeVOHead (){	m_pbitstrmOut -> putBits (START_CODE_PREFIX, NUMBITS_START_CODE_PREFIX, "VOSH_Start_Code");	m_pbitstrmOut -> putBits (SESSION_START_CODE, 8, "VOSH_Start_Code");	// Just signal Advanced Simple Profile @ L2 for now	m_pbitstrmOut -> putBits (0xF3, 8, "VOSH_Start_Code");	m_pbitstrmOut -> putBits (START_CODE_PREFIX, NUMBITS_START_CODE_PREFIX, "VO_Start_Code");	m_pbitstrmOut -> putBits (VISUAL_OBJ_START_CODE, 8, "Visual_Obj_Start_Code");	m_pbitstrmOut -> putBits (0x09, 8, "Visual_Object_Id");	m_pbitstrmOut -> putBits (START_CODE_PREFIX, NUMBITS_START_CODE_PREFIX, "VO_Start_Code");	m_pbitstrmOut -> putBits (VO_START_CODE, NUMBITS_VO_START_CODE, "VO_Start_Code");		//plus 3 bits	m_pbitstrmOut -> putBits (m_uiVOId, NUMBITS_VO_ID, "VO_Id");	UInt uiNumBits = NUMBITS_START_CODE_PREFIX + NUMBITS_VO_START_CODE + NUMBITS_VO_ID;;	m_statsVOL.nBitsHead += uiNumBits;	cout << "VO Overhead" << "\t\t" << uiNumBits << "\n\n";	cout.flush ();}Void CVideoObjectEncoder::codeVOLHead (Int iSessionWidth, Int iSessionHeight){	m_pbitstrmOut -> putBits (START_CODE_PREFIX, NUMBITS_START_CODE_PREFIX, "VOL_Start_Code");	m_pbitstrmOut -> putBits (VOL_START_CODE, NUMBITS_VOL_START_CODE, "VOL_Start_Code");		//plus 4 bits	m_pbitstrmOut -> putBits ((Int) (m_volmd.volType == ENHN_LAYER), NUMBITS_VOL_ID, "VOL_Id"); // by katata	m_statsVOL.nBitsHead+=NUMBITS_START_CODE_PREFIX+NUMBITS_VOL_START_CODE+NUMBITS_VOL_ID;// Begin: modified by Hughes	  4/9/98	  per clause 2.1.7. in N2171 document	m_pbitstrmOut -> putBits ((Int) 0, 1, "VOL_Random_Access");		//isn't this a system level flg?	m_statsVOL.nBitsHead++;// End: modified by Hughes	  4/9/98	m_pbitstrmOut -> putBits ((Int) 4, 8, "VOL_Type_Indicator"); // Set to indicate MAIN profile.	m_statsVOL.nBitsHead+=8;	m_pbitstrmOut -> putBits ((Int) 0, 1, "VOL_Is_Object_Layer_Identifier"); //useless flag for now	m_statsVOL.nBitsHead++;	m_pbitstrmOut -> putBits ((Int) 1, 4, "aspect_ratio_info"); // square pix	m_statsVOL.nBitsHead+=4;		m_pbitstrmOut -> putBits (m_volmd.uiVolControlParameters, 1, "VOL_Control_Parameters"); //useless flag for now	m_statsVOL.nBitsHead++;		if(m_volmd.uiVolControlParameters)	{		m_pbitstrmOut -> putBits (m_volmd.uiChromaFormat, 2, "Chroma_Format");		m_pbitstrmOut -> putBits (m_volmd.uiLowDelay, 1, "Low_Delay");		m_pbitstrmOut -> putBits (m_volmd.uiVBVParams, 1, "VBV_Params");		m_statsVOL.nBitsHead += 2 + 1 + 1;		if(m_volmd.uiVBVParams)		{			UInt uiFirstHalfBitRate = (m_volmd.uiBitRate >> 15);			UInt uiLatterHalfBitRate = (m_volmd.uiBitRate & 0x7fff);			m_pbitstrmOut -> putBits (uiFirstHalfBitRate, 15, "FirstHalf_BitRate");			m_pbitstrmOut -> putBits (1, 1, "Marker");			m_pbitstrmOut -> putBits (uiLatterHalfBitRate, 15, "LatterHalf_BitRate");			m_pbitstrmOut -> putBits (1, 1, "Marker");			UInt uiFirstHalfVbvBufferSize = (m_volmd.uiVbvBufferSize >> 3);			UInt uiLatterHalfVbvBufferSize = (m_volmd.uiVbvBufferSize & 7);			m_pbitstrmOut -> putBits (uiFirstHalfVbvBufferSize, 15, "FirstHalf_VbvBufferSize");			m_pbitstrmOut -> putBits (1, 1, "Marker");			m_pbitstrmOut -> putBits (uiLatterHalfVbvBufferSize, 3, "LatterHalf_VbvBufferSize");						UInt uiFirstHalfVbvBufferOccupany = (m_volmd.uiVbvBufferOccupany >> 15);			UInt uiLatterHalfVbvBufferOccupany = (m_volmd.uiVbvBufferOccupany & 0x7fff);			m_pbitstrmOut -> putBits (uiFirstHalfVbvBufferOccupany, 11, "FirstHalf_VbvBufferOccupany");			m_pbitstrmOut -> putBits (1, 1, "Marker");			m_pbitstrmOut -> putBits (uiLatterHalfVbvBufferOccupany, 15, "LatterHalf_VbvBufferOccupany");			m_pbitstrmOut -> putBits (1, 1, "Marker");			m_statsVOL.nBitsHead += 15 + 15 + 15 + 3 + 11 + 15;			m_statsVOL.nBitsStuffing += 5;		}	}	if(m_volmd.bShapeOnly==TRUE)	{		m_pbitstrmOut -> putBits ((Int) 2, NUMBITS_VOL_SHAPE, "VOL_Shape_Type");		m_pbitstrmOut -> putBits (1, 1, "Marker");		m_pbitstrmOut -> putBits (m_volmd.iClockRate, NUMBITS_TIME_RESOLUTION, "VOL_Time_Increment_Resolution"); 		m_pbitstrmOut -> putBits (1, 1, "Marker");		m_pbitstrmOut -> putBits (0, 1, "VOL_Fixed_Vop_Rate");		m_pbitstrmOut -> putBits (0, 1, "VOL_resync_marker_disable");		m_statsVOL.nBitsHead += NUMBITS_VOL_SHAPE + NUMBITS_TIME_RESOLUTION + 2;		m_statsVOL.nBitsStuffing +=2;		cout << "VOL Overhead" << "\t\t" << m_statsVOL.nBitsHead << "\n\n";		cout.flush ();		return;	}	else	{		Int iAUsage = (Int)m_volmd.fAUsage;		if(iAUsage==2) // CD: 0 = rect, 1 = binary, 2 = shape only, 3 = grey alpha			iAUsage = 3;		m_pbitstrmOut -> putBits (iAUsage, NUMBITS_VOL_SHAPE, "VOL_Shape_Type");		m_pbitstrmOut -> putBits (1, 1, "Marker");		m_pbitstrmOut -> putBits (m_volmd.iClockRate, NUMBITS_TIME_RESOLUTION, "VOL_Time_Increment_Resolution"); 		m_pbitstrmOut -> putBits (1, 1, "Marker");		m_pbitstrmOut -> putBits (0, 1, "VOL_Fixed_Vop_Rate");		m_statsVOL.nBitsHead += NUMBITS_VOL_SHAPE + NUMBITS_TIME_RESOLUTION + 1;		if (m_volmd.fAUsage == RECTANGLE) {			m_pbitstrmOut -> putBits (MARKER_BIT, 1, "Marker_Bit");			m_statsVOL.nBitsStuffing ++;			m_pbitstrmOut -> putBits (iSessionWidth, NUMBITS_VOP_WIDTH, "VOL_Width"); 			m_pbitstrmOut -> putBits (MARKER_BIT, 1, "Marker_Bit");			m_statsVOL.nBitsStuffing ++;			m_pbitstrmOut -> putBits (iSessionHeight, NUMBITS_VOP_HEIGHT, "VOL_Height"); 			m_pbitstrmOut -> putBits (MARKER_BIT, 1, "Marker_Bit");			m_statsVOL.nBitsStuffing ++;			m_statsVOL.nBitsHead += NUMBITS_VOP_WIDTH + NUMBITS_VOP_HEIGHT;		}	}	m_pbitstrmOut -> putBits (m_vopmd.bInterlace, (UInt) 1, "VOL_interlace");	m_statsVOL.nBitsHead++;	m_pbitstrmOut -> putBits (m_volmd.bAdvPredDisable, (UInt) 1, "VOL_OBMC_Disable");	m_statsVOL.nBitsHead++;	// code sprite info	m_pbitstrmOut -> putBits (m_uiSprite, NUMBITS_SPRITE_USAGE, "VOL_Sprite_Usage");			m_statsVOL.nBitsHead += NUMBITS_SPRITE_USAGE;	if (m_uiSprite == 1) {		m_pbitstrmOut -> putBits (m_rctSpt.width, NUMBITS_SPRITE_HDIM, "SPRT_hdim");		m_statsVOL.nBitsHead += NUMBITS_SPRITE_HDIM; 		m_pbitstrmOut -> putBits (MARKER_BIT, 1, "Marker_Bit");		m_statsVOL.nBitsStuffing ++;		m_pbitstrmOut -> putBits (m_rctSpt.height (), NUMBITS_SPRITE_VDIM, "SPRT_vdim");		m_statsVOL.nBitsHead += NUMBITS_SPRITE_VDIM;		m_pbitstrmOut -> putBits (MARKER_BIT, 1, "Marker_Bit");		m_statsVOL.nBitsStuffing ++;		if (m_rctSpt.left >= 0) {			m_pbitstrmOut -> putBits (m_rctSpt.left, NUMBITS_SPRITE_LEFT_EDGE, "SPRT_Left_Edge");		} else {			m_pbitstrmOut -> putBits (m_rctSpt.left & 0x00001FFFF, NUMBITS_SPRITE_LEFT_EDGE, "SPRT_Left_Edge");		}		m_statsVOL.nBitsHead += NUMBITS_SPRITE_LEFT_EDGE;		m_pbitstrmOut -> putBits (MARKER_BIT, 1, "Marker_Bit");		m_statsVOL.nBitsStuffing += 1;		if (m_rctSpt.top >= 0) {			m_pbitstrmOut -> putBits (m_rctSpt.top, NUMBITS_SPRITE_TOP_EDGE, "SPRT_Top_Edge");		} else {			m_pbitstrmOut -> putBits (m_rctSpt.top & 0x00001FFFF, NUMBITS_SPRITE_TOP_EDGE, "SPRT_Top_Edge");		}		m_statsVOL.nBitsHead += NUMBITS_SPRITE_TOP_EDGE; 		m_pbitstrmOut -> putBits (MARKER_BIT, 1, "Marker_Bit");		m_statsVOL.nBitsStuffing += 1;		m_pbitstrmOut -> putBits (m_iNumOfPnts, NUMBITS_NUM_SPRITE_POINTS, "SPRT_Num_Pnt");		m_statsVOL.nBitsHead += NUMBITS_NUM_SPRITE_POINTS;		m_pbitstrmOut -> putBits (m_uiWarpingAccuracy, NUMBITS_WARPING_ACCURACY, "SPRT_Warping_Accuracy");		m_statsVOL.nBitsHead += NUMBITS_WARPING_ACCURACY;		Bool bLightChange = 0;		m_pbitstrmOut -> putBits (bLightChange, 1, "SPRT_Brightness_Change");		m_statsVOL.nBitsHead++;// Begin: modified by Hughes	  4/9/98		if (m_sptMode == BASIC_SPRITE)			m_pbitstrmOut -> putBits (FALSE, 1, "Low_latency_sprite_enable");		else			m_pbitstrmOut -> putBits (TRUE, 1, "Low_latency_sprite_enable");		m_statsVOL.nBitsHead++;// End: modified by Hughes	  4/9/98	}	// NBIT	m_pbitstrmOut -> putBits ((Int) m_volmd.bNot8Bit, 1, "VOL_NOT_8_BIT_VIDEO");	m_statsVOL.nBitsHead++;	if (m_volmd.bNot8Bit) {		m_pbitstrmOut->putBits ((Int) m_volmd.uiQuantPrecision, 4, "QUANT_PRECISION");		m_pbitstrmOut->putBits ((Int) m_volmd.nBits, 4, "BITS_PER_PIXEL");		m_statsVOL.nBitsHead+=8;	}	if (m_volmd.fAUsage == EIGHT_BIT)	{		m_pbitstrmOut -> putBits (m_volmd.bNoGrayQuantUpdate, 1, "VOL_Disable_Gray_Q_Update");		m_pbitstrmOut -> putBits (0, 1, "Composition_Method");		m_pbitstrmOut -> putBits (1, 1, "Linear_Composition");		m_statsVOL.nBitsHead+=3;	}	m_pbitstrmOut -> putBits ((Int) m_volmd.fQuantizer, 1, "VOL_Quant_Type"); 	m_statsVOL.nBitsHead++;	if (m_volmd.fQuantizer == Q_MPEG) {		m_pbitstrmOut -> putBits (m_volmd.bLoadIntraMatrix, 1, "VOL_Load_Q_Matrix (intra)");		m_statsVOL.nBitsHead++;

⌨️ 快捷键说明

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