📄 sys_decoder_vopsedec.cpp
字号:
//~OBSS_SAIT_991015 } }//OBSS_SAIT_991015 else if(m_volmd.volType == ENHN_LAYER && m_volmd.bSpatialScalability && pvopcBVOPQuant != NULL) // Spatial Scalability Enhancement Layer updateAllRefVOPs (pvopcBVOPQuant);//~OBSS_SAIT_991015 // select reference frames for Base/Temporal-Enhc/Spatial-Enhc Layer End Sharp(1998-02-10) switch(m_vopmd.vopPredType) { case IVOP:#ifdef DEBUG_OUTPUT cout << "\tIVOP";#endif/*Added by SONY (98/03/30)*/ if(m_bLinkisBroken == TRUE && m_bUseGOV == TRUE) m_bLinkisBroken = FALSE;/*Added by SONY (98/03/30) END*/ break; case PVOP:#ifdef DEBUG_OUTPUT cout << "\tPVOP (reference: t=" << m_tPastRef <<")";#endif break;// GMC case SPRITE:#ifdef DEBUG_OUTPUT cout << "\tSVOP(GMC) (reference: t=" << m_tPastRef <<")";#endif break;// ~GMC case BVOP:#ifdef DEBUG_OUTPUT cout << "\tBVOP (past ref: t=" << m_tPastRef << ", future ref: t=" << m_tFutureRef <<")";#endif break; default: break; }#ifdef DEBUG_OUTPUT cout << "\n"; cout.flush ();#endif/* Added by SONY (98/03/30)*/ if(m_bLinkisBroken == TRUE && m_bUseGOV == TRUE) fprintf(stderr,"WARNING: broken_link = 1 --- Output image must be broken.\n");/*Added by SONY (98/03/30) End*/ if(bCoded==FALSE) { 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 FALSE; } if (m_volmd.fAUsage != RECTANGLE) resetBYPlane (); if (m_volmd.fAUsage != RECTANGLE) { setRefStartingPointers (); computeVOPMembers (); }// RRV insertion redefineVOLMembersRRV ();// ~RRV decodeVOP (); //wchen: added by sony-probably not the best way if(m_volmd.volType == ENHN_LAYER && (m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) swapVOPU8Pointers(m_pvopcCurrQ,m_pvopcRefQ1);//OBSSFIX_MODE3 //Case for base layer has rectangular shape & enhancement layer has arbitrary shape if(m_pvopcCurrQ->fAUsage() == RECTANGLE && m_pvopcCurrQ->fAUsage() != m_pvopcRefQ1->fAUsage() ){ delete m_pvopcCurrQ; m_pvopcCurrQ = new CVOPU8YUVBA(m_volmd.fAUsage, m_rctRefFrameY, m_volmd.iAuxCompCount); }//~OBSSFIX_MODE3 // store the direct mode data if (m_vopmd.vopPredType != BVOP || (m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) { 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; m_rgmvBackward = m_rgmv + BVOP_MV_PER_REF_PER_MB * m_iSessNumMB; }//OBSS_SAIT_991015 else if (m_volmd.volType == BASE_LAYER && m_vopmd.vopPredType == BVOP ){ if( m_volmd.fAUsage != RECTANGLE) saveBaseShapeMode(); }//~OBSS_SAIT_991015 if (m_volmd.fAUsage != RECTANGLE) { if (m_vopmd.vopPredType != BVOP || (m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) { 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); } else { // For Temporal Scalability Added by Sharp(1998-02-10)//OBSS_SAIT_991015 //for Base layer BVOP padding if (m_volmd.volType == BASE_LAYER && m_vopmd.vopPredType == BVOP) { if(!m_volmd.bShapeOnly){ 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; } }//~OBSS_SAIT_991015 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); } // For Temporal Scalability End Sharp(1998-02-10) //give a comment that this is ac/dc pred stuff Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 6+m_volmd.iAuxCompCount*4 : 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; } else { // For Temporal Scalability Added by Sharp(1998-02-10) m_iBVOPOffsetForPadY = m_iOffsetForPadY; m_iBVOPOffsetForPadUV = m_iOffsetForPadUV; m_rctBVOPPrevNoExpandY = m_rctPrevNoExpandY; m_rctBVOPPrevNoExpandUV = m_rctPrevNoExpandUV; m_rctBVOPRefVOPY1 = m_rctRefVOPY1; m_rctBVOPRefVOPUV1 = m_rctRefVOPUV1; } // For Temporal Scalability End Sharp(1998-02-10) if (m_vopmd.vopPredType != BVOP || (m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) { if(!m_volmd.bShapeOnly){ //OBSS_SAIT_991015 repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ1); repeatPadUV (m_pvopcRefQ1); } //OBSS_SAIT_991015 //reset by in RefQ1 so that no left-over from last frame if (m_volmd.fAUsage != RECTANGLE) { if (m_volmd.fAUsage == EIGHT_BIT) { for(Int iAuxComp=0; iAuxComp<m_volmd.iAuxCompCount; iAuxComp++ ) { // MAC (SB) 1-Dec-99 repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsA (iAuxComp) + m_iOffsetForPadY, m_pvopcRefQ1); } } } }//OBSS_SAIT_991015 //Base layer BVOP padding for OBSS if (m_volmd.volType == BASE_LAYER && m_vopmd.vopPredType == BVOP) { if(!m_volmd.bShapeOnly){ repeatPadYOrA ((PixelC*) m_pvopcCurrQ->pixelsY () + m_iOffsetForPadY, m_pvopcCurrQ); repeatPadUV (m_pvopcCurrQ); } if (m_volmd.fAUsage != RECTANGLE) { if (m_volmd.fAUsage == EIGHT_BIT) { for(Int iAuxComp=0; iAuxComp<m_volmd.iAuxCompCount; iAuxComp++ ) { // MAC (SB) 1-Dec-99 repeatPadYOrA ((PixelC*) m_pvopcCurrQ->pixelsA (iAuxComp) + m_iOffsetForPadY, m_pvopcCurrQ); } } } }//~OBSS_SAIT_991015 // update buffers for temporal scalability Added by Sharp(1998-02-10) if(m_volmd.volType != BASE_LAYER) updateBuffVOPsEnhc (); return TRUE;}Int CVideoObjectDecoder::findStartCode( int dont_loop ){ // ensure byte alignment m_pbitstrmIn->flush (); Int bUserData; do { bUserData = 0; while(m_pbitstrmIn->peekBits(NUMBITS_START_CODE_PREFIX)!=START_CODE_PREFIX) { m_pbitstrmIn->getBits(8); if(m_pbitstrmIn->eof()==EOF || dont_loop != 0) return EOF; } m_pbitstrmIn->getBits(NUMBITS_START_CODE_PREFIX); if(m_pbitstrmIn->peekBits(NUMBITS_START_CODE_SUFFIX)==USER_DATA_START_CODE) bUserData = 1; } while(bUserData); return 0;}Int CVideoObjectDecoder::decodeVSHead (){ UInt uiSC = m_pbitstrmIn->getBits (NUMBITS_START_CODE_SUFFIX); if (uiSC != VSS_START_CODE) return 1; // visual session header /*UInt uiProfile = */m_pbitstrmIn->getBits (NUMBITS_VSS_PROFILE); if (findStartCode()) return 1; uiSC = m_pbitstrmIn->getBits (NUMBITS_START_CODE_SUFFIX); if (uiSC != VSO_START_CODE) return 1; // visual object header UInt uiIsVisualObjectIdent = m_pbitstrmIn->getBits (1); if (uiIsVisualObjectIdent) { UInt uiVSOVerID = m_pbitstrmIn->getBits (NUMBITS_VSO_VERID); if (uiVSOVerID != VSO_VERID) return 1; /* UInt uiVSOPriority = */m_pbitstrmIn->getBits (NUMBITS_VSO_PRIORITY); } UInt uiVSOType = m_pbitstrmIn->getBits (NUMBITS_VSO_TYPE); if (uiVSOType != VSO_TYPE) return 1; UInt uiVideoSignalType = m_pbitstrmIn->getBits (1); if (uiVideoSignalType) { /*UInt uiFormat = */m_pbitstrmIn->getBits (3); /*UInt uiRange = */ m_pbitstrmIn->getBits (1); UInt uiColor = m_pbitstrmIn->getBits (1); if (uiColor) { /*UInt uiPrimaries = */m_pbitstrmIn->getBits (8); /* UInt uiCharacter = */m_pbitstrmIn->getBits (8); /*UInt uiMatrix = */m_pbitstrmIn->getBits (8); } } if (findStartCode()) return 1; return 0;}Void CVideoObjectDecoder::decodeVOHead (){ findStartCode(); if( m_pbitstrmIn->peekBits(NUMBITS_START_CODE_SUFFIX)==VSS_START_CODE){ if(decodeVSHead()) exit(fprintf(stderr,"Failed to decoder visual sequence headers\n")); } // End Toshiba(1998-1-16:DP+RVLC) UInt uiVoStartCode = m_pbitstrmIn -> getBits (NUMBITS_VO_START_CODE); ASSERT(uiVoStartCode == VO_START_CODE); m_uiVOId = m_pbitstrmIn -> getBits (NUMBITS_VO_ID);}Void CVideoObjectDecoder::decodeVOLHead (){ findStartCode(); UInt uiVolStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOL_START_CODE); ASSERT(uiVolStartCode == VOL_START_CODE); decodeVOLBody();}Void CVideoObjectDecoder::decodeVOLBody(){ /* UInt uiVOLId = wmay */ m_pbitstrmIn -> getBits (NUMBITS_VOL_ID);// Begin: modified by Hughes 4/9/98 per clause 2.1.7. in N2171 document /* Bool bRandom = wmay */ m_pbitstrmIn->getBits (1); //VOL_Random_Access// End: modified by Hughes 4/9/98 /* UInt uiOLType = wmay */ m_pbitstrmIn -> getBits(8); // VOL_type_indication UInt uiOLI = m_pbitstrmIn -> getBits (1); //VOL_Is_Object_Layer_Identifier, useless flag for now if(uiOLI) {// GMC m_volmd.uiVerID = m_pbitstrmIn -> getBits (4); // video_oject_layer_verid // Here, is_object_layer_identifier is used for Version1/Version2 // identification at this moment (tentative solution). // vol_type_indicator is not useless for version 2 at present. // need discussion at Video Group about this issue.// m_pbitstrmIn -> getBits (4); // video_oject_layer_verid m_pbitstrmIn -> getBits (3); // video_oject_layer_priority } else{ m_volmd.uiVerID = 1;// ~GMC } //ASSERT(uiOLI == 0); m_ivolAspectRatio = m_pbitstrmIn -> getBits (4); if(m_ivolAspectRatio==15) // extended PAR { m_ivolAspectWidth = m_pbitstrmIn -> getBits (8); m_ivolAspectHeight = m_pbitstrmIn -> getBits (8); } UInt uiMark; UInt uiCTP = m_pbitstrmIn -> getBits (1); //VOL_Control_Parameter, useless flag for now if(uiCTP) { /* UInt uiChromaFormat = */ m_pbitstrmIn -> getBits (2); /* UInt uiLowDelay = */ m_pbitstrmIn -> getBits (1); UInt uiVBVParams = m_pbitstrmIn -> getBits (1); if(uiVBVParams) { /* UInt uiFirstHalfBitRate = */ m_pbitstrmIn -> getBits (15); uiMark = m_pbitstrmIn -> getBits (1); ASSERT(uiMark==1); /* UInt uiLatterHalfBitRate = */ m_pbitstrmIn -> getBits (15); uiMark = m_pbitstrmIn -> getBits (1); ASSERT(uiMark==1); /* UInt uiFirstHalfVbvBufferSize = */ m_pbitstrmIn -> getBits (15); uiMark = m_pbitstrmIn -> getBits (1); ASSERT(uiMark==1); /* UInt uiLatterHalfVbvBufferSize = */m_pbitstrmIn -> getBits (3); /* UInt uiFirstHalfVbvBufferOccupany = */m_pbitstrmIn -> getBits (11); uiMark = m_pbitstrmIn -> getBits (1); ASSERT(uiMark==1); /* UInt uiLatterHalfVbvBufferOccupany = */ m_pbitstrmIn -> getBits (15); uiMark = m_pbitstrmIn -> getBits (1); ASSERT(uiMark==1); } } UInt uiAUsage = m_pbitstrmIn -> getBits (NUMBITS_VOL_SHAPE);// MAC (SB) 1-Dec-99 if (uiAUsage==3) { // gray scale if (m_volmd.uiVerID!=1) { m_volmd.iAlphaShapeExtension = m_pbitstrmIn -> getBits (4); m_volmd.iAuxCompCount = CVideoObject::getAuxCompCount(m_volmd.iAlphaShapeExtension); } else { m_volmd.iAuxCompCount = 1; } } else m_volmd.iAuxCompCount = 0;//~MAC uiMark = m_pbitstrmIn -> getBits (1); ASSERT(uiMark==1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -