📄 app_decoder_decoder.cpp
字号:
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]); pfReconYUV [ENHN_LAYER]= fopen (pchTmp, "wb"); fatal_error("cant open enhancement layer output yuv file",pfReconYUV [ENHN_LAYER] != NULL); } //OBSS_SAIT_991015 FILE* pfReconSeg[2]; pfReconSeg[0] = NULL; pfReconSeg[1] = NULL; sprintf (pchTmp, "%s.seg", argv [2 + bScalability]); if (pvodec [BASE_LAYER]-> volmd ().fAUsage != RECTANGLE) { pfReconSeg[BASE_LAYER] = fopen (pchTmp, "wb"); fatal_error("cant open output seg file",pfReconSeg[BASE_LAYER] != NULL); } // MAC (SB) 1-Dec-99 if (pvodec [BASE_LAYER]-> volmd ().fAUsage == EIGHT_BIT) { Int iAuxCompCount = pvodec [BASE_LAYER]-> volmd ().iAuxCompCount; ppfReconAux[0] = new FILE* [iAuxCompCount]; ppfReconAux[1] = new FILE* [iAuxCompCount]; for(Int iAuxComp=0; iAuxComp<iAuxCompCount; iAuxComp++ ) { sprintf (pchTmp, "%s.%d.aux", argv [2 + bScalability], iAuxComp); ppfReconAux[BASE_LAYER][iAuxComp] = fopen (pchTmp, "wb"); fatal_error("cant open output seg file",ppfReconAux[BASE_LAYER][iAuxComp] != NULL); } } //~MAC if (bScalability){ sprintf (pchTmp, "%s_e.seg", argv [2 + bScalability]); if (pvodec [ENHN_LAYER]-> volmd ().fAUsage != RECTANGLE) { pfReconSeg[ENHN_LAYER] = fopen (pchTmp, "wb"); fatal_error("cant open output seg file",pfReconSeg[ENHN_LAYER] != NULL); } } //~OBSS_SAIT_991015 Int iEof = 1; Int nFrames = 0; const CVOPU8YUVBA* pvopcQuant;#ifdef __PC_COMPILER_ Int tickBegin = ::GetTickCount ();#endif // __PC_COMPILER_ Bool bCachedRefFrame = FALSE; Bool bCachedRefFrameCoded = FALSE; //OBSS_SAIT_991015 //_SS_BASE_BVOP_ Int iBASEVOP_time = 0; Int iBASEVOP_PredType = 0; //~OBSS_SAIT_991015 //_SS_BASE_BVOP_ while (iEof != EOF) { if (main_short_video_header) // Added by KPN for short headers { fprintf(stderr,"Frame number: %d\n", nFrames); iEof = pvodec [BASE_LAYER] -> h263_decode (false); } else iEof = pvodec [BASE_LAYER] -> decode (); if (iEof != EOF) nFrames++; if(pvodec [BASE_LAYER] -> fSptUsage () == 1) { // sprite if(iEof != EOF) { pvopcQuant = pvodec [BASE_LAYER]->pvopcReconCurr(); dumpFrame (pvopcQuant, &(rgpvopcPrevDisp[BASE_LAYER]), pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], ppfReconAux[BASE_LAYER], pvodec [BASE_LAYER]->volmd().iAuxCompCount, pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay, nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0, pvodec [BASE_LAYER]->vopmd().bInterlace); //OBSS_SAIT_991015 } } else { if(iEof == EOF) { // dump final cached frame if present if(bCachedRefFrame) { bCachedRefFrame = FALSE; if(bCachedRefFrameCoded) { pvopcQuant = pvodec [BASE_LAYER]->pvopcRefQLater(); // future reference dumpFrame (pvopcQuant, &(rgpvopcPrevDisp[BASE_LAYER]), pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], ppfReconAux[BASE_LAYER], pvodec [BASE_LAYER]->volmd().iAuxCompCount, pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay, nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0, pvodec [BASE_LAYER]->vopmd().bInterlace); //OBSS_SAIT_991015 } else // non coded 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); //OBSS_SAIT_991015 } } else { // dump if bvop if(pvodec[BASE_LAYER]->vopmd().vopPredType == BVOP) { // BVOP if(iEof != FALSE) { pvopcQuant = pvodec [BASE_LAYER]->pvopcReconCurr(); // current vop dumpFrame (pvopcQuant, &(rgpvopcPrevDisp[BASE_LAYER]), pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], ppfReconAux[BASE_LAYER], pvodec [BASE_LAYER]->volmd().iAuxCompCount, pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay, nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0, pvodec [BASE_LAYER]->vopmd().bInterlace); //OBSS_SAIT_991015 } else // non coded BVOP 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); //OBSS_SAIT_991015 } else { // not a BVOP, so dump any previous cached frame if(bCachedRefFrame) { bCachedRefFrame = FALSE; if(bCachedRefFrameCoded) { pvopcQuant = pvodec [BASE_LAYER]->pvopcRefQPrev(); // past reference dumpFrame (pvopcQuant, &(rgpvopcPrevDisp[BASE_LAYER]), pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], ppfReconAux[BASE_LAYER], pvodec [BASE_LAYER]->volmd().iAuxCompCount, pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay, nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0, pvodec [BASE_LAYER]->vopmd().bInterlace); //OBSS_SAIT_991015 } else // non coded 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); //OBSS_SAIT_991015 } // cache current reference bCachedRefFrame = TRUE; bCachedRefFrameCoded = (iEof != FALSE); } } } if (bSpatialScalable == TRUE) {//OBSS_SAIT_991015 //_SS_BASE_BVOP_ if(iEof == FALSE){ pvopcQuant = NULL; if(pvodec[BASE_LAYER]->volmd().fAUsage == ONE_BIT){ iBASEVOP_time = pvodec[BASE_LAYER]->show_current_time(); iBASEVOP_PredType = pvodec[BASE_LAYER]->vopmd().vopPredType; } } else { pvopcQuant = pvodec [BASE_LAYER]->pvopcReconCurr(); //Added by SONY 98/11/25 iBASEVOP_time = pvodec[BASE_LAYER]->show_current_time(); iBASEVOP_PredType = pvodec[BASE_LAYER]->vopmd().vopPredType; } //These static parameters will be used in the case BVOP is available in the BASE_LAYER (for spatial scalability) static CVOPU8YUVBA* pBASE_stackVOP=NULL; //Temporal buffer of BASELAYER reconstructed image static Int iBase_stackTime = -1; static CRct pBase_stack_rctBase; Int iENHNVOP_time = pvodec[ENHN_LAYER] -> senseTime (); static ShapeMode* pBase_stack_Baseshpmd = NULL; static ShapeMode* pBase_tmp_Baseshpmd = NULL; static CMotionVector* pBase_stack_mvBaseBY = NULL; static CMotionVector* pBase_tmp_mvBaseBY = NULL; static Int iBase_stack_x, iBase_stack_y; Bool BGComposition = FALSE; //for OBSS partial enhancement mode if (iBASEVOP_time != iENHNVOP_time && iBASEVOP_PredType !=BVOP ){ //stack YUV images and paramters pBase_stack_rctBase = pvodec [BASE_LAYER] -> getBaseRct(); iBase_stackTime = iBASEVOP_time; //for OBSS BVOP_BASE : 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 if(iEof) pBASE_stackVOP = new CVOPU8YUVBA (*pvopcQuant, pvodec[BASE_LAYER]->volmd().fAUsage, (pvodec[BASE_LAYER]->pvopcQuantCurr())->whereY()); iBase_stack_x = pvodec [BASE_LAYER] -> getMBXRef(); iBase_stack_y = pvodec [BASE_LAYER] -> getMBYRef(); pBase_stack_Baseshpmd = new ShapeMode[iBase_stack_x*iBase_stack_y]; pBase_stack_mvBaseBY = new CMotionVector[iBase_stack_x*iBase_stack_y]; for(Int j=0;j<iBase_stack_y;j++){ for(Int i=0;i<iBase_stack_x;i++){ pBase_stack_Baseshpmd[j*iBase_stack_x+i] = (pvodec[BASE_LAYER] ->shapemd())[j*iBase_stack_x+i]; pBase_stack_mvBaseBY[j*iBase_stack_x+i] = (pvodec [BASE_LAYER] ->getmvBaseBY())[j*iBase_stack_x+i]; } } } //OBSSFIX_MODE3 else if(pvodec[ENHN_LAYER]->volmd().fAUsage == RECTANGLE || (pvodec[ENHN_LAYER]->volmd().iHierarchyType == 0 && pvodec[ENHN_LAYER]->volmd().iuseRefShape == 1 && pvodec[ENHN_LAYER]->volmd().iEnhnType != 0 )){ if(pvodec[BASE_LAYER]->volmd().fAUsage == RECTANGLE) pBASE_stackVOP= new CVOPU8YUVBA (*pvopcQuant, pvodec[BASE_LAYER]->volmd().fAUsage, pBase_stack_rctBase); else if(iEof) pBASE_stackVOP = new CVOPU8YUVBA (*pvopcQuant, pvodec[BASE_LAYER]->volmd ().fAUsage, (pvodec[BASE_LAYER]->pvopcQuantCurr())->whereY());// else if(pvodec[ENHN_LAYER]->volmd().fAUsage == RECTANGLE){// pBASE_stackVOP = new CVOPU8YUVBA (*pvopcQuant, pvodec[BASE_LAYER]->volmd().fAUsage, pBase_stack_rctBase);//~OBSSFIX_MODE3 } //~for OBSS BVOP_BASE : stack } else if( iBASEVOP_time != -1 &&iBASEVOP_time == iENHNVOP_time){ //decode VOP using currentry decoded Base layer image if(pvodec[ENHN_LAYER]->volmd().fAUsage == ONE_BIT) { pvodec[ENHN_LAYER] -> setShapeMode(pvodec[BASE_LAYER] ->shapemd()); CMotionVector* pmvBaseBY; pmvBaseBY = pvodec [BASE_LAYER] ->getmvBaseBY(); pvodec [ENHN_LAYER] -> setmvBaseBY(pmvBaseBY); Int x, y; x = pvodec [BASE_LAYER] -> getMBBaseXRef(); y = pvodec [BASE_LAYER] -> getMBBaseYRef(); pvodec [ENHN_LAYER] -> setMBXYRef(x, y); CRct prctBase; prctBase = pvodec [BASE_LAYER] -> getBaseRct(); pvodec [ENHN_LAYER] -> setBaseRct(prctBase); } // if base layer is non coded, pvopcQuant=NULL, but enh layer should also be non coded. iEof = pvodec [ENHN_LAYER] -> decode (pvopcQuant); // for background composition (base layer(background) + partial enhancement layer) 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], pvopcQuant); // 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 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 ()){ //decode VOP using stacked VOP. //for OBSS BVOP_BASE : stack out//OBSSFIX_MODE3 if(pvodec[ENHN_LAYER]->volmd().fAUsage == ONE_BIT && !(pvodec[ENHN_LAYER]->volmd().iHierarchyType == 0 && pvodec[ENHN_LAYER]->volmd().iEnhnType != 0 && pvodec[ENHN_LAYER]->volmd().iuseRefShape == 1)) {// if(pvodec[ENHN_LAYER]->volmd().fAUsage == ONE_BIT) {//~OBSSFIX_MODE3 pBase_tmp_Baseshpmd = pvodec[BASE_LAYER] ->shapemd(); pvodec[ENHN_LAYER] -> setShapeMode(pBase_stack_Baseshpmd);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -