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 + -
显示快捷键?