📄 decoder.cpp
字号:
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) {
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 == 1) {
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() , pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0 );
else // added by Sharp (99/1/28)
dumpNonCodedFrame( pfReconYUV[BASE_LAYER], pfReconSeg[BASE_LAYER], 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 == 1) {
// 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(), pfReconYUV [ENHN_LAYER], pfReconSeg[ENHN_LAYER], pvodec[ENHN_LAYER]->volmd().fAUsage, rctDisplay,
nBits, pvodec [ENHN_LAYER]->vopmd().iVopConstantAlphaValue, pvodec[ENHN_LAYER]->volmd().iEnhnType );
}
else
dumpNonCodedFrame(pfReconYUV[ENHN_LAYER], pfReconSeg[ENHN_LAYER], rctDisplay, nBits);
// end: added by Sharp (99/1/28)
// pvodec [ENHN_LAYER]->dumpDataAllFrame (pfReconYUV [ENHN_LAYER], pfReconSeg [ENHN_LAYER], rctDisplay); // deleted by Sharp (99/1/28)
#else
pvodec [ENHN_LAYER]->dumpDataOneFrame(argv, bScalability, rctDisplay);
#endif
// } // added by Sharp (98/10/26) // deleted by Sharp (99/1/25)
}
tNextEnhc = pvodec[ENHN_LAYER] -> senseTime ();
}
}
// begin: added by Sharp (98/11/11)
#ifndef __OUT_ONE_FRAME_
if ( iEof != FALSE )
dumpFrame (pvodec[BASE_LAYER]->pvopcReconCurr() , pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0 );
else
dumpNonCodedFrame(pfReconYUV[BASE_LAYER], pfReconSeg[BASE_LAYER], rctDisplay, nBits);
#endif
// end: added by Sharp (98/11/11)
tNextBase = pvodec[BASE_LAYER] -> senseTime ();
}
if(bScalability && (tNextEnhc = pvodec[ENHN_LAYER] -> senseTime ()) != EOF) { // modified by Sharp (99/1/25)
pvodec[ENHN_LAYER] -> bufferB2flush ();
// tNextEnhc = pvodec[ENHN_LAYER] -> senseTime (); // deleted by Sharp (99/1/25)
while((tPvopBase > 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 == 1) {
// should be changed to background_composition flag later.
printf("============== background composition (2)\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/11/18) // 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(), pfReconYUV [ENHN_LAYER], pfReconSeg[ENHN_LAYER], pvodec[ENHN_LAYER]->volmd().fAUsage, rctDisplay,
nBits, pvodec [ENHN_LAYER]->vopmd().iVopConstantAlphaValue, pvodec[ENHN_LAYER]->volmd().iEnhnType );
else
dumpNonCodedFrame(pfReconYUV[ENHN_LAYER], pfReconSeg[ENHN_LAYER], rctDisplay, nBits);
// end: added by Sharp (99/1/28)
// pvodec [ENHN_LAYER]->dumpDataAllFrame (pfReconYUV [ENHN_LAYER], pfReconSeg [ENHN_LAYER], rctDisplay); // deleted by Sharp (99/1/28)
#else
pvodec [ENHN_LAYER]->dumpDataOneFrame(argv, bScalability, rctDisplay);
#endif
// }// added by Sharp (98/11/18) // deleted by Sharp (99/1/25)
}
tNextEnhc = pvodec[ENHN_LAYER] -> senseTime ();
}
// begin: deleted by Sharp (99/1/25)
/*
if((tPvopBase == tNextEnhc) && (tNextEnhc != EOF)) { // for Spatial Scalability
pvodec[ENHN_LAYER] -> copyBufP2ToB1 ();
iEof = pvodec[ENHN_LAYER] -> decode ();
nEnhcFrames ++;
}
*/
// end: deleted by Sharp (99/1/25)
// begin: added by Sharp (99/1/20)
iEof = tNextBase;
#ifndef __OUT_ONE_FRAME_
// begin: added by Sharp (99/1/28)
if ( iEof == EOF )
if ( bCachedRefFrameCoded )
// end: added by Sharp (99/1/28)
dumpFrame (pvodec[BASE_LAYER]->pvopcRefQLater() , pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0 );
// begin: added by Sharp (99/1/28)
else
dumpNonCodedFrame(pfReconYUV[BASE_LAYER], pfReconSeg[BASE_LAYER], rctDisplay, nBits);
// end: added by Sharp (99/1/28)
#endif
// end: added by Sharp (99/1/20)
pvodec[ENHN_LAYER] -> bufferB1flush ();
// Enhancement Layer after Base BVOP
if (tNextBase == EOF && tNextEnhc != EOF) {
pvodec[ENHN_LAYER] -> copyBufP2ToB1 ();
while(tNextEnhc != EOF) {
iEof = pvodec[ENHN_LAYER] -> decode ();
nEnhcFrames ++;
if (pvodec [ENHN_LAYER] -> volmd ().fAUsage != RECTANGLE) {
// for background composition
if(pvodec [ENHN_LAYER] -> volmd ().iEnhnType == 1) {
// should be changed to background_composition flag later.
printf("============== background composition (2)\n");
pvodec [ENHN_LAYER] -> BackgroundComposition(argv, bScalability, rctDisplay.width, rctDisplay.height (), pfReconYUV [ENHN_LAYER]); // Modified after 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/11/18) // deleted by Sharp (99/1/25)
#ifndef __OUT_ONE_FRAME_
if ( iEof != FALSE )
dumpFrame (pvodec[ENHN_LAYER]->pvopcReconCurr(), pfReconYUV [ENHN_LAYER], pfReconSeg[ENHN_LAYER], pvodec[ENHN_LAYER]->volmd().fAUsage, rctDisplay,
nBits, pvodec [ENHN_LAYER]->vopmd().iVopConstantAlphaValue, pvodec[ENHN_LAYER]->volmd().iEnhnType );
else
dumpNonCodedFrame(pfReconYUV[ENHN_LAYER], pfReconSeg[ENHN_LAYER], rctDisplay, nBits);
// pvodec [ENHN_LAYER]->dumpDataAllFrame (pfReconYUV [ENHN_LAYER], pfReconSeg [ENHN_LAYER], rctDisplay);
#else
pvodec [ENHN_LAYER]->dumpDataOneFrame(argv, bScalability, rctDisplay);
#endif
// }// added by Sharp (98/11/18) // deleted by Sharp (99/1/25)
}
tNextEnhc = pvodec[ENHN_LAYER] -> senseTime ();
}
pvodec[ENHN_LAYER] -> bufferB1flush ();
}
}
// begin: deleted by Sharp (99/1/28)
// if (bScalability)
// pvodec[ENHN_LAYER] -> bufferP1flush ();
// end: deleted by Sharp (99/1/28)
iEof = tNextBase;
// begin: deleted by Sharp (99/1/25)
/*
// begin: added by Sharp (98/11/11)
#ifndef __OUT_ONE_FRAME_
if ( iEof == EOF )
if ( iEof != FALSE )
dumpFrame (pvodec[BASE_LAYER]->pvopcRefQLater() , pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0 );
else
dumpNonCodedFrame(pfReconYUV[ENHN_LAYER], pfReconSeg[ENHN_LAYER], rctDisplay, nBits);
#endif
// end: added by Sharp (98/11/11)
*/
// end: deleted by Sharp (99/1/25)
}
#ifdef __PC_COMPILER_
Int tickAfter = ::GetTickCount ();
printf ("Total time: %d\n", tickAfter - tickBegin);
Double dAverage = (Double) (tickAfter - tickBegin) / (Double) (nBaseFrames + nEnhcFrames);
printf ("Total frames: %d\tAverage time: %.6lf\n", nBaseFrames + nEnhcFrames, dAverage);
printf ("FPS %.6lf\n", 1000.0 / dAverage);
#endif // __PC_COMPILER_
#ifndef __OUT_ONE_FRAME_
fclose (pfReconYUV[BASE_LAYER]);
if (pvodec[BASE_LAYER]->volmd ().fAUsage != RECTANGLE)
fclose (pfReconSeg [BASE_LAYER]);
#endif
delete pvodec[BASE_LAYER];
if (bScalability) {
#ifndef __OUT_ONE_FRAME_
fclose (pfReconYUV[ENHN_LAYER]);
if (pvodec[ENHN_LAYER]->volmd ().fAUsage != RECTANGLE)
fclose (pfReconSeg [ENHN_LAYER]);
#endif
delete pvodec[ENHN_LAYER];
}
}
return 0;
}
Void dumpFrame (const CVOPU8YUVBA* pvopcQuant, FILE* pfYUV, FILE* pfSeg, AlphaUsage fAUsage, CRct& rct, UInt nBits, Int iAlphaScale, Int DumpSkip)
{
if ( DumpSkip == 0 ){
pvopcQuant->getPlane (Y_PLANE)->dump (pfYUV, rct);
pvopcQuant->getPlane (U_PLANE)->dump (pfYUV, rct / 2);
pvopcQuant->getPlane (V_PLANE)->dump (pfYUV, rct / 2);
}
if(pfSeg!=NULL)
{
if (fAUsage == ONE_BIT)
pvopcQuant->getPlane (BY_PLANE)->dump (pfSeg, rct, iAlphaScale);
else if (fAUsage == EIGHT_BIT)
pvopcQuant->getPlane (A_PLANE)->dumpWithMask (pfSeg, pvopcQuant->getPlane (BY_PLANE),
rct, iAlphaScale);
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -