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

📄 decoder.cpp

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -