📄 sys_decoder_vopsedec.cpp
字号:
m_vopmd.iVopConstantAlphaValue = 255; *p_short_video_header=FALSE; // Added by KPN for short headers if (m_pbitstrmIn->peekBits(NUMBITS_SHORT_HEADER_START_CODE) == SHORT_VIDEO_START_MARKER) { fprintf(stderr, "\nBitstream with short header format detected\n"); *p_short_video_header=TRUE; // moved inside routine m_pbitstrmIn -> getBits(22); m_t = video_plane_with_short_header(); } else { fprintf(stderr,"\nBitstream without short headers detected\n"); decodeVOHead (); // also decodes vss, vso headers if present printf ("VO %d...\n", m_uiVOId); decodeVOLHead (); } short_video_header=*p_short_video_header; postVO_VOLHeadInit(iDisplayWidth, iDisplayHeight, pbSpatialScalability);}void CVideoObjectDecoder::postVO_VOLHeadInit (Int iDisplayWidth, Int iDisplayHeight, Bool *pbSpatialScalability) {/* (98/03/30 added by SONY)*/ Int iDisplayWidthRound = 0; Int iDisplayHeightRound = 0; m_bLinkisBroken = FALSE; m_bUseGOV = FALSE;/* (98/03/30 added by SONY)*/ // Added for error resilient mode by Toshiba(1997-11-14): Moved (1998-1-16) g_iMaxHeading = MAXHEADING_ERR; g_iMaxMiddle = MAXMIDDLE_ERR; g_iMaxTrailing = MAXTRAILING_ERR; // End Toshiba(1997-11-14) setClipTab(); // NBIT if(m_volmd.volType == ENHN_LAYER){ // check scalability type//OBSS_SAIT_991015 m_volmd.bSpatialScalability = FALSE; if(pbSpatialScalability != NULL){ if(m_volmd.iHierarchyType == 0 || m_volmd.bShapeOnly) { *pbSpatialScalability = TRUE; m_volmd.bSpatialScalability = TRUE; } else { *pbSpatialScalability = FALSE; m_volmd.bSpatialScalability = FALSE; } }//~OBSS_SAIT_991015 } if (m_volmd.fAUsage == RECTANGLE) { if (m_volmd.volType == ENHN_LAYER && (m_volmd.ihor_sampling_factor_n != m_volmd.ihor_sampling_factor_m || m_volmd.iver_sampling_factor_n != m_volmd.iver_sampling_factor_m )){ iDisplayWidth = m_ivolWidth; iDisplayHeight= m_ivolHeight;//OBSS_SAIT_991015 m_volmd.iFrmWidth_SS = iDisplayWidth; m_volmd.iFrmHeight_SS = iDisplayHeight; //~OBSS_SAIT_991015 } else if (iDisplayWidth == -1 && iDisplayHeight == -1) { iDisplayWidth = m_ivolWidth; iDisplayHeight = m_ivolHeight; } else if (iDisplayWidth != m_ivolWidth || iDisplayHeight != m_ivolHeight){ fprintf(stderr, "\nDecode aborted! This rectangular VOP stream requires display\nwidth and height to be set to %dx%d.\n", m_ivolWidth, m_ivolHeight); exit(1); } }//OBSS_SAIT_991015 else if (m_volmd.fAUsage == ONE_BIT) { if (m_volmd.volType == ENHN_LAYER && (m_volmd.ihor_sampling_factor_n_shape!=m_volmd.ihor_sampling_factor_m_shape || m_volmd.iver_sampling_factor_n_shape!=m_volmd.iver_sampling_factor_m_shape )){ m_volmd.iFrmWidth_SS = iDisplayWidth; m_volmd.iFrmHeight_SS = iDisplayHeight; if(pbSpatialScalability!=NULL) { *pbSpatialScalability = TRUE; m_volmd.bSpatialScalability = TRUE; } } else { if(pbSpatialScalability!=NULL) { *pbSpatialScalability = FALSE; m_volmd.bSpatialScalability = FALSE; } } }//~OBSS_SAIT_991015 m_rctDisplayWindow = CRct (0, 0, iDisplayWidth, iDisplayHeight); //same as m_rctOrg? will fixe later/* if (m_volmd.fAUsage == RECTANGLE) { if (m_volmd.volType == ENHN_LAYER && (m_volmd.ihor_sampling_factor_n/m_volmd.ihor_sampling_factor_m != 1|| m_volmd.iver_sampling_factor_n/m_volmd.iver_sampling_factor_m != 1)){ iDisplayWidth = m_ivolWidth; iDisplayHeight= m_ivolHeight; if(pbSpatialScalability!=NULL) *pbSpatialScalability = TRUE; fprintf(stderr,"display size %d %d \n",iDisplayWidth, iDisplayHeight); } else if (iDisplayWidth != m_ivolWidth || iDisplayHeight != m_ivolHeight){ fprintf(stderr, "\nDecode aborted! This rectangular VOP stream requires display\nwidth and height to be set to %dx%d.\n", m_ivolWidth, m_ivolHeight); exit(1); } else if(pbSpatialScalability!=NULL) *pbSpatialScalability = FALSE; } m_rctDisplayWindow = CRct (0, 0, iDisplayWidth, iDisplayHeight); //same as m_rctOrg? will fixe later*/ if (m_uiSprite == 1) { // change iDisplay size in order to get the first sprite piece iDisplayWidth = (Int) m_rctSpt.width; iDisplayHeight = (Int) m_rctSpt.height (); }//OBSS_SAIT_991015// if (m_volmd.volType == ENHN_LAYER && m_volmd.fAUsage == ONE_BIT) { // I put this back in - swinder // takind it our breaks the ability to decode arbitrary sized sequences iDisplayWidthRound = ((iDisplayWidth + MB_SIZE - 1)>>4)<<4; iDisplayHeightRound = ((iDisplayHeight + MB_SIZE - 1)>>4)<<4;// }// else {// Int iMod = iDisplayWidth % MB_SIZE;// iDisplayWidthRound = (iMod > 0) ? iDisplayWidth + MB_SIZE - iMod : iDisplayWidth;// iMod = iDisplayHeight % MB_SIZE;// iDisplayHeightRound = (iMod > 0) ? iDisplayHeight + MB_SIZE - iMod : iDisplayHeight;// }/* Int iMod = iDisplayWidth % MB_SIZE; Int iDisplayWidthRound = (iMod > 0) ? iDisplayWidth + MB_SIZE - iMod : iDisplayWidth; iMod = iDisplayHeight % MB_SIZE; Int iDisplayHeightRound = (iMod > 0) ? iDisplayHeight + MB_SIZE - iMod : iDisplayHeight;*///~OBSS_SAIT_991015 m_rctRefFrameY = CRct ( -EXPANDY_REF_FRAME, -EXPANDY_REF_FRAME, EXPANDY_REF_FRAME + iDisplayWidthRound, EXPANDY_REF_FRAME + iDisplayHeightRound ); m_rctRefFrameUV = m_rctRefFrameY.downSampleBy2 (); allocateVOLMembers (iDisplayWidth, iDisplayHeight); // HHI Schueuer if (m_volmd.bSadctDisable) m_pscanSelector = new CInvScanSelector; else m_pscanSelector = new CInvScanSelectorForSADCT(m_rgiCurrMBCoeffWidth); // end HHI// RRV insertion Int iScale = (m_vopmd.RRVmode.iOnOff == 1) ? (2) : (1);// ~RRV if (m_volmd.fAUsage == RECTANGLE) { //wchen: if sprite; set it according to the initial piece instead m_rctCurrVOPY = (m_uiSprite == 0 || m_uiSprite == 2) ? CRct (0, 0, iDisplayWidthRound, iDisplayHeightRound) : m_rctSpt; // GMC m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 (); m_rctRefVOPY0 = m_rctCurrVOPY;// RRV modification m_rctRefVOPY0.expand (EXPANDY_REFVOP *iScale);// m_rctRefVOPY0.expand (EXPANDY_REFVOP);// ~RRV m_rctRefVOPUV0 = m_rctRefVOPY0.downSampleBy2 (); m_rctRefVOPY1 = m_rctRefVOPY0; m_rctRefVOPUV1 = m_rctRefVOPUV0; computeVOLConstMembers (); // these VOP members are the same for all frames }//OBSS_SAIT_991015 else if (m_volmd.fAUsage == ONE_BIT) { m_rctCurrVOPY = (m_uiSprite == 0) ? CRct (0, 0, iDisplayWidthRound, iDisplayHeightRound) : m_rctSpt; m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 (); m_rctRefVOPY0 = m_rctCurrVOPY; m_rctRefVOPY0.expand (EXPANDY_REFVOP); m_rctRefVOPUV0 = m_rctRefVOPY0.downSampleBy2 (); m_rctRefVOPY1 = m_rctRefVOPY0; m_rctRefVOPUV1 = m_rctRefVOPUV0; }//~OBSS_SAIT_991015 // buffer for shape decoding m_pvopcRightMB = new CVOPU8YUVBA (m_volmd.fAUsage, CRct (0, 0, MB_SIZE, MB_SIZE), m_volmd.iAuxCompCount); m_ppxlcRightMBBY = (PixelC*) m_pvopcRightMB->pixelsBY (); m_ppxlcRightMBBUV = (PixelC*) m_pvopcRightMB->pixelsBUV ();// NEWPRED if (m_volmd.bNewpredEnable) { g_pNewPredDec->SetObject( m_iNumBitsTimeIncr, iDisplayWidth, iDisplayHeight, "", m_volmd.bNewpredSegmentType, m_volmd.fAUsage, m_volmd.bShapeOnly, m_pvopcRefQ0, m_pvopcRefQ1, m_rctRefFrameY, m_rctRefFrameUV ); m_vopmd.m_iNumBitsVopID = m_iNumBitsTimeIncr + NUMBITS_VOP_ID_PLUS; }// ~NEWPRED // buffers for Temporal Scalabe Decoding Added by Sharp(1998-02-10) if (m_volmd.volType == ENHN_LAYER) { m_pBuffP1 = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ()); m_pBuffP2 = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ()); m_pBuffB1 = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ()); m_pBuffB2 = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ()); m_pBuffE = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ()); } // buffers for Temporal Scalabe Decoding End Sharp(1998-02-10) m_iClockRateScale = 1; // added by Sharp (98/6/26) // Set sprite_transmit_mode to STOP for the duration of VOL if (fSptUsage () == 0), // and later set to PIECE by decode_init_sprite () if (fSptUsage () == 1) m_vopmd.SpriteXmitMode = STOP; //yrchen initialization of idct 10.21.2003 m_pinvdct=new idct; assert(m_pinvdct); m_pinvdct->init(); }// for back/forward shape Added by Sharp(1998-02-10)CVideoObjectDecoder::CVideoObjectDecoder ( Int iDisplayWidth, Int iDisplayHeight) : CVideoObject (){ m_pistrm = -1; m_pbitstrmIn = NULL; m_pentrdecSet = NULL; m_uiVOId = 0; Void set_modes(VOLMode* volmd, VOPMode* vopmd); set_modes(&m_volmd, &m_vopmd); // set VOL modes, VOP modes m_vopmd.iVopConstantAlphaValue = 255; Int iMod = iDisplayWidth % MB_SIZE; Int iDisplayWidthRound = (iMod > 0) ? iDisplayWidth + MB_SIZE - iMod : iDisplayWidth; iMod = iDisplayHeight % MB_SIZE; Int iDisplayHeightRound = (iMod > 0) ? iDisplayHeight + MB_SIZE - iMod : iDisplayHeight; m_rctRefFrameY = CRct ( -EXPANDY_REF_FRAME, -EXPANDY_REF_FRAME, EXPANDY_REF_FRAME + iDisplayWidthRound, EXPANDY_REF_FRAME + iDisplayHeightRound ); m_rctRefFrameUV = m_rctRefFrameY.downSampleBy2 (); allocateVOLMembers (iDisplayWidth, iDisplayHeight); // HHI Schueuer if (m_volmd.bSadctDisable) m_pscanSelector = new CInvScanSelector; else m_pscanSelector = new CInvScanSelectorForSADCT(m_rgiCurrMBCoeffWidth); //end HHI // buffer for shape decoding m_pvopcRightMB = new CVOPU8YUVBA (m_volmd.fAUsage, CRct (0, 0, MB_SIZE, MB_SIZE), m_volmd.iAuxCompCount); m_ppxlcRightMBBY = (PixelC*) m_pvopcRightMB->pixelsBY (); m_ppxlcRightMBBUV = (PixelC*) m_pvopcRightMB->pixelsBUV (); //yrchen initialization of idct 10.21.2003 m_pinvdct = new idct; assert(m_pinvdct); m_pinvdct->init();}// for back/forward shape End Sharp(1998-02-10)Int CVideoObjectDecoder::decode (const CVOPU8YUVBA* pvopcBVOPQuant, /*strstreambuf* pistrm */ Bool waitForI, Bool drop){#if 0 if (pistrm != NULL) { delete (istream *)m_pistrm; delete m_pbitstrmIn; delete m_pentrdecSet; m_pistrm = (ifstream *)new istream (pistrm); m_pbitstrmIn = new CInBitStream (*m_pistrm); m_pentrdecSet = new CEntropyDecoderSet (*m_pbitstrmIn); }#endif// RRV m_iRRVScale = 1; // default value// ~RRV //sprite piece should not come here ASSERT ((m_vopmd.SpriteXmitMode == STOP) || ( m_vopmd.SpriteXmitMode == PAUSE)); if (findStartCode () == EOF) return EOF; UInt uiCheck = m_pbitstrmIn -> peekBits (NUMBITS_VOP_START_CODE); if(uiCheck==VSS_END_CODE) return EOF; Bool bCoded = decodeVOPHead (); // set the bounding box here if (waitForI && !(m_vopmd.vopPredType == IVOP)) { return -1; } if (drop && m_vopmd.vopPredType == BVOP) { return -1; } //cout << "\t" << "Time..." << m_t << " (" << m_t / (double)m_volmd.iClockRate << " sec)\n";#ifdef DEBUG_OUTPUT if(bCoded == FALSE) cout << "\tNot coded.\n"; cout.flush ();#endif Bool bPrevRefVopWasCoded = m_bCodedFutureRef; if(m_vopmd.vopPredType==IVOP || m_vopmd.vopPredType==PVOP || (m_uiSprite == 2 && m_vopmd.vopPredType==SPRITE)) // GMC m_bCodedFutureRef = bCoded; // flag used by bvop prediction if (m_vopmd.vopPredType == SPRITE && m_uiSprite == 1) { // GMC decodeSpt (); return TRUE; } // set time stamps for Base/Temporal-Enhc/Spatial-Enhc Layer Modified by Sharp(1998-02-10) if(m_volmd.volType == BASE_LAYER) { if(m_vopmd.vopPredType==IVOP || m_vopmd.vopPredType==PVOP || (m_uiSprite == 2 && m_vopmd.vopPredType==SPRITE)) { // GMC if(bPrevRefVopWasCoded) m_tPastRef = m_tFutureRef; m_tFutureRef = m_t; m_iBCount = 0; } // count B-VOPs if(m_vopmd.vopPredType==BVOP) m_iBCount++; } else if (pvopcBVOPQuant != NULL) { // Spatial Scalability Enhancement Layer/* (98/03/30) modified by SONY */ if(m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0) { if(bPrevRefVopWasCoded) m_tPastRef = m_tFutureRef; m_tFutureRef = m_t; m_iBCount = 0; } if(m_vopmd.vopPredType == PVOP && m_vopmd.iRefSelectCode == 3) { m_tPastRef = m_t; m_tFutureRef = m_t; m_iBCount = 0; }/* (98/03/30) modified by SONY */ // count B-VOPs if(m_vopmd.vopPredType==BVOP) m_iBCount++; } // set time stamps for Base/Temporal-Enhc/Spatial-Enhc Layer End Sharp(1998-02-10) // select reference frames for Base/Temporal-Enhc/Spatial-Enhc Layer Modified by Sharp(1998-02-10) if(bPrevRefVopWasCoded) { if(m_volmd.volType == BASE_LAYER) { updateAllRefVOPs (); // update all reconstructed VOP's } else {//OBSS_SAIT_991015 if (pvopcBVOPQuant == NULL && !m_volmd.bSpatialScalability) // Temporal Scalability Enhancement Layer updateRefVOPsEnhc (); else { // Spatial Scalability Enhancement Layer if (pvopcBVOPQuant != NULL && m_volmd.bSpatialScalability) updateAllRefVOPs (pvopcBVOPQuant); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -