⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decoder.cpp

📁 《Visual C++小波变换技术与工程实践》靳济芳编著的光盘程序。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			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;
		Int iBASEVOP_PredType;
		//~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 ();
			}
			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);
							pBase_tmp_mvBaseBY = pvodec [BASE_LAYER] ->getmvBaseBY();
							pvodec [ENHN_LAYER] -> setmvBaseBY(pBase_stack_mvBaseBY);		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -