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

📄 vopmbdec.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		// dx_in_gob = ;		// dy_in_gob = ;	}	Bool bRestartDelayedQP = TRUE; // decodeMBTextureHeadOfIVOP sets this to false	uiGobNumber=0;	lastbits =  m_pbitstrmIn->get_used_bits();	while (uiGobNumber < uiNumberOfGobs) { 		if (short_video_header) {			uiGobHeaderEmpty=1;			if (uiGobNumber != 0) {				if (m_pbitstrmIn->peekBits(17)==1) {					uiGobHeaderEmpty=0;					/* UInt uiGobResyncMarker= wmay */m_pbitstrmIn -> getBits (17);					uiGobNumber=m_pbitstrmIn -> getBits(5);					/* UInt uiGobFrameId = wmay */ m_pbitstrmIn -> getBits(2);					/* UInt uiVopQuant= wmay */m_pbitstrmIn -> getBits(5); 					uiGobNumber++; 				} else {					uiGobNumber++;				}			} else {				uiGobNumber++;			}						iMBXstart=0; 			iMBXstop= m_ivolWidth/16;			iMBYstart=(uiGobNumber*(m_ivolHeight/16)/uiNumberOfGobs)-1;			iMBYstop= iMBYstart+(m_ivolHeight/16)/uiNumberOfGobs;		} else {			uiGobNumber++; 		}		for (iMBY = iMBYstart; iMBY < iMBYstop; iMBY++) { // [FDS]			PixelC* ppxlcRefMBY = ppxlcRefY;			PixelC* ppxlcRefMBU = ppxlcRefU;			PixelC* ppxlcRefMBV = ppxlcRefV;			Bool  bSptMB_NOT_HOLE= TRUE;	// Begin: modified by Hughes	  4/9/98	//		if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP) {			if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP) {	// end:  modified by Hughes	  4/9/98				bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(0, iMBY, pmbmd);		 				RestoreMBmCurrRow (iMBY, m_rgpmbmCurr);  // restore current row pointed by *m_rgpmbmCurr			}			for (iMBX = iMBXstart; iMBX < iMBXstop; iMBX++) {	            			  m_bSptMB_NOT_HOLE	 = 	bSptMB_NOT_HOLE;				  if (!m_bSptMB_NOT_HOLE ) 	// current Sprite macroblock is not a hole and should be decoded							  goto END_OF_DECODING2;				if	(checkResyncMarker())	{					decodeVideoPacketHeader(iCurrentQP);					iVideoPacketNumber++;					bRestartDelayedQP = TRUE;				}#if 0				{				uint32_t temp = m_pbitstrmIn->get_used_bits();			//printf("Macroblock %d %d %x - bits since last %d total %d\n", iMBY, iMBX, m_pbitstrmIn->peekBits(32),				       temp - lastbits, temp);			lastbits = temp;				}			if (iMBY == 3 && iMBX == 5) {			  printf("This is the breakpoint\n");			  m_pbitstrmIn->start_dump();			}#endif				pmbmd->m_iVideoPacketNumber = iVideoPacketNumber;	//mv out of if by wchen to set even when errR is off; always used in mbdec 				decodeMBTextureHeadOfIVOP (pmbmd, iCurrentQP, bRestartDelayedQP);				decodeTextureIntraMB (pmbmd, iMBX, iMBY, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV);	// INTERLACE				if ((m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))					fieldDCTtoFrameC(ppxlcRefMBY);	// ~INTERLACE	END_OF_DECODING2:				pmbmd++;				ppxlcRefMBY += MB_SIZE;				ppxlcRefMBU += BLOCK_SIZE;				ppxlcRefMBV += BLOCK_SIZE;	// Begin: modified by Hughes	  4/9/98	//			if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP)				if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP)  // get the hole status for the next MB	// end:  modified by Hughes	  4/9/98					bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(iMBX+1, iMBY, pmbmd);	 							else					bSptMB_NOT_HOLE= TRUE;			}			MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;			m_rgpmbmAbove = m_rgpmbmCurr;				// dshu: [v071] begin of modification	   1/18/98	// Begin: modified by Hughes	  4/9/98	// 		if  (m_uiSprite == 1) 			if  (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE)	// end:  modified by Hughes	  4/9/98				SaveMBmCurrRow (iMBY, m_rgpmbmCurr);		 //	  save current row pointed by *m_rgpmbmCurr 	// dshu: [v071] end of modification			m_rgpmbmCurr  = ppmbmTemp;			ppxlcRefY += m_iFrameWidthYxMBSize;			ppxlcRefU += m_iFrameWidthUVxBlkSize;			ppxlcRefV += m_iFrameWidthUVxBlkSize;	// dshu: [v071] begin of modification	   1/18/98	move these statements up	//		if  (m_uiSprite == 1)	//			SaveMBmCurrRow (iMBY, m_rgpmbmCurr);		 //	  save current row pointed by *m_rgpmbmCurr 	// dshu: [v071] end of modification		}	} // KPN Terminate while loop Gob layer [FDS]}Void CVideoObjectDecoder::decodePVOP_WithShape (){	Int iMBX, iMBY;	CoordI y = m_rctCurrVOPY.top; 	CMBMode* pmbmd = m_rgmbmd;        // Added for field based MC padding by Hyundai(1998-5-9)        CMBMode* field_pmbmd = m_rgmbmd;        // End of Hyundai(1998-5-9)	CMotionVector* pmv = m_rgmv;	CMotionVector* pmvBY = m_rgmvBY;	PixelC* ppxlcCurrQY  = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;	PixelC* ppxlcCurrQU  = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;	PixelC* ppxlcCurrQV  = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;	PixelC* ppxlcCurrQBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY;	PixelC* ppxlcCurrQA  = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY;		Int iCurrentQP  = m_vopmd.intStep;		Int iCurrentQPA = m_vopmd.intStepPAlpha;		//	Added for error resilient mode by Toshiba(1997-11-14)	Int	iVideoPacketNumber = 0; 			//	added for error resilience mode by Toshiba	m_iVPMBnum = 0;	Bool bRestartDelayedQP = TRUE;	//	End Toshiba(1997-11-14)	for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {		PixelC* ppxlcCurrQMBY  = ppxlcCurrQY;		PixelC* ppxlcCurrQMBU  = ppxlcCurrQU;		PixelC* ppxlcCurrQMBV  = ppxlcCurrQV;		PixelC* ppxlcCurrQMBBY = ppxlcCurrQBY;		PixelC* ppxlcCurrQMBA  = ppxlcCurrQA;		//	Added for error resilient mode by Toshiba(1997-11-14)		if	(iMBY != 0)	{			if	(checkResyncMarker()) {				decodeVideoPacketHeader(iCurrentQP);				iVideoPacketNumber++;				bRestartDelayedQP = TRUE;			}		}		pmbmd->m_iVideoPacketNumber = iVideoPacketNumber;		//	End Toshiba(1997-11-14)		// Modified for error resilient mode by Toshiba(1997-11-14)		ShapeMode shpmdColocatedMB;		if(m_vopmd.bShapeCodingType) {			shpmdColocatedMB = m_rgmbmdRef [				MIN (iMBY, m_iNumMBYRef-1) * m_iNumMBXRef			].m_shpmd;			decodeInterShape (m_pvopcRefQ0, pmbmd, 0, iMBY,				m_rctCurrVOPY.left, y, pmv, pmvBY,				m_ppxlcCurrMBBY, ppxlcCurrQMBBY,				shpmdColocatedMB);		}		else {			decodeIntraShape (pmbmd, 0, iMBY, m_ppxlcCurrMBBY,				ppxlcCurrQMBBY);		}		// End Toshiba(1997-11-14)		downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);		/*BBM// Added for Boundary by Hyundai(1998-5-9)		if (m_vopmd.bInterlace) initMergedMode (pmbmd);		// End of Hyundai(1998-5-9)*/		if (pmbmd->m_rgTranspStatus [0] != ALL && m_volmd.bShapeOnly==FALSE) {			/*BBM// Added for Boundary by Hyundai(1998-5-9)            if (m_vopmd.bInterlace && pmbmd->m_rgTranspStatus [0] == PARTIAL)                    isBoundaryMacroBlockMerged (pmbmd);			// End of Hyundai(1998-5-9)*/			decodeMBTextureHeadOfPVOP (pmbmd, iCurrentQP, bRestartDelayedQP);			/*BBM// Added for Boundary by Hyundai(1998-5-9)                        if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])                                swapTransparentModes (pmbmd, BBS);			// End of Hyundai(1998-5-9)*/			decodeMVWithShape (pmbmd, 0, iMBY, pmv);			if(pmbmd->m_bhas4MVForward)				padMotionVectors(pmbmd,pmv);		}		CoordI x = m_rctCurrVOPY.left;		for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE) {			pmbmd->m_bPadded = FALSE;			if (pmbmd->m_rgTranspStatus [0] != ALL && m_volmd.bShapeOnly==FALSE) {				/*BBM// Added for Boundary by Hyundai(1998-5-9)                if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])                    swapTransparentModes (pmbmd, BBM);				// End of Hyundai(1998-5-9)*/				if ((pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) && !pmbmd->m_bSkip) {					decodeTextureIntraMB (pmbmd, iMBX, iMBY, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV);// INTERLACE					//new changes					if ((pmbmd->m_rgTranspStatus [0] == NONE) && 						(m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))						fieldDCTtoFrameC(ppxlcCurrQMBY);					//end of new changes// ~INTERLACE					if (m_volmd.fAUsage == EIGHT_BIT) {						decodeMBAlphaHeadOfPVOP (pmbmd, iCurrentQP, iCurrentQPA);						decodeAlphaIntraMB (pmbmd, iMBX, iMBY, ppxlcCurrQMBA);					}				}				else {					if (!pmbmd->m_bSkip) {						decodeTextureInterMB (pmbmd);// INTERLACE					//new changes					if ((pmbmd->m_rgTranspStatus [0] == NONE) && 						(m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))						fieldDCTtoFrameI(m_ppxliErrorMBY);			//end of new changes// ~INTERLACE					}					if (m_volmd.fAUsage == EIGHT_BIT) {						decodeMBAlphaHeadOfPVOP (pmbmd, iCurrentQP, iCurrentQPA);						decodeAlphaInterMB (pmbmd, ppxlcCurrQMBA);					}				}				/*BBM// Added for Boundary by Hyundai(1998-5-9)                if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])                        mergedMacroBlockSplit (pmbmd, ppxlcCurrQMBY, ppxlcCurrQMBA);				// End of Hyundai(1998-5-9)*/			}			// decode shape, overhead, and MV for the right MB			if (iMBX != m_iNumMBX - 1) {				CMBMode* pmbmdRight = pmbmd + 1;				//	Added for error resilient mode by Toshiba(1997-11-14)				if (checkResyncMarker())	{					decodeVideoPacketHeader(iCurrentQP);					iVideoPacketNumber++;					bRestartDelayedQP = TRUE;				}				pmbmdRight->m_iVideoPacketNumber = iVideoPacketNumber;				//	End Toshiba(1997-11-14)				// Modified for error resilient mode by Toshiba(1997-11-14)				if(m_vopmd.bShapeCodingType) {					shpmdColocatedMB = m_rgmbmdRef [						MIN (MAX (0, iMBX+1), m_iNumMBXRef-1) +  						MIN (MAX (0, iMBY), m_iNumMBYRef-1) * m_iNumMBXRef					].m_shpmd;					decodeInterShape (						m_pvopcRefQ0,						pmbmdRight, 						iMBX + 1, iMBY, 						x + MB_SIZE, y, 						pmv + PVOP_MV_PER_REF_PER_MB, pmvBY + 1, 						m_ppxlcRightMBBY,						ppxlcCurrQMBBY + MB_SIZE, 						shpmdColocatedMB					);				}				else {					decodeIntraShape (						pmbmdRight, iMBX + 1, iMBY,						m_ppxlcRightMBBY,						ppxlcCurrQMBBY + MB_SIZE					);				}				// End Toshiba(1997-11-14)				downSampleBY (m_ppxlcRightMBBY, m_ppxlcRightMBBUV);				/*BBM// Added for Boundary by Hyundai(1998-5-9)				if (m_vopmd.bInterlace) initMergedMode (pmbmdRight); 				// End of Hyundai(1998-5-9)*/				if (pmbmdRight->m_rgTranspStatus [0] != ALL && m_volmd.bShapeOnly==FALSE) {					/*BBM// Added for Boundary by Hyundai(1998-5-9)	                    if (m_vopmd.bInterlace && pmbmdRight->m_rgTranspStatus [0] == PARTIAL)                            isBoundaryMacroBlockMerged (pmbmdRight, m_ppxlcRightMBBY);					// End of Hyundai(1998-5-9)*/					decodeMBTextureHeadOfPVOP (pmbmdRight, iCurrentQP, bRestartDelayedQP);					/*BBM// Added for Boundary by Hyundai(1998-5-9)                    if (m_vopmd.bInterlace && pmbmdRight->m_bMerged[0])                            swapTransparentModes (pmbmdRight, BBS);					// End of Hyundai(1998-5-9)*/					decodeMVWithShape (pmbmdRight, iMBX + 1, iMBY, pmv + PVOP_MV_PER_REF_PER_MB);					if(pmbmdRight->m_bhas4MVForward)						padMotionVectors (pmbmdRight,pmv + PVOP_MV_PER_REF_PER_MB);				}			}			if(m_volmd.bShapeOnly==FALSE) {				if (pmbmd->m_rgTranspStatus [0] != ALL) {					if (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ)	{			 			motionCompMB (							m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY (),							pmv, pmbmd, 							iMBX, iMBY, 							x, y,							pmbmd->m_bSkip, FALSE,							&m_rctRefVOPY0						);						if (!pmbmd->m_bSkip) {							CoordI iXRefUV, iYRefUV;// INTERLACE //new changes							if(pmbmd->m_bFieldMV) {								CoordI iXRefUV1, iYRefUV1;								mvLookupUV (pmbmd, pmv, iXRefUV, iYRefUV, iXRefUV1, iYRefUV1);							    motionCompFieldUV(m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0, x, y,								    iXRefUV, iYRefUV, pmbmd->m_bForwardTop);							    motionCompFieldUV(m_ppxlcPredMBU + BLOCK_SIZE, m_ppxlcPredMBV + BLOCK_SIZE,								    m_pvopcRefQ0, x, y, iXRefUV1, iYRefUV1, pmbmd->m_bForwardBottom);						    }							else {// INTERALCE //end of new changes									mvLookupUVWithShape (pmbmd, pmv, iXRefUV, iYRefUV);							motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0,								x, y, iXRefUV, iYRefUV, m_vopmd.iRoundingControl,&m_rctRefVOPY0);							}							addErrorAndPredToCurrQ (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV);						}						else {							if (m_volmd.bAdvPredDisable)								copyFromRefToCurrQ (m_pvopcRefQ0, x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0);							else								copyFromPredForYAndRefForCToCurrQ (x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0);						}						if (m_volmd.fAUsage == EIGHT_BIT							&& pmbmd->m_CODAlpha!=ALPHA_ALL255)						{			 				motionCompMB (								m_ppxlcPredMBA, m_pvopcRefQ0->pixelsA (),								pmv, pmbmd, 								iMBX, iMBY, 								x, y,								FALSE, TRUE,								&m_rctRefVOPY0							);							if(pmbmd->m_CODAlpha==ALPHA_SKIPPED)								assignAlphaPredToCurrQ (ppxlcCurrQMBA);							else								addAlphaErrorAndPredToCurrQ (ppxlcCurrQMBA);

⌨️ 快捷键说明

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