📄 decoder.cpp
字号:
pvodec[ENHN_LAYER] -> setShapeMode(pBase_stack_Baseshpmd); pBase_tmp_mvBaseBY = pvodec [BASE_LAYER] ->getmvBaseBY(); pvodec [ENHN_LAYER] -> setmvBaseBY(pBase_stack_mvBaseBY); pvodec [ENHN_LAYER] -> setMBXYRef(iBase_stack_x, iBase_stack_y); pvodec [ENHN_LAYER] -> setBaseRct(pBase_stack_rctBase); } //~for OBSS BVOP_BASE : stack out iEof = pvodec [ENHN_LAYER] -> decode (pBASE_stackVOP); // for background composition with base layer (OBSS partial enhancement mode) BGComposition = FALSE;//OBSSFIX_MODE3 if( pvodec [ENHN_LAYER] -> volmd().iHierarchyType == 0 && pvodec [ENHN_LAYER] -> volmd().iEnhnType == 1 && pvodec [ENHN_LAYER] -> vopmd().bBGComposition == 1) BGComposition = pvodec [ENHN_LAYER] -> BackgroundCompositionSS(rctDisplay_SSenh.width, rctDisplay_SSenh.height (), pfReconYUV[ENHN_LAYER], pfReconSeg[ENHN_LAYER],pBASE_stackVOP); // if( pvodec [ENHN_LAYER] -> volmd().iHierarchyType == 0 && // pvodec [ENHN_LAYER] -> volmd().iEnhnType == 1 && // pvodec [ENHN_LAYER] -> volmd().iuseRefShape == 0 ) // BGComposition = pvodec [ENHN_LAYER] -> BackgroundComposition(rctDisplay_SSenh.width, rctDisplay_SSenh.height (), pfReconYUV[ENHN_LAYER], pfReconSeg[ENHN_LAYER]); //~OBSSFIX_MODE3 //for OBSS BVOP_BASE : free stack//OBSSFIX_MODE3 if(pvodec[ENHN_LAYER]->volmd().fAUsage == ONE_BIT && !(pvodec[ENHN_LAYER]->volmd().iHierarchyType == 0 && pvodec[ENHN_LAYER]->volmd().iuseRefShape == 1 && pvodec[ENHN_LAYER]->volmd().iEnhnType != 0 )) {// if(pvodec[ENHN_LAYER]->volmd().fAUsage == ONE_BIT) {//~OBSSFIX_MODE3 pvodec[ENHN_LAYER] -> setShapeMode(pBase_tmp_Baseshpmd); delete [] pBase_stack_Baseshpmd; pBase_stack_Baseshpmd = NULL; pBase_tmp_Baseshpmd = NULL; pvodec [ENHN_LAYER] -> setmvBaseBY(pBase_tmp_mvBaseBY); delete [] pBase_stack_mvBaseBY; pBase_stack_mvBaseBY = NULL; pBase_tmp_mvBaseBY = NULL; } //~for OBSS BVOP_BASE : free stack delete pBASE_stackVOP; pBASE_stackVOP = NULL; iBase_stackTime = -1; if(iEof!=EOF) nFrames++; // include enhancement layer if(iEof==FALSE) dumpFrameNonCoded(pfReconYUV [ENHN_LAYER], pfReconSeg[ENHN_LAYER], ppfReconAux[ENHN_LAYER], pvodec [ENHN_LAYER]->volmd().iAuxCompCount, rgpvopcPrevDisp[ENHN_LAYER], pvodec[ENHN_LAYER]->volmd().fAUsage, rctDisplay_SSenh, nBits); if (iEof != EOF && iEof!=FALSE) //for OBSS partial enhancement mode//OBSSFIX_MODE3 if(!(pvodec [ENHN_LAYER]->volmd().iHierarchyType == 0 && pvodec [ENHN_LAYER] -> volmd().iEnhnType == 1 && BGComposition)) // if(!(pvodec [ENHN_LAYER]->volmd().iHierarchyType == 0 && pvodec [ENHN_LAYER] -> volmd().iEnhnType == 1 && pvodec [ENHN_LAYER] -> volmd().iuseRefShape == 0 && BGComposition)) //~OBSSFIX_MODE3 dumpFrame (pvodec [ENHN_LAYER]->pvopcReconCurr (), &(rgpvopcPrevDisp[ENHN_LAYER]), pfReconYUV [ENHN_LAYER], pfReconSeg[ENHN_LAYER], NULL, 0, pvodec[ENHN_LAYER]->volmd().fAUsage, rctDisplay_SSenh, nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0, 0); // still base layer } // if( iBase_stackTime != -1 && iBase_stackTime == pvodec[ENHN_LAYER] -> senseTime ()){ } //else if(iBASEVOP_time != -1 &&iBASEVOP_time == iENHNVOP_time){//~OBSS_SAIT_991015 //_SS_BASE_BVOP_ } }#ifdef __PC_COMPILER_ Int tickAfter = ::GetTickCount (); printf ("Total time: %d\n", tickAfter - tickBegin); Double dAverage = (Double) (tickAfter - tickBegin) / (Double) (nFrames); printf ("Total frames: %d\tAverage time: %.6lf\n", nFrames, dAverage); printf ("FPS %.6lf\n", 1000.0 / dAverage);#endif // __PC_COMPILER_ fclose (pfReconYUV [BASE_LAYER]); if (pvodec [BASE_LAYER]->volmd ().fAUsage != RECTANGLE) fclose (pfReconSeg[BASE_LAYER]); //OBSS_SAIT_991015 delete pvodec [BASE_LAYER]; if (bScalability) { //OBSS_SAIT_991015 if (pvodec [ENHN_LAYER]->volmd ().fAUsage != RECTANGLE) fclose (pfReconSeg[ENHN_LAYER]); //~OBSS_SAIT_991015 fclose (pfReconYUV [ENHN_LAYER]); delete pvodec [ENHN_LAYER]; } } else { // loop for temporal scalability CVideoObjectDecoder* pvodec[2]; pvodec[BASE_LAYER] = new CVideoObjectDecoder (argv[1], rctDisplay.width, rctDisplay.height (), NULL, &main_short_video_header); // modified by Sharp (98/7/16) UInt nBits = pvodec [BASE_LAYER]->volmd ().nBits; // added by Sharp (98/11/11) if(bScalability){ pvodec[ENHN_LAYER] = new CVideoObjectDecoder (argv[2], rctDisplay.width, rctDisplay.height (), NULL, &main_short_video_header); // modified by Sharp (98/7/16) // for back/forward shape pvodec[ENHN_LAYER]->rgpbfShape[0] = new CVideoObjectDecoder (rctDisplay.width, rctDisplay.height ()); pvodec[ENHN_LAYER]->rgpbfShape[1] = new CVideoObjectDecoder (rctDisplay.width, rctDisplay.height ()); pvodec[BASE_LAYER]->setClockRateScale( pvodec[ENHN_LAYER] ); // copy pointers pvodec[ENHN_LAYER]->copyTobfShape (); } // begin changes from Norio Ito 8/16/99 if (pvodec [ENHN_LAYER]-> volmd ().fAUsage != RECTANGLE && pvodec [BASE_LAYER] -> volmd ().fAUsage != RECTANGLE && pvodec[ENHN_LAYER] -> volmd().iEnhnType == 1) { pvodec[ENHN_LAYER] -> setEnhnType ( 2 ); printf("EnhnType = %d\n", pvodec [ENHN_LAYER]-> volmd ().iEnhnType); } // end changes from Norio Ito Char pchTmp [100]; FILE* pfReconYUV [2]; // following two lines are swapped by Sharp (98/10/26)#ifndef __OUT_ONE_FRAME_ sprintf (pchTmp, "%s.yuv", argv [2 + bScalability]); pfReconYUV [BASE_LAYER] = fopen (pchTmp, "wb"); fatal_error("cant open output yuv file",pfReconYUV [BASE_LAYER] != NULL); if (bScalability) {// sprintf (pchTmp, "%s_e.yuv", argv [2 + bScalability]); // deleted by Sharp (98/10/26)// pfReconYUV [ENHN_LAYER]= fopen (pchTmp, "wb"); // deleted by Sharp (98/10/26) pfReconYUV [ENHN_LAYER] = pfReconYUV [BASE_LAYER]; // added by Sharp (98/10/26) fatal_error("cant open enhancement layer output yuv file",pfReconYUV [ENHN_LAYER] != NULL); } sprintf (pchTmp, "%s.seg", argv [2 + bScalability]); FILE* pfReconSeg [2]; if (pvodec [BASE_LAYER]-> volmd ().fAUsage != RECTANGLE) { pfReconSeg [BASE_LAYER] = fopen (pchTmp, "wb"); fatal_error("cant open output seg file",pfReconSeg [BASE_LAYER] != NULL); } if (bScalability) { if (pvodec [ENHN_LAYER]-> volmd ().fAUsage != RECTANGLE && pvodec [BASE_LAYER] -> volmd ().fAUsage == RECTANGLE) { // updated from Norio Ito if (pvodec [ENHN_LAYER]-> volmd ().iEnhnType == 1) { // added by Sharp (98/10/26) sprintf (pchTmp, "%s_e.seg", argv [2 + bScalability]); pfReconSeg [ENHN_LAYER]= fopen (pchTmp, "wb"); } else // added by Sharp (98/10/26) pfReconSeg [ENHN_LAYER]= pfReconSeg [BASE_LAYER]; // added by Sharp (98/10/26) fatal_error("cant open output enhancement layer seg file",pfReconSeg [ENHN_LAYER] != NULL); } }// begin: deleted by Sharp (98/10/26)// if (bScalability) // if (pvodec [ENHN_LAYER]-> volmd ().iEnhnType == 1) {// FILE *pfTemp;// sprintf (pchTmp, "%s_bgc.yuv", argv [2 + bScalability]);// pfTemp = fopen (pchTmp, "wb"); // clear file pointer for background composition// fclose(pfTemp);// }// end: delted by Sharp (98/10/26)#endif // for back/forward shape output FILE* pfTestSeg = NULL; if (bScalability) if (pvodec [ENHN_LAYER]-> volmd ().iEnhnType != 0) { // change for Norio Ito sprintf (pchTmp, "%s.bfseg", argv [2 + bScalability]); pfTestSeg = fopen (pchTmp, "wb"); //reconstructed Seg file(bfShape) fatal_error("cant open output bfseg file",pfTestSeg!=NULL); } int iEof = 1;#ifdef __PC_COMPILER_ Int tickBegin = ::GetTickCount ();#endif // __PC_COMPILER_ Time tPvopBase, tNextBase, tNextEnhc = 0; int nBaseFrames = 0; int nEnhcFrames = 0; Bool bCacheRefFrame = FALSE; // added by Sharp (98/11/18) Bool bCachedRefFrameCoded = FALSE; // added by Sharp (99/1/28) tNextBase = pvodec[BASE_LAYER] -> senseTime(); while (iEof != EOF) { if (pvodec[BASE_LAYER] -> getPredType () != BVOP) { // for bitstreams stopped at BVOP iEof = pvodec[BASE_LAYER] -> decode (); if(iEof == EOF) break; if(bScalability) pvodec[BASE_LAYER] -> updateBuffVOPsBase (pvodec[ENHN_LAYER]); nBaseFrames ++; // Output BASE_LAYER#ifndef __OUT_ONE_FRAME_// begin: added by Sharp (98/11/11) if ( bCacheRefFrame ) { // modified by by Sharp (98/11/18) if ( bCachedRefFrameCoded ) // added by Sharp (99/1/28) dumpFrame (pvodec[BASE_LAYER]->pvopcRefQPrev() , &(rgpvopcPrevDisp[BASE_LAYER]), pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], NULL, 0, pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay, nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0 , pvodec [BASE_LAYER]->vopmd().bInterlace); else // added by Sharp (99/1/28) dumpFrameNonCoded( pfReconYUV[BASE_LAYER], pfReconSeg[BASE_LAYER], ppfReconAux[BASE_LAYER], pvodec [BASE_LAYER]->volmd().iAuxCompCount, rgpvopcPrevDisp[BASE_LAYER], pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay, nBits); // added by Sharp (99/1/28) } // begin: added by Sharp (98/11/18) else { bCacheRefFrame = TRUE; } // end: added by Sharp (98/11/18)// end: added by Sharp (98/11/11)// pvodec [BASE_LAYER]->dumpDataAllFrame (pfReconYUV [BASE_LAYER], pfReconSeg [BASE_LAYER], rctDisplay); // deleted by Sharp (98/11/11)#else pvodec [BASE_LAYER]->dumpDataOneFrame(argv, bScalability, rctDisplay);#endif bCachedRefFrameCoded = (iEof != FALSE); // added by Sharp(99/1/28) tPvopBase = pvodec[BASE_LAYER] -> getTime (); } else { // for bitstreams stopped at BVOP tPvopBase = MAX_TIME; pvodec[BASE_LAYER] -> copyRefQ1ToQ0 (); } tNextBase = pvodec[BASE_LAYER] -> senseTime (); while((tPvopBase > tNextBase) && (tNextBase != EOF)) { iEof = pvodec[BASE_LAYER] -> decode (); if(bScalability) pvodec[BASE_LAYER] -> updateBuffVOPsBase (pvodec[ENHN_LAYER]); // Output BASE_LAYER if (iEof != EOF) { nBaseFrames ++; // begin: deleted by Sharp (98/11/11)// #ifndef __OUT_ONE_FRAME_// pvodec [BASE_LAYER]->dumpDataAllFrame (pfReconYUV [BASE_LAYER], pfReconSeg [BASE_LAYER], rctDisplay); // deleted by Sharp (98/11/11)// #else// end: deleted by Sharp (98/11/11)#ifdef __OUT_ONE_FRAME_ // added by Sharp (98/11/11) pvodec [BASE_LAYER]->dumpDataOneFrame(argv, bScalability, rctDisplay);#endif } if(bScalability && tNextEnhc != EOF) { tNextEnhc = pvodec[ENHN_LAYER] -> senseTime (); while((tNextBase > tNextEnhc) && (tNextEnhc != EOF)) { iEof = pvodec[ENHN_LAYER] -> decode (); nEnhcFrames ++; if (pvodec [ENHN_LAYER] -> volmd ().fAUsage != RECTANGLE) { // for background composition if(pvodec [ENHN_LAYER] -> volmd ().iEnhnType != 0) { // change for Norio Ito // should be changed to background_composition flag later. printf("============== background composition (1)\n"); pvodec [ENHN_LAYER] -> BackgroundComposition(argv, bScalability, rctDisplay.width, rctDisplay.height (), pfReconYUV[ENHN_LAYER]); // modified by Sharp (98/10/26) } // for back/forward shape if(pvodec [ENHN_LAYER] -> vopmd ().iLoadBakShape) { printf("---------- output backward shape\n"); const CVOPU8YUVBA* pvopcQuant = pvodec [ENHN_LAYER]->rgpbfShape[0]->pvopcReconCurr (); pvopcQuant->getPlane (BY_PLANE)->dump (pfTestSeg, rctDisplay); } if(pvodec [ENHN_LAYER] -> vopmd ().iLoadForShape) { printf("---------- output forward shape\n"); const CVOPU8YUVBA* pvopcQuant = pvodec [ENHN_LAYER]->rgpbfShape[1]->pvopcReconCurr (); pvopcQuant->getPlane (BY_PLANE)->dump (pfTestSeg, rctDisplay); } } // Output ENHN_LAYER if (iEof != EOF) {// if ( pvodec [ENHN_LAYER] -> volmd ().iEnhnType != 1 ){ // added by Sharp (98/10/26) //deleted by Sharp (99/1/25)#ifndef __OUT_ONE_FRAME_// begin: added by Sharp (99/1/28) if ( iEof != FALSE ){ dumpFrame (pvodec[ENHN_LAYER]->pvopcReconCurr(), &(rgpvopcPrevDisp[ENHN_LAYER]), pfReconYUV [ENHN_LAYER], pfReconSeg[ENHN_LAYER], NULL, 0, pvodec[ENHN_LAYER]->volmd().fAUsage, rctDisplay,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -