📄 sys_encoder_sesenc.cpp
字号:
for (iVO = m_iFirstVO; iVO <= (Int) m_iLastVO; iVO++, iVOrelative++) { ofstream* rgpostrm [2]; ofstream* rgpostrmTrace [2]; PixelC pxlcObjColor; VOLMode volmd = m_rgvolmd [BASE_LAYER] [iVOrelative]; VOLMode volmd_enhn = m_rgvolmd [ENHN_LAYER] [iVOrelative]; // added by Sharp (98/2/10) ppfAuxSrc = new FILE* [volmd.iAuxCompCount]; rgpfReconAux[0] = new FILE* [volmd.iAuxCompCount]; rgpfReconAux[1] = new FILE* [volmd.iAuxCompCount]; // actually never used getInputFiles ( pfYuvSrc, pfSegSrc, ppfAuxSrc, pfYuvSrcSpatialEnhn, pfSegSrcSpatialEnhn,//OBSS_SAIT_991015 rgpfReconYUV, rgpfReconSeg, rgpfReconAux, rgpostrm, rgpostrmTrace, pxlcObjColor, iVO, volmd, volmd_enhn); // modified by Sharp(98/2/10) CRct rctOrg; CVideoObjectEncoder* rgpvoenc [2]; if (m_rguiSpriteUsage [iVOrelative] == 1) { // change m_rctOrg to sprite size rctOrg = m_rctOrg; m_rctFrame = m_rctOrg; m_rctOrg = findSptRct (iVO); }// NEWPRED if (m_rgvolmd [BASE_LAYER][iVOrelative].bNewpredEnable) g_pNewPredEnc = new CNewPredEncoder();// ~NEWPRED initVOEncoder (rgpvoenc, iVO, rgpostrmTrace);#undef write rgpostrm [BASE_LAYER]->write (rgpvoenc [BASE_LAYER]->pOutStream ()->str (), //VO and VOL header rgpvoenc [BASE_LAYER]->pOutStream ()->pcount ()); if(m_rgbSpatialScalability[iVOrelative]){ rgpostrm[ENHN_LAYER]->write(rgpvoenc [ENHN_LAYER]->pOutStream () ->str(), rgpvoenc [ENHN_LAYER]->pOutStream () ->pcount ()); } // begin: added by Sharp (98/2/12) // for back/forward shape if ( bTemporalScalability ){ initVObfShape (rgpvoenc[ENHN_LAYER]->rgpbfShape, iVO, *volmd_backShape, *vopmd_backShape, *volmd_forwShape, *vopmd_forwShape); // copy pointers rgpvoenc[ENHN_LAYER]->rgpbfShape[0]->m_pchBitsBuffer = rgpvoenc[ENHN_LAYER]->m_pchBitsBuffer; rgpvoenc[ENHN_LAYER]->rgpbfShape[0]->m_pbitstrmOut = rgpvoenc[ENHN_LAYER]->m_pbitstrmOut; rgpvoenc[ENHN_LAYER]->rgpbfShape[0]->m_pentrencSet = rgpvoenc[ENHN_LAYER]->m_pentrencSet; rgpvoenc[ENHN_LAYER]->rgpbfShape[0]->m_pchShapeBitsBuffer = rgpvoenc[ENHN_LAYER]->m_pchShapeBitsBuffer; // Oct 8 rgpvoenc[ENHN_LAYER]->rgpbfShape[0]->m_pbitstrmShape = rgpvoenc[ENHN_LAYER]->m_pbitstrmShape; // rgpvoenc[ENHN_LAYER]->rgpbfShape[0]->m_pbitstrmShapeMBOut = rgpvoenc[ENHN_LAYER]->m_pbitstrmShapeMBOut; // rgpvoenc[ENHN_LAYER]->rgpbfShape[1]->m_pchBitsBuffer = rgpvoenc[ENHN_LAYER]->m_pchBitsBuffer; rgpvoenc[ENHN_LAYER]->rgpbfShape[1]->m_pbitstrmOut = rgpvoenc[ENHN_LAYER]->m_pbitstrmOut; rgpvoenc[ENHN_LAYER]->rgpbfShape[1]->m_pentrencSet = rgpvoenc[ENHN_LAYER]->m_pentrencSet; rgpvoenc[ENHN_LAYER]->rgpbfShape[1]->m_pchShapeBitsBuffer = rgpvoenc[ENHN_LAYER]->m_pchShapeBitsBuffer; // Oct 8 rgpvoenc[ENHN_LAYER]->rgpbfShape[1]->m_pbitstrmShape = rgpvoenc[ENHN_LAYER]->m_pbitstrmShape; // rgpvoenc[ENHN_LAYER]->rgpbfShape[1]->m_pbitstrmShapeMBOut = rgpvoenc[ENHN_LAYER]->m_pbitstrmShapeMBOut; // } // end: added by Sharp (98/2/12) if (m_rguiSpriteUsage [iVO - m_iFirstVO] == 1) { // load sprite data into m_pvopcOrig loadSpt (iVO, rgpvoenc [BASE_LAYER] -> m_pvopcOrig); // encode the initial sprite if (m_SptMode == BASIC_SPRITE) rgpvoenc [BASE_LAYER] -> encode (TRUE, -1, IVOP); else rgpvoenc [BASE_LAYER] -> encodeInitSprite (rctOrg); if (m_rgNumOfPnts [iVOrelative] > 0) { // change m_pvopcRefQ1 to m_pvopcSptQ for warping rgpvoenc [BASE_LAYER] -> swapRefQ1toSpt (); // restore m_pvopcCurrQ size to the normal one m_rctOrg = rctOrg; rgpvoenc [BASE_LAYER] -> changeSizeofCurrQ (rctOrg); } rgpostrm [BASE_LAYER]->write (rgpvoenc [BASE_LAYER]->pOutStream ()->str (), //write sprite unit rgpvoenc [BASE_LAYER]->pOutStream ()->pcount ()); } assert (!m_rctOrg.empty ()); if (rgpvoenc [BASE_LAYER]->m_uiRateControl>=RC_TM5) { assert (!m_rgbSpatialScalability [iVOrelative]); assert (!bTemporalScalability); //assert (volmd.iTemporalRate==1);#ifndef __TRACE_AND_STATS_ cerr << "Compile flag __TRACE_AND_STATS_ required for stats for TM5 rate control." << endl; exit(1);#endif // __TRACE_AND_STATS_ char pchQname[100]; pchQname[0] = 0; //if( m_bRGBfiles ) { // if( m_pchOutStrFiles && m_pchOutStrFiles[0]) sprintf (pchQname, m_pchOutStrFiles, "q", iVO); //} else { if( m_pchOutStrFiles && m_pchOutStrFiles[0]) { sprintf (pchQname, SUB_CMPFILE, m_pchOutStrFiles, iVO, m_pchPrefix); } //} rgpvoenc [BASE_LAYER]->m_tm5rc.tm5rc_init_seq ( pchQname, rgpvoenc [BASE_LAYER]->m_uiRateControl, m_rgvolmd [BASE_LAYER] [iVOrelative].fAUsage, m_rctOrg.width, m_rctOrg.height(), m_rguiBudget [BASE_LAYER] [iVOrelative], // bits per second m_rgvolmd [BASE_LAYER][iVOrelative].dFrameHz / volmd.iTemporalRate // actual frame rate ); } // algorithm for generation of IPB sequences with arbitrary shape // (transparency allows for possible skipped frames) // P prediction across skips is not allowed #define DUMP_CURR 0#define DUMP_PREV 1#define DUMP_NONE 2 Int iRefFrame; Int iDT = volmd.iTemporalRate; Int iDT_enhn = volmd_enhn.iTemporalRate; // added by Sharp (98/2/12) Int iRefInterval = volmd.iBbetweenP + 1; Int iPCount; Bool bObjectExists; const CVOPU8YUVBA* pvopcBaseQuant = NULL; Int iEcount = 0; // added by Sharp (98/2/12) Bool bCachedRefDump = FALSE; Bool bCachedRefCoded = TRUE; Bool bPrevObjectExists = FALSE; // added by Sharp (99/1/27) m_rgpvopcPrevDisp[BASE_LAYER] = NULL; // previously displayed vop pointers m_rgpvopcPrevDisp[ENHN_LAYER] = NULL; for(iRefFrame = m_iFirstFrame; iRefFrame <= m_iLastFrame; iRefFrame += iDT) { // encode initial I frame or non-coded sequence if(rgpvoenc [BASE_LAYER] -> skipTest(iRefFrame,IVOP)) // rate control continue; //encode GOV header added by SONY 980212 // moved down slightly by swinder 980219 //CAUTION:I don't know how GOV header is encoded in sprite mode // re-done by swinder 980511 // gov header is output every n output frames, where n is iGOVperiod if (volmd.iGOVperiod != 0 && ((iRefFrame-m_iFirstFrame) % (volmd.iGOVperiod * volmd.iTemporalRate)) == 0) { rgpvoenc [BASE_LAYER] -> codeGOVHead (iRefFrame - m_iFirstFrame); rgpostrm [BASE_LAYER]->write (rgpvoenc [BASE_LAYER]->pOutStream ()->str (), rgpvoenc [BASE_LAYER]->pOutStream ()->pcount ()); } //980211 // first dump any cached frames, otherwise a non coded frame will be out of order if(bCachedRefDump && (m_rguiSpriteUsage [iVOrelative] == 0 || m_rguiSpriteUsage [iVOrelative] == 2)) // GMC { bCachedRefDump = FALSE; // last ref frame needs to be output#ifndef __OUT_ONE_FRAME_ if ( bCachedRefCoded ) dumpData (rgpfReconYUV [BASE_LAYER], rgpfReconSeg [BASE_LAYER], rgpfReconAux [BASE_LAYER], BASE_LAYER, rgpvoenc[BASE_LAYER] ->pvopcRefQLater(), m_rctOrg, volmd, rgpvoenc[BASE_LAYER] ->m_vopmd.bInterlace); else dumpDataNonCoded(rgpfReconYUV [BASE_LAYER], rgpfReconSeg [BASE_LAYER], rgpfReconAux [BASE_LAYER], BASE_LAYER, m_rctOrg, volmd); if (m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability) dumpData (rgpfReconYUV [ENHN_LAYER], rgpfReconSeg [ENHN_LAYER], rgpfReconAux [ENHN_LAYER], ENHN_LAYER, rgpvoenc[ENHN_LAYER] ->pvopcRefQLater(), m_rctOrgSpatialEnhn, volmd, 0);#endif } int iGOPperiod = (volmd.iPbetweenI + 1) * (volmd.iBbetweenP + 1); if (rgpvoenc [BASE_LAYER]->m_uiRateControl >= RC_TM5) { assert(iGOPperiod!=0); Int npic = (m_iLastFrame - iRefFrame + iDT) / iDT; Int nppic; if(npic>iGOPperiod) npic = iGOPperiod; if (iRefFrame == m_iFirstFrame) { if (npic > (iGOPperiod - volmd.iBbetweenP)) npic = iGOPperiod - volmd.iBbetweenP; nppic = (npic + 1)/(volmd.iBbetweenP + 1); } else { nppic = (npic - 1)/(volmd.iBbetweenP + 1); } rgpvoenc [BASE_LAYER] -> m_tm5rc.tm5rc_init_GOP(nppic, npic - nppic - 1); // np, nb remain } // encode non-coded frames or initial IVOPs // we always dump these out//OBSS_SAIT_991015 if(m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability && (volmd.fAUsage == ONE_BIT)) bObjectExists = loadDataSpriteCheck (iVOrelative,iRefFrame, pfYuvSrc, pfSegSrcSpatialEnhn, pxlcObjColor, rgpvoenc [BASE_LAYER]->m_pvopcOrig, volmd, volmd_enhn); else//~OBSS_SAIT_991015 bObjectExists = loadDataSpriteCheck (iVOrelative,iRefFrame, pfYuvSrc, pfSegSrc, ppfAuxSrc, pxlcObjColor, rgpvoenc [BASE_LAYER]->m_pvopcOrig, volmd); encodeVideoObject(bObjectExists, bObjectExists, iRefFrame, IVOP, DUMP_CURR, iVO, iVOrelative, BASE_LAYER, pfYuvSrc,pfSegSrc,ppfAuxSrc, rgpfReconYUV,rgpfReconSeg,rgpfReconAux, pxlcObjColor, rgpvoenc, volmd, rgpostrm); if (m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability ) { // modified by Sharp (98/2/12) pvopcBaseQuant = rgpvoenc [BASE_LAYER]->pvopcReconCurr ();//OBSS_SAIT_991015 encodeVideoObject (bObjectExists, bObjectExists, iRefFrame, PVOP, DUMP_CURR, iVO, iVOrelative, ENHN_LAYER, pfYuvSrcSpatialEnhn, pfSegSrcSpatialEnhn, /*NULL*/ppfAuxSrc, //OBSSFIX_MAC rgpfReconYUV, rgpfReconSeg, /*NULL*/rgpfReconAux, pxlcObjColor, rgpvoenc, volmd, rgpostrm, pvopcBaseQuant);//~OBSS_SAIT_991015 }// begin: added by Sharp (98/2/12) else if (m_rgbSpatialScalability [iVOrelative] && bTemporalScalability) pBufP2->getBuf( rgpvoenc[BASE_LAYER] );// end: added by Sharp (98/2/12) // go to next frame if this was not coded or we are just coding sprites if(!bObjectExists) continue; // we dumped first frame so rest must be delayed by one for re-order iPCount = volmd.iPbetweenI; Int iWaitInterval = 0; while (TRUE) { // search for next reference frame Int iSearchFrame; for(iSearchFrame = iRefFrame + iDT * iRefInterval + iWaitInterval; iSearchFrame > iRefFrame; iSearchFrame -= iDT) if(iSearchFrame <= m_iLastFrame) {//OBSS_SAIT_991015 if(m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability && (volmd.fAUsage == ONE_BIT)) bObjectExists = loadDataSpriteCheck(iVOrelative,iSearchFrame, pfYuvSrc, pfSegSrcSpatialEnhn, pxlcObjColor, rgpvoenc [BASE_LAYER]->m_pvopcOrig, volmd,volmd_enhn); else//~OBSS_SAIT_991015 bObjectExists = loadDataSpriteCheck(iVOrelative,iSearchFrame, pfYuvSrc, pfSegSrc, ppfAuxSrc, pxlcObjColor, rgpvoenc [BASE_LAYER]->m_pvopcOrig, volmd); break; // found a suitable reference frame // may not be coded } if(iSearchFrame==iRefFrame) break; if (rgpvoenc [BASE_LAYER] -> skipTest(iSearchFrame,iPCount ? PVOP : IVOP)) // rate control { // too early! need to wait a frame iWaitInterval += iDT; continue; } iWaitInterval = 0; CVOPU8YUVBA* pvopcBasePVOPQuant = NULL;// begin: added by Sharp (98/2/12) if ( bTemporalScalability ) if ( pBufP2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28) pBufP1->copyBuf ( *pBufP2 );// end: added by Sharp (98/2/12) // encode the next reference frame // Bool bCachedRefDumpSaveForSpatialScalability = bCachedRefDump; if(iPCount==0) { //added to encode GOV header by SONY 980212 // moved to here by swinder 980219 //CAUTION:I don't know how GOV header is encoded in sprite mode - SONY // update by swinder 980511 if (volmd.iGOVperiod != 0 && ((iSearchFrame-m_iFirstFrame) % (volmd.iGOVperiod * volmd.iTemporalRate)) == 0) {//modified by SONY (98/03/30) rgpvoenc [BASE_LAYER] -> codeGOVHead (iRefFrame - m_iFirstFrame + iDT);//modified by SONY (98/03/30) End /* rgpvoenc [BASE_LAYER] -> codeGOVHead (iSearchFrame - m_iFirstFrame); Original*/ // why was this changed? - swinder rgpostrm [BASE_LAYER]->write (rgpvoenc [BASE_LAYER]->pOutStream ()->str (), rgpvoenc [BASE_LAYER]->pOutStream ()->pcount ()); } //980212 int iGOPperiod = (volmd.iPbetweenI + 1) * (volmd.iBbetweenP + 1); if (rgpvoenc [BASE_LAYER]->m_uiRateControl >= RC_TM5) { assert(iGOPperiod!=0); Int npic = (m_iLastFrame - iRefFrame) / iDT; // include prior b pics (before i-vop) Int nppic; if(npic>iGOPperiod) npic = iGOPperiod; if (iSearchFrame == m_iFirstFrame) { if (npic > (iGOPperiod - volmd.iBbetweenP)) npic = iGOPperiod - volmd.iBbetweenP; nppic = (npic + 1)/(volmd.iBbetweenP + 1); } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -