📄 decoder.cpp
字号:
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;
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;
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,
nBits, pvodec [ENHN_LAYER]->vopmd().iVopConstantAlphaValue, pvodec[ENHN_LAYER]->volmd().iEnhnType, 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -