📄 vopseenc.cpp
字号:
if(bPrevRefVopWasCoded) // only swap references if previous vop was coded
{
if (m_volmd.volType == BASE_LAYER)
updateAllRefVOPs (); // update all reconstructed VOP's
else if (!bTemporalScalability) { // modified by Sharp (98/2/10)
if(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == PVOP)
m_vopmd.iRefSelectCode = 3;
else if(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP)
m_vopmd.iRefSelectCode = 0;
updateAllRefVOPs (pvopfRefBaseLayer); // for spatial scalability
}
// NEWPRED
if(m_volmd.bNewpredEnable) {
// set NEWPRED reference picture memory
g_pNewPredEnc->SetQBuf( m_pvopcRefQ0, m_pvopcRefQ1 );
if (m_volmd.fAUsage == RECTANGLE) { //rectangular shape
for( int iSlice = 0; iSlice < g_pNewPredEnc->m_iNumSlice; iSlice++ ) {
// make next reference picture
g_pNewPredEnc->makeNextRef(g_pNewPredEnc->m_pNewPredControl, iSlice);
int iMBY = g_pNewPredEnc->NowMBA(iSlice)/((g_pNewPredEnc->getwidth())/MB_SIZE);
PixelC* RefpointY = (PixelC*) m_pvopcRefQ0->pixelsY () + (m_iStartInRefToCurrRctY-EXPANDY_REF_FRAME) + iMBY * MB_SIZE * m_rctRefFrameY.width;
PixelC* RefpointU = (PixelC*) m_pvopcRefQ0->pixelsU () + (m_iStartInRefToCurrRctUV-EXPANDUV_REF_FRAME) + iMBY * BLOCK_SIZE * m_rctRefFrameUV.width;
PixelC* RefpointV = (PixelC*) m_pvopcRefQ0->pixelsV () + (m_iStartInRefToCurrRctUV-EXPANDUV_REF_FRAME) + iMBY * BLOCK_SIZE * m_rctRefFrameUV.width;
g_pNewPredEnc->CopyNPtoVM(iSlice, RefpointY, RefpointU, RefpointV);
}
repeatPadYOrA ((PixelC*) m_pvopcRefQ0->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ0);
repeatPadUV (m_pvopcRefQ0);
}
}
// ~NEWPRED
if (m_volmd.bOriginalForME) {
if (m_vopmd.vopPredType == PVOP || ((m_uiSprite == 2) && (m_vopmd.vopPredType == SPRITE)) || // GMC
(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0))
swapVOPU8Pointers (m_pvopcRefOrig0, m_pvopcRefOrig1);
}
}
//OBSS_SAIT_991015
else if(m_volmd.volType == ENHN_LAYER && m_volmd.fAUsage == ONE_BIT){
if (!bTemporalScalability) {
if(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == PVOP)
m_vopmd.iRefSelectCode = 3;
else if(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP)
m_vopmd.iRefSelectCode = 0;
updateAllRefVOPs (pvopfRefBaseLayer); // for spatial scalability
if (m_volmd.bOriginalForME) {
if (m_vopmd.vopPredType == PVOP ||
(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0))
swapVOPU8Pointers (m_pvopcRefOrig0, m_pvopcRefOrig1);
}
}
}
//~OBSS_SAIT_991015
if (m_vopmd.vopPredType != BVOP) {
if(bPrevRefVopWasCoded)
{
// swap zoomed ref images
CU8Image *puciTmp = m_puciRefQZoom0;
m_puciRefQZoom0 = m_puciRefQZoom1;
m_puciRefQZoom1 = puciTmp;
m_rctRefVOPZoom0 = m_rctRefVOPZoom1;
}
m_vopmd.iSearchRangeBackward = 0;
if(bPrevRefVopWasCoded)
if ( !bTemporalScalability || m_volmd.volType == BASE_LAYER ) // added by Sharp (99/1/28)
m_tPastRef = m_tFutureRef;
m_tDistanceBetwIPVOP = (m_t - m_tPastRef) / m_volmd.iTemporalRate;
m_tFutureRef = m_t;
m_iBCount = 0;
if(m_vopmd.vopPredType == PVOP &&
m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode ==3)
m_tPastRef = m_t;
if(!m_volmd.bShapeOnly){ //OBSS_SAIT_991015 //BSO of OBSS
if (m_vopmd.vopPredType == PVOP || (m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE)) { // GMC
// swap rounding control 0 <-> 1 every coded PVOP
if( bPrevRefVopWasCoded && !m_volmd.bRoundingControlDisable)
m_vopmd.iRoundingControlEncSwitch ^= 0x00000001;
m_vopmd.iRoundingControl = m_vopmd.iRoundingControlEncSwitch;
m_rctRefVOPZoom0 = m_rctRefVOPY0.upSampleBy2 ();
biInterpolateY (m_pvopcRefQ0, m_rctRefVOPY0, m_puciRefQZoom0,
m_rctRefVOPZoom0, m_vopmd.iRoundingControl);
m_vopmd.iSearchRangeForward =
checkrange (m_volmd.iMVRadiusPerFrameAwayFromRef * (m_t - m_tPastRef) / m_volmd.iTemporalRate, 1, 1024);
} else
m_vopmd.iSearchRangeForward = 0;
}//OBSS_SAIT_991015
} else {
// BVOP, set rounding control to zero
m_vopmd.iRoundingControl = 0;
if (m_volmd.volType==ENHN_LAYER && m_vopmd.iRefSelectCode==0){
m_tPastRef = m_tFutureRef;
m_tFutureRef = m_t;
}
m_iBCount++;
if (m_iBCount == 1 || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode==0))
{
if(!m_volmd.bShapeOnly){ //OBSS_SAIT_991015 //BSO of OBSS
if(bPrevRefVopWasCoded)
{
m_rctRefVOPZoom1 = m_rctRefVOPY1.upSampleBy2 ();
biInterpolateY (m_pvopcRefQ1,m_rctRefVOPY1,
m_puciRefQZoom1, m_rctRefVOPZoom1, 0);
}
if (m_vopmd.iRoundingControlEncSwitch==1 // modified by Sharp (98/2/10) && // Need to re-compute because iRoundingControl was 1
|| (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 0) || bTemporalScalability)
{
m_rctRefVOPZoom0 = m_rctRefVOPY0.upSampleBy2 ();
biInterpolateY (m_pvopcRefQ0, m_rctRefVOPY0, m_puciRefQZoom0, m_rctRefVOPZoom0, 0);
}
}//OBSS_SAIT_991015
}
//m_vopmd.iSearchRangeForward = 15;
//m_vopmd.iSearchRangeBackward = 15;
m_vopmd.iSearchRangeForward =
checkrange ((m_t - m_tPastRef) * m_volmd.iMVRadiusPerFrameAwayFromRef / m_volmd.iTemporalRate, 1, 1024);
m_vopmd.iSearchRangeBackward =
checkrange ((m_tFutureRef - m_t) * m_volmd.iMVRadiusPerFrameAwayFromRef / m_volmd.iTemporalRate, 1, 1024);
}
decideMVInfo();
m_statsVOP.nVOPs = 1;
if (m_volmd.fAUsage != RECTANGLE)
resetBYPlane ();
if(!bVOPVisible)
{
if (m_vopmd.vopPredType != BVOP
&& m_volmd.fAUsage != RECTANGLE && bPrevRefVopWasCoded)
{
// give the current object a dummy size
m_iNumMBX = m_iNumMBY = m_iNumMB = 1;
saveShapeMode(); // save the previous reference vop shape mode
}
//OBSS_SAIT_991015
if (m_volmd.fAUsage != RECTANGLE ){
// give the current object a dummy size
m_iNumMBX = m_iNumMBY = m_iNumMB = 1;
saveBaseShapeMode(); // save the base layer shape mode
}
//~OBSS_SAIT_991015
return; // return if not coded
}
// prepare for the current original data
// extend the currVOP size to multiples of MBSize, will put zero on extended pixels
if (m_volmd.fAUsage != RECTANGLE) {
if (m_uiSprite != 1) { // add by cgu to deal with vop-mc-left-top 12/5
findTightBoundingBox ();
//OBSSFIX_MODE3
if(!(m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0 && !(m_volmd.iEnhnType != 0 && m_volmd.iuseRefShape ==1)))
// if(!(m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0))//OBSS_SAIT_991015
//~OBSSFIX_MODE3
findBestBoundingBox ();
} else if (m_sptMode == BASIC_SPRITE) {
Int iSpriteWidth = m_rctSpt.right - m_rctSpt.left;
if(iSpriteWidth%16)
iSpriteWidth += 16 - (iSpriteWidth%16);
Int iSpriteHeight = m_rctSpt.bottom - m_rctSpt.top;
if(iSpriteHeight%16)
iSpriteHeight += 16 - (iSpriteHeight%16);
m_pvopcOrig->setBoundRct (CRct (0, 0, iSpriteWidth, iSpriteHeight));
}
m_rctCurrVOPY = m_pvopcOrig->whereBoundY ();
m_rctCurrVOPUV = m_pvopcOrig->whereBoundUV ();
setRefStartingPointers (); // need to compute the starting pointers of the refVOP's (corresponding to the current Rct)
computeVOPMembers ();
// Modified for error resilient mode by Toshiba(1998-1-16)
if (m_volmd.bVPBitTh < 0 || m_volmd.bShapeOnly==TRUE || m_volmd.volType == ENHN_LAYER) { // FIX for C2-1
m_vopmd.bShapeCodingType = (m_vopmd.vopPredType == IVOP) ? 0 : 1;
} else {
m_vopmd.bShapeCodingType = (m_volmd.iBinaryAlphaRR<0)?1:((m_t % m_volmd.iBinaryAlphaRR)==0) ? 0 : 1;
}
// printf("vop_shape_coding_type=%d\n",m_vopmd.bShapeCodingType);
// End Toshiba(1998-1-16)
}
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut -> trace (m_t, "VOP_Time");
#endif // __TRACE_AND_STATS_
// GMC
if(m_uiSprite == 2 && vopPredType == SPRITE)
if(m_volmd.bOriginalForME==TRUE)
GlobalMotionEstimation(m_rgstDstQ, m_pvopcRefOrig0, m_pvopcOrig, m_rctRefFrameY, m_rctRefVOPY0, m_rctCurrVOPY, m_iNumOfPnts);
else
GlobalMotionEstimation(m_rgstDstQ, m_pvopcRefOrig1, m_pvopcOrig, m_rctRefFrameY, m_rctRefVOPY0, m_rctCurrVOPY, m_iNumOfPnts);
// ~GMC
// RRV
if(m_vopmd.RRVmode.iOnOff == 1)
{
resetAndCalcRRV();
redefineVOLMembersRRV();
}
else
{
m_vopmd.RRVmode.iRRVOnOff = 0;
m_iRRVScale = 1;
}
// ~RRV
codeVOPHead ();
cout << "\t" << "Time..." << m_t << " (" << m_t/m_volmd.dFrameHz << " sec)";
switch(m_vopmd.vopPredType) //OBSS_SAIT_991015
{
case IVOP:
cout << "\tIVOP";
break;
case PVOP:
cout << "\tPVOP (reference: t=" << m_tPastRef <<")";
break;
// GMC
case SPRITE:
cout << "\tSVOP(GMC) (reference: t=" << m_tPastRef <<")";
break;
// ~GMC
case BVOP:
cout << "\tBVOP (past ref: t=" << m_tPastRef
<< ", future ref: t=" << m_tFutureRef <<")";
break;
default:
break;
}
cout << "\n";
cout.flush ();
encodeVOP ();
m_statsVOP.nBitsStuffing += m_pbitstrmOut->flush ();
// NEWPRED
if(m_volmd.bNewpredEnable) {
g_pNewPredEnc->SetQBuf( m_pvopcRefQ0, m_pvopcRefQ1 );
for( int iSlice = 0; iSlice < g_pNewPredEnc->m_iNumSlice; iSlice++ ) {
g_pNewPredEnc->makeNextBuf(
g_pNewPredEnc->m_pNewPredControl,
g_pNewPredEnc->GetCurrentVOP_id(),
iSlice
);
}
}
// ~NEWPRED
}
#ifdef __TRACE_AND_STATS_
if(!m_volmd.bShapeOnly){ //OBSS_SAIT_991015 //BSO of OBSS
if (m_vopmd.vopPredType == BVOP)
computeSNRs (m_pvopcCurrQ);
else
computeSNRs (m_pvopcRefQ1);
m_statsVOP.dSNRY = m_rgdSNR [0];
m_statsVOP.dSNRU = m_rgdSNR [1];
m_statsVOP.dSNRV = m_rgdSNR [2];
if (m_volmd.fAUsage == EIGHT_BIT) {
for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) // MAC (SB) 26-Nov-99
m_statsVOP.dSNRA[iAuxComp] = m_rgdSNR[3+iAuxComp];
}
} //OBSS_SAIT_991015
m_statsVOP.print (TRUE);
m_statsVOL += m_statsVOP;
#endif // __TRACE_AND_STATS_
// rate control
if (m_uiRateControl==RC_MPEG4) {
assert (m_volmd.volType == BASE_LAYER); //don't no know to do RC for scalability yet
#ifndef __TRACE_AND_STATS_
cerr << "Compile flag __TRACE_AND_STATS_ required for stats for rate control." << endl;
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_uiSprite == 2) && (m_vopmd.vopPredType == SPRITE))) // GMC
m_statRC.updateRCModel (m_statsVOP.total (), m_statsVOP.head ());
}
// store the direct mode data (by swaping pointers)
//OBSSFIX_MODE3
if (m_vopmd.vopPredType != BVOP ||
(m_volmd.volType == ENHN_LAYER && m_volmd.bSpatialScalability && m_volmd.iHierarchyType == 0 && m_volmd.iEnhnType != 0 && m_volmd.iuseRefShape == 1)) {
// if (m_vopmd.vopPredType != BVOP) {
//~OBSSFIX_MODE3
if(m_volmd.fAUsage != RECTANGLE && bPrevRefVopWasCoded)
saveShapeMode();
//OBSS_SAIT_991015
if(m_volmd.fAUsage != RECTANGLE)
saveBaseShapeMode();
//~OBSS_SAIT_991015
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");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -