mbdataaccess.cpp

来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 2,199 行 · 第 1/5 页

CPP
2,199
字号
	{
		disparity.setVer( dis.getVer() + Short(uiMbY));						
	}
	else if (uiMbY + Int(dis.getVer()) > Int(uiMbInCol)-2) //JVT-Z021
	{
		disparity.setVer(Short(uiMbInCol)-2); //JVT-Z021			
	}
	else
	{
		disparity.setVer(0);
	}
		 
	return Err::m_nOK;
}

ErrVal
MbDataAccess::xReadMbInfoFile ( FILE *MvRecon, class MBMotion* rMotionInfo, Mv disparity)  
{
	Int ac, iViewMode;
	char s, sx, sy;
	Int ix,iy;

	fread(&sx, sizeof(char),1, MvRecon);
	fread(&ix, sizeof(Int), 1, MvRecon);
	fread(&sy, sizeof(char),1, MvRecon);
	fread(&iy, sizeof(Int), 1, MvRecon);		
	if (sx!='F' || ix!=disparity.getHor() || sy!='F' || iy!=disparity.getVer() )	{ Err::m_nERR; }
		 
	fread(&s, sizeof(char),1, MvRecon);
	if (s!='F')	{ Err::m_nERR; }			
	fread(&iViewMode, sizeof(Int),1, MvRecon);
	rMotionInfo->m_iViewMode = MbMode(iViewMode);

	fread(&s, sizeof(char),1, MvRecon);
	if (s!='F')	{ Err::m_nERR; }
	fread(&rMotionInfo->m_uiFwdBwd, sizeof(UShort),1, MvRecon);

	for (ac=0; ac<4; ac++)
	{
		fread(&s, sizeof(char),1, MvRecon);
		if (s!='F')	 { Err::m_nERR; }		   		 
		fread(&rMotionInfo->m_iBlkMode[ac], sizeof(Int),1, MvRecon);	
	} 

	for (ac=0; ac<4; ac++)
	{
		fread(&s, sizeof(char),1, MvRecon);
		if (s!='F')	{ Err::m_nERR; }
		fread(&rMotionInfo->m_iRefMultiViewL0[ac], sizeof(Int),1, MvRecon);
	}
		  
	for (ac=0; ac<16; ac++)
	{
		fread(&s, sizeof(char),1, MvRecon);
		if (s!='F')	{ Err::m_nERR; }
		fread(&rMotionInfo->m_iMvL0Hor[ac], sizeof(Int),1, MvRecon);

		fread(&s, sizeof(char),1, MvRecon);
		if (s!='F') { Err::m_nERR; }
		fread(&rMotionInfo->m_iMvL0Ver[ac], sizeof(Int),1, MvRecon);			
	}
	 
	for (ac=0; ac<4; ac++)
	{
		fread(&s, sizeof(char),1, MvRecon);
		if (s!='B' )  { Err::m_nERR; }
		fread(&rMotionInfo->m_iRefMultiViewL1[ac], sizeof(Int),1, MvRecon);
	}
	for (ac=0; ac<16; ac++)
	{
		fread(&s, sizeof(char),1, MvRecon);
		if (s!='B' )  { Err::m_nERR; }
		fread(&rMotionInfo->m_iMvL1Hor[ac], sizeof(Int),1, MvRecon);				 	 

		fread(&s, sizeof(char),1, MvRecon);
		if (s!='B') { Err::m_nERR; }
		fread(&rMotionInfo->m_iMvL1Ver[ac], sizeof(Int),1, MvRecon);			
	}
	return Err::m_nOK;
}

ErrVal  
MbDataAccess::xSaveNeighborMotion(MbDataAccess&  rcMbDataAccess, MBMotion* FDView )  
{
	FDView->m_iViewMode = rcMbDataAccess.getMbData().getMbMode();
	FDView->m_uiFwdBwd = rcMbDataAccess.getMbData().getFwdBwd(); 
	FDView->m_iBlkMode[0] = rcMbDataAccess.getMbData().getBlkMode(B_8x8_0); 
	FDView->m_iBlkMode[1] = rcMbDataAccess.getMbData().getBlkMode(B_8x8_1);
	FDView->m_iBlkMode[2] = rcMbDataAccess.getMbData().getBlkMode(B_8x8_2);
	FDView->m_iBlkMode[3] = rcMbDataAccess.getMbData().getBlkMode(B_8x8_3);

	Int ac;
	for (ac=0; ac<4; ac++)
	{
		FDView->m_iRefMultiViewL0[ac] = rcMbDataAccess.getMbData().getMbMotionData(LIST_0).m_ascRefIdx[ac]; 
		FDView->m_iRefMultiViewL1[ac] = rcMbDataAccess.getMbData().getMbMotionData(LIST_1).m_ascRefIdx[ac]; 
	}
		
	for (ac=0; ac<16; ac++)
	{
		FDView->m_iMvL0Hor[ac] = rcMbDataAccess.getMbData().getMbMotionData(LIST_0).m_acMv[ac].getHor();
		FDView->m_iMvL0Ver[ac] = rcMbDataAccess.getMbData().getMbMotionData(LIST_0).m_acMv[ac].getVer();
		FDView->m_iMvL1Hor[ac] = rcMbDataAccess.getMbData().getMbMotionData(LIST_1).m_acMv[ac].getHor();
		FDView->m_iMvL1Ver[ac] = rcMbDataAccess.getMbData().getMbMotionData(LIST_1).m_acMv[ac].getVer();
	}
	return Err::m_nOK;
}

ErrVal
MbDataAccess::xWriteMbInfoFile (MbDataAccess& rcMbDataAccess, RefFrameList* rcList0, RefFrameList* rcList1)							
{
	char f_char;
	Int f_iNum;
	UShort f_iFwdBwd;
	
	f_char ='F';	
	f_iNum = rcMbDataAccess.getMbX();
	fwrite(&f_char,sizeof(char), 1, fMv);
	fwrite(&f_iNum, sizeof(Int), 1, fMv);
	
	f_char ='F';	
	f_iNum = rcMbDataAccess.getMbY();
	fwrite(&f_char,sizeof(char), 1, fMv);
	fwrite(&f_iNum, sizeof(Int), 1, fMv);
	
	f_char ='F';		
	f_iNum = rcMbDataAccess.getMbData().getMbMode();
	fwrite(&f_char,sizeof(char), 1, fMv);
	fwrite(&f_iNum, sizeof(Int), 1, fMv);
	
	f_char ='F';	
	f_iFwdBwd = rcMbDataAccess.getMbData().getFwdBwd();
	fwrite(&f_char,sizeof(char), 1, fMv);
	fwrite(&f_iFwdBwd, sizeof(UShort), 1, fMv);	

	f_char ='F';	 
	f_iNum = rcMbDataAccess.getMbData().getBlkMode(B_8x8_0);
	fwrite(&f_char,sizeof(char), 1, fMv);
	fwrite(&f_iNum, sizeof(Int), 1, fMv);
 
	f_char ='F';	  
	f_iNum = rcMbDataAccess.getMbData().getBlkMode(B_8x8_1);
	fwrite(&f_char,sizeof(char), 1, fMv);
	fwrite(&f_iNum, sizeof(Int), 1, fMv);

	f_char ='F';		
	f_iNum = rcMbDataAccess.getMbData().getBlkMode(B_8x8_2);
	fwrite(&f_char,sizeof(char), 1, fMv);
	fwrite(&f_iNum, sizeof(Int), 1, fMv);

	f_char ='F';		
	f_iNum = rcMbDataAccess.getMbData().getBlkMode(B_8x8_3);
	fwrite(&f_char,sizeof(char), 1, fMv);
	fwrite(&f_iNum, sizeof(Int), 1, fMv);
  
	Int iFPoc;
	Int ac;

	for (ac=0; ac<4; ac++)
	{
		f_char ='F';
	    iFPoc = rcMbDataAccess.getMbData().getMbMotionData(LIST_0).m_ascRefIdx[ac];
		fwrite(&f_char,sizeof(char), 1, fMv);
		fwrite(&iFPoc, sizeof(Int), 1, fMv); 
	}
	
	for (ac=0; ac<16; ac++)
	{
		f_char ='F';	
		f_iNum = rcMbDataAccess.getMbData().getMbMotionData(LIST_0).m_acMv[ac].getHor();
		fwrite(&f_char,sizeof(char), 1, fMv);
		fwrite(&f_iNum, sizeof(Int), 1, fMv);

		f_char ='F';	
		f_iNum = rcMbDataAccess.getMbData().getMbMotionData(LIST_0).m_acMv[ac].getVer();
		fwrite(&f_char,sizeof(char), 1, fMv);
		fwrite(&f_iNum, sizeof(Int), 1, fMv);
	}

	for (ac=0; ac<4; ac++)
	{		
		f_char ='B';	
		iFPoc = rcMbDataAccess.getMbData().getMbMotionData(LIST_1).m_ascRefIdx[ac];  
		fwrite(&f_char,sizeof(char), 1, fMv);
		fwrite(&iFPoc, sizeof(Int), 1, fMv);
	}
	
	for (ac=0; ac<16; ac++)
	{
		f_char ='B';	
		 f_iNum = rcMbDataAccess.getMbData().getMbMotionData(LIST_1).m_acMv[ac].getHor();
		fwrite(&f_char,sizeof(char), 1, fMv);
		fwrite(&f_iNum, sizeof(Int), 1, fMv);

		f_char ='B';	
		f_iNum = rcMbDataAccess.getMbData().getMbMotionData(LIST_1).m_acMv[ac].getVer();
		fwrite(&f_char,sizeof(char), 1, fMv);
		fwrite(&f_iNum, sizeof(Int), 1, fMv);
	}
	return Err::m_nOK;
}
#endif  // JVT-W081

#if JMVM_ONLY //JVT-Z021
ErrVal 

MbDataAccess::getNewMbMotionInfo(GDV disparityL0, GDV disparityL1, Mv &cCenterL0, Mv &cCenterL1)

{

	MBMotion cMbMotionTmp;

	Int iMode = 0;

	SliceHeader& rcSliceHeader = getSH();

	rcSliceHeader.setMbMotionModeNum(LIST_0,0);

	rcSliceHeader.setMbMotionModeNum(LIST_1,0);



	Bool bIsViewL0,bIsViewLevel1;

	if(rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding()) //SLD

	{

		bIsViewLevel1 = (!rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (rcSliceHeader.getViewId(), LIST_1)) ? true : false;

	}

	else //SLD

	{

		bIsViewLevel1 = (!rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX (rcSliceHeader.getViewId(), LIST_1)) ? true : false;

	}



	if(!rcSliceHeader.getAnchorPicFlag())

	{



		if(rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding()) //SLD

		{

			bIsViewL0 = rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX (rcSliceHeader.getViewId(), LIST_0);

		}

		else //SLD

		{

			bIsViewL0 = rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (rcSliceHeader.getViewId(), LIST_0);

		}	  

		if(bIsViewL0)

		{

			rcSliceHeader.setMbMotionModeNum(LIST_0, 81);



			for(int k=0; k<rcSliceHeader.getMbMotionModeNum(LIST_0); k++)

			{

				cMbMotionTmp.m_iViewMode = INTRA_4X4;

				rcSliceHeader.setMbMotionInfo(LIST_0, k, cMbMotionTmp);

			}



			if(disparityL0.getHor()%2==0 && disparityL0.getVer()%2==0)

			{

				iMode = 0;



				cCenterL0.set(0,0);

			}

			if(disparityL0.getHor()%2==0 && disparityL0.getVer()%2!=0)

			{

				iMode = 1;

				cCenterL0.set(0,1);

			}

			if(disparityL0.getHor()%2!=0 && disparityL0.getVer()%2==0)

			{

				iMode = 2;



				cCenterL0.set(1,0);



			}

			if(disparityL0.getHor()%2!=0 && disparityL0.getVer()%2!=0)

			{

				iMode = 3;



				cCenterL0.set(1,1);



			}



			for(int j=0; j<9; j++)

			{

				for(int i=0; i<9; i++)

				{

					getSingleMbMotionInfo(FMb_RD_in, cMbMotionTmp, i, j, LIST_0, bIsViewLevel1);



					cMbMotionTmp.m_uiFwdBwd = 0;



					rcSliceHeader.setMbMotionInfo(LIST_0, j*9+i, cMbMotionTmp);

				}

			}

		}



		if(bIsViewLevel1)

		{

			rcSliceHeader.setMbMotionModeNum(LIST_1, 81);



			for(int k=0; k<rcSliceHeader.getMbMotionModeNum(LIST_1); k++)

			{

				cMbMotionTmp.m_iViewMode = INTRA_4X4;

				rcSliceHeader.setMbMotionInfo(LIST_1, k, cMbMotionTmp);

			}



			if(disparityL1.getHor()%2==0 && disparityL1.getVer()%2==0)

			{

				iMode = 0;



				cCenterL1.set(0,0);



			}

			if(disparityL1.getHor()%2==0 && disparityL1.getVer()%2!=0)

			{

				iMode = 1;



				cCenterL1.set(0,1);



			}

			if(disparityL1.getHor()%2!=0 && disparityL1.getVer()%2==0)

			{

				iMode = 2;



				cCenterL1.set(1,0);



			}

			if(disparityL1.getHor()%2!=0 && disparityL1.getVer()%2!=0)

			{

				iMode = 3;



				cCenterL1.set(1,1);



			}



			for(int j=0; j<9; j++)

			{

				for(int i=0; i<9; i++)

				{

					getSingleMbMotionInfo(FMb_RD_in, cMbMotionTmp, i, j, LIST_1, bIsViewLevel1);



					cMbMotionTmp.m_uiFwdBwd = 0;



					rcSliceHeader.setMbMotionInfo(LIST_1, j*9+i, cMbMotionTmp);

				}

			}

		}

	}

	return Err::m_nOK;

}

ErrVal

MbDataAccess::getOrgMbMotionInfo(FILE *fFwdMv, 

								 FILE *fBwdMv, 

								 GDV disparityL0, 

								 GDV disparityL1, 

								 UInt uiCodedFrames,

								 Bool bIsViewLevel1,

								 UInt uiMbInRow, 

								 long sizeofMB,

								 long sizeofFrame)

{

	Mv tmp;

	Mv cDis;

	long reconOffset;

	int reconL0, reconL1;

	Short sWidth, sHeight;

	SliceHeader& rcSliceHeader = getSH();



	sWidth = rcSliceHeader.getSPS().getFrameWidthInMbs();

	sHeight = rcSliceHeader.getSPS().getFrameHeightInMbs();



	for(int k=0; k<50; k++)

		FMb_RD_in[k].m_iViewMode = INTRA_4X4;



	Bool bIsViewL0, bIsViewL1;



	if(!rcSliceHeader.getAnchorPicFlag())

	{



		if(rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding())//SLD

		{

			bIsViewL0 = rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(),LIST_0);

		}

		else

		{

			bIsViewL0 = rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsForListX(rcSliceHeader.getViewId(),LIST_0);

		}

		if(bIsViewL0)

		{

			for(int j=-(5/2); j<=(5/2); j++)

			{

				for(int i=-(5/2); i<=(5/2); i++)

				{

					cDis.set(disparityL0.getHor()/2 + i,disparityL0.getVer()/2 + j);



					if(cDis.getHor() >= 0 &&

						cDis.getHor() < sWidth &&

						cDis.getVer() >= 0 &&

						cDis.getVer() < sHeight)

					{

						reconOffset = (long(cDis.getHor()) + long(uiMbInRow) * long(cDis.getVer())) * (sizeofMB);

						reconL0 = fseek (fFwdMv, Int(uiCodedFrames) * sizeofFrame + Int(reconOffset) +sizeof(char)+sizeof(int), 0);

						RNOK( xReadMbInfoFile(fFwdMv, &FMb_RD_in[LIST_0*25 + (j+(5/2))*5 + (i+(5/2))], cDis) );

					}

					else

					{

						FMb_RD_in[LIST_0*25 + (j+(5/2))*5 + (i+(5/2))].m_iViewMode = INTRA_4X4;

					}

				}

			}

		}



		if(rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding())//SLD

		{

			bIsViewL1 = rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(),LIST_1);

		}

		else

		{

			bIsViewL1 = rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsForListX(rcSliceHeader.getViewId(),LIST_1);

		}

		if(bIsViewL0)

		{

			for(int j=-(5/2); j<=(5/2); j++)

			{

				for(int i=-(5/2); i<=(5/2); i++)

				{

					cDis.set(disparityL1.getHor()/2 + i,disparityL1.getVer()/2 + j);



					if(cDis.getHor() >= 0 &&

						cDis.getHor() < sWidth &&

						cDis.getVer() >= 0 &&

						cDis.getVer() < sHeight)

					{

						reconOffset = (long(cDis.getHor()) + long(uiMbInRow) * long(cDis.getVer())) * (sizeofMB);

						reconL1 = fseek (fBwdMv, Int(uiCodedFrames) * sizeofFrame + Int(reconOffset) +sizeof(char)+sizeof(int), 0);

						RNOK( xReadMbInfoFile(fBwdMv, &FMb_RD_in[LIST_1*25 + (j+(5/2))*5 + (i+(5/2))], cDis) );

					}

					else

					{

						FMb_RD_in[LIST_1*25 + (j+(5/2))*5 + (i+(5/2))].m_iViewMode = INTRA_4X4;

					}

				}

			}

		}

	}



	return Err::m_nOK;

}



ErrVal

MbDataAccess::getOrgMbMotionInfo(GDV disparityL0, GDV disparityL1)

⌨️ 快捷键说明

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