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

📄 mfc_test.c

📁 三星 s3c6400测试代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	bool bConformanceError=false;

	// 1. Move firmware and init base settings.
	//-------------------------------------------
	
	MFC_MoveFirmwareToCodeBuf(uFreeMemBuf);
	MFC_GetCodeBufEndAddr(&uFreeMemBuf);
	MFC_StartBitProcessor();
			
	MFC_InitBaseForProcesses1(uFreeMemBuf, DECODING_CONFORMANCE);
	MFC_GetBaseBufEndAddr(&uFreeMemBuf);	

	// 2. Reserve the stream buffer, & load the first part of a stream
	//-----------------------------------------------------------------

	if (!SDHC_OpenMedia(SDHC_HCLK, &oSdhc) || !FAT_LoadFileSystem(&oSdhc))
		Assert(0);

	FAT_GetTotalNumOfFiles(&uTotalNumOfFiles, &oSdhc);
	for (i=0; i<uTotalNumOfFiles; i++)
	{
		FAT_GetFileName(i, pFileName, &oSdhc);
		Disp("%02d -- %s\n", i, pFileName);
	}

	Disp(" Which file to decode ? ");
	sel = GetIntNum();

	FAT_GetFileSize(sel, &nDecFileSize, &oSdhc);
	//Disp("nDecFileSize=%d\n",nDecFileSize);	

	nReadSize = (nDecFileSize < nReadUnit) ? nDecFileSize : nReadUnit;
	uStreamPtr = nReadSize;	
	uStreamBufStAddr = uFreeMemBuf;
	uFreeMemBuf += STREAM_BUF_SIZE;
	if (!FAT_ReadFile4(sel, 0, (nReadSize+nBlkSz-1)/nBlkSz, uStreamBufStAddr, &oSdhc))
		Assert(0);

	FAT_GetFileName(sel, pFileName, &oSdhc);
	if (!FAT_GetFileIndex1(pFileName, "yuv", &selYuv, &oSdhc))
		Assert(0);

	// 3. Init a process of MFC
	//--------------------------
	FAT_GetFileExt(sel, fileExt, &oSdhc);		
	MFC_GetCodecModeByName(fileExt, true, &eDecMode);

	uProcessIdx=0;
	bH264ReorderEn = true;
	bDecRotModeEn = false;

	uFrameBufStAddr = uFreeMemBuf;
	
	if (eDecMode == MP4_DEC)
		MFC_InitProcessForDecodingMpeg4(uProcessIdx, uStreamBufStAddr, STREAM_BUF_SIZE, 			
			uFrameBufStAddr, bDecRotModeEn, false);
	else if (eDecMode == AVC_DEC)
		MFC_InitProcessForDecodingH264(uProcessIdx, uStreamBufStAddr, STREAM_BUF_SIZE, 
			uFrameBufStAddr, bDecRotModeEn, bH264ReorderEn);
	else if (eDecMode == VC1_DEC)
		MFC_InitProcessForDecodingVc1(uProcessIdx, uStreamBufStAddr, STREAM_BUF_SIZE, 
			uFrameBufStAddr, bDecRotModeEn);
	else
		Assert(0);
	MFC_GetProcessBufEndAddr(uProcessIdx, &uFreeMemBuf);
	MFC_SetWrPtr(uProcessIdx, uStreamBufStAddr+nReadSize);
	INTC_SetVectAddr(NUM_MFC,Isr_Mfc);
	INTC_Enable(NUM_MFC);

	MFC_GetSrcPicSize(uProcessIdx, &picX, &picY);
	MFC_GetFrameSize(uProcessIdx, &uWidth, &uHeight);	
		
	// YUV read buffer
	uYuvBufAddr = uFreeMemBuf;
	uYuvFrameSize = picX * picY * 3/2;
	uFileOffset = 0;
	uFreeMemBuf += (uYuvFrameSize/512 + 2) * 512;
	
	uMaxAbsDiff=0;
	uFrameCount = 0;
			
	while (GetKey() == 0)   // exit when any key is pressed.
	{
		// 4. Decode one frame
		//---------------------

		bStreamBufEmpty = false;	
		bMfcDone = false;
		MFC_SetDecRotEn(false);
		MFC_StartDecodingOneFrame(uProcessIdx);
		while(bMfcDone != true);

		if (MFC_DoPostProcessingOfDecoding(uProcessIdx, bStreamBufEmpty, &uFrameIdx) == false)
			break;
		MFC_GetAddrOfYFrame(uProcessIdx, uFrameIdx, &uFrameAddrY);

		uFrameCount++;

		// 5. Load stream if necessary
		//------------------------------

		if (nDecFileSize == uStreamPtr)
		{					
			MFC_NotifyNoMoreStream(uProcessIdx);
		}
		else if (MFC_IsMoreStreamNeeded(uProcessIdx, nReadUnit))
		{
			nReadSize = (nDecFileSize-uStreamPtr < nReadUnit) ? nDecFileSize-uStreamPtr : nReadUnit;
			if (!FAT_ReadFile4(sel, uStreamPtr/nBlkSz, (nReadSize+nBlkSz-1)/nBlkSz, uStreamBufStAddr+uStreamPtr%STREAM_BUF_SIZE, &oSdhc))
				Assert(0);
			uStreamPtr += nReadSize;
			MFC_SetWrPtr(uProcessIdx, uStreamBufStAddr+uStreamPtr%STREAM_BUF_SIZE);
		}
		
		// 6. Read one YUV frame from SD/MMC card
		//----------------------------------------

		if (!FAT_ReadFile6(selYuv, uFileOffset, uYuvFrameSize, uYuvBufAddr, &uReturnAddr, &oSdhc))
			break;

		// 7. Compare the decoded frame with the golden one
		//---------------------------------------------------------

		if (!CompareFrameBuffers(uReturnAddr, picX, picY, uFrameAddrY, uWidth, uHeight, &uMaxAbsDiff, &uAbsDiff))
		{
			MFC_GetFrameCount(&uFrmNum);
			MFC_GetDecErrorMbNum(&uErrMbNum);
			//Disp("%dth frame: max diff=%d, Err MB num=%d\n",uFrmNum, uMaxAbsDiff, uErrMbNum);
			if(uErrMbNum!=0)
			{
				Disp("%dth frame: max diff=%d, Err MB num=%d\n",uFrmNum, uMaxAbsDiff, uErrMbNum);
				bConformanceError=true;
				break;
			}
		}

		uFileOffset += uYuvFrameSize;
		
		if((uFrameCount%10)==0)
			Putc('.');
	}

	// 8. Report the maximum difference
	//----------------------------------

	//Disp("\n::: Max Abs Diff: %d among the %d frames\n", uMaxAbsDiff, uFrameCount);
	
	if(bConformanceError==false)
		Disp("O.K\n");
	else
		Disp("Fail\n");

	FAT_UnloadFileSystem(&oSdhc);
	SDHC_CloseMedia(&oSdhc);	
	
	MFC_IssueSeqEndCmd(uProcessIdx);
	MFC_StopBitProcessor();
	
}

//////////
// Function Name : TestDecConformance
// Function Description : This function decodes several stream files and then 
//							compares the decoded YUV images with pre-made YUV images
// Input : NONE
// Output : NONE
// Version : 
static void TestDecConformance(void)
{
	u32 uFreeMemBuf = CODEC_MEM_ST;
	char pFileName[256];
	int sel;
	s32 nDecFileSize;
	const int nBlkSz = 512;
	const int nReadUnit = STREAM_BUF_SIZE/2;
	int nReadSize;
	u32 uStreamPtr;	
	u32 uStreamBufStAddr;
	u32 selYuv;
	u32 uProcessIdx;
	u32 uFrameBufStAddr;
	u32 picX, picY;
	u32 uWidth, uHeight;
	char fileExt[50];
	u32 uYuvBufAddr;
	u32 uYuvFrameSize;
	u32 uFileOffset;
	u32 uReturnAddr;
	
	u32 uFrameAddrY;
	u32 uAbsDiff;
	u32 uMaxAbsDiff=0;
	u32 uFrameIdx;
	u32 uFrameCount = 0;
	u32 uFrmNum;
	u32 uErrMbNum;
	MFC_CODEC_MODE eDecMode;
	bool bConformanceError=false;	
	u32 uCount=0, uStartStream=0;
	

	if (!SDHC_OpenMedia(SDHC_HCLK, &oSdhc) || !FAT_LoadFileSystem(&oSdhc))
		Assert(0);
		
	Disp("Select the start stream file\n");
	uStartStream=GetIntNum();
	Disp("Enter the count of stream files\n");
	uCount=GetIntNum();
	for(sel=uStartStream;sel<(uStartStream+uCount);sel++)
	{
		uFreeMemBuf = CODEC_MEM_ST;

		// 1. Move firmware and init base settings.
		//-------------------------------------------
		
		MFC_MoveFirmwareToCodeBuf(uFreeMemBuf);
		MFC_GetCodeBufEndAddr(&uFreeMemBuf);
		MFC_StartBitProcessor();
				
		MFC_InitBaseForProcesses1(uFreeMemBuf, DECODING_CONFORMANCE);
		MFC_GetBaseBufEndAddr(&uFreeMemBuf);	

		// 2. Reserve the stream buffer, & load the first part of a stream
		//-----------------------------------------------------------------	

		FAT_GetFileSize(sel, &nDecFileSize, &oSdhc);
		//Disp("nDecFileSize=%d\n",nDecFileSize);	

		nReadSize = (nDecFileSize < nReadUnit) ? nDecFileSize : nReadUnit;
		uStreamPtr = nReadSize;	
		uStreamBufStAddr = uFreeMemBuf;
		uFreeMemBuf += STREAM_BUF_SIZE;
		if (!FAT_ReadFile4(sel, 0, (nReadSize+nBlkSz-1)/nBlkSz, uStreamBufStAddr, &oSdhc))
			Assert(0);

		FAT_GetFileName(sel, pFileName, &oSdhc);
		if (!FAT_GetFileIndex1(pFileName, "yuv", &selYuv, &oSdhc))
			Assert(0);

		// 3. Init a process of MFC
		//--------------------------
		FAT_GetFileExt(sel, fileExt, &oSdhc);		
		MFC_GetCodecModeByName(fileExt, true, &eDecMode);

		uProcessIdx=0;
		bH264ReorderEn = true;
		bDecRotModeEn = false;

		uFrameBufStAddr = uFreeMemBuf;
		
		if (eDecMode == MP4_DEC)
			MFC_InitProcessForDecodingMpeg4(uProcessIdx, uStreamBufStAddr, STREAM_BUF_SIZE, 			
				uFrameBufStAddr, bDecRotModeEn, false);
		else if (eDecMode == AVC_DEC)
			MFC_InitProcessForDecodingH264(uProcessIdx, uStreamBufStAddr, STREAM_BUF_SIZE, 
				uFrameBufStAddr, bDecRotModeEn, bH264ReorderEn);
		else if (eDecMode == VC1_DEC)
			MFC_InitProcessForDecodingVc1(uProcessIdx, uStreamBufStAddr, STREAM_BUF_SIZE, 
				uFrameBufStAddr, bDecRotModeEn);
		else
			Assert(0);
		MFC_GetProcessBufEndAddr(uProcessIdx, &uFreeMemBuf);
		MFC_SetWrPtr(uProcessIdx, uStreamBufStAddr+nReadSize);
		INTC_SetVectAddr(NUM_MFC,Isr_Mfc);
		INTC_Enable(NUM_MFC);

		MFC_GetSrcPicSize(uProcessIdx, &picX, &picY);
		MFC_GetFrameSize(uProcessIdx, &uWidth, &uHeight);	
			
		// YUV read buffer
		uYuvBufAddr = uFreeMemBuf;
		uYuvFrameSize = picX * picY * 3/2;
		uFileOffset = 0;
		uFreeMemBuf += (uYuvFrameSize/512 + 2) * 512;
		
		uMaxAbsDiff=0;
		uFrameCount = 0;
				
		while (GetKey() == 0)   // exit when any key is pressed.
		{
			// 4. Decode one frame
			//---------------------

			bStreamBufEmpty = false;	
			bMfcDone = false;
			MFC_SetDecRotEn(false);
			MFC_StartDecodingOneFrame(uProcessIdx);
			while(bMfcDone != true);

			if (MFC_DoPostProcessingOfDecoding(uProcessIdx, bStreamBufEmpty, &uFrameIdx) == false)
				break;
			MFC_GetAddrOfYFrame(uProcessIdx, uFrameIdx, &uFrameAddrY);

			uFrameCount++;

			// 5. Load stream if necessary
			//------------------------------

			if (nDecFileSize == uStreamPtr)
			{					
				MFC_NotifyNoMoreStream(uProcessIdx);
			}
			else if (MFC_IsMoreStreamNeeded(uProcessIdx, nReadUnit))
			{
				nReadSize = (nDecFileSize-uStreamPtr < nReadUnit) ? nDecFileSize-uStreamPtr : nReadUnit;
				if (!FAT_ReadFile4(sel, uStreamPtr/nBlkSz, (nReadSize+nBlkSz-1)/nBlkSz, uStreamBufStAddr+uStreamPtr%STREAM_BUF_SIZE, &oSdhc))
					Assert(0);
				uStreamPtr += nReadSize;
				MFC_SetWrPtr(uProcessIdx, uStreamBufStAddr+uStreamPtr%STREAM_BUF_SIZE);
			}
			
			// 6. Read one YUV frame from SD/MMC card
			//----------------------------------------

			if (!FAT_ReadFile6(selYuv, uFileOffset, uYuvFrameSize, uYuvBufAddr, &uReturnAddr, &oSdhc))
				break;

			// 7. Compare the decoded frame with the golden one
			//---------------------------------------------------------

			if (!CompareFrameBuffers(uReturnAddr, picX, picY, uFrameAddrY, uWidth, uHeight, &uMaxAbsDiff, &uAbsDiff))
			{
				MFC_GetFrameCount(&uFrmNum);
				MFC_GetDecErrorMbNum(&uErrMbNum);
				//Disp("%dth frame: max diff=%d, Err MB num=%d\n",uFrmNum, uMaxAbsDiff, uErrMbNum);
				if(uErrMbNum!=0)
				{
					Disp("%dth frame: max diff=%d, Err MB num=%d\n",uFrmNum, uMaxAbsDiff, uErrMbNum);
					bConformanceError=true;
					break;
				}
			}

			uFileOffset += uYuvFrameSize;
			
			if((uFrameCount%10)==0)
				Putc('.');
		}

		// 8. Report the maximum difference
		//----------------------------------

		//Disp("\n::: Max Abs Diff: %d among the %d frames\n", uMaxAbsDiff, uFrameCount);
		
		Disp("\n%s:",pFileName);
		if(bConformanceError==false)
			Disp("O.K\n");
		else
		{
			Disp("Fail\n");
			break;
		}	
		
		MFC_IssueSeqEndCmd(uProcessIdx);
		MFC_StopBitProcessor();
	}

	FAT_UnloadFileSystem(&oSdhc);
	SDHC_CloseMedia(&oSdhc);
	
}
#endif


//////////
// Function Name : TestEncodingParameters
// Function Description : This function encodes a YUV file and then 
//							compares the encoded stream file with pre-made stream file
// Input : NONE
// Output : NONE
// Version : 
#if (USE_SD_STORAGE)
static void TestEncodingParameters(void)
{
	u32 uFreeMemBuf = CODEC_MEM_ST;
	char pFileName[256];
	u32 uTotalNumOfFiles;
	u32 i;
	int sel;
	u32 uConfigFileSize;
	u32 uConfigFileStAddr;
	u32 uProcessIdx;
	u32 uWidth, uHeight;
	u32 uNumOfFrames;
	u32 uFrameRate;
	char pGoldenStreamFileName[256];
	u32 uSrcYuvBufAddr;
	u32 uSrcYuvFrameSizeInBytes;
	s32 selSrcYuv;
	char pSrcYuvFileName[256];
	u32 uEncBufAddr;
	s32 selGoldenStream;
	s32 nGoldenStreamFileSize;
	u32 uGoldenStreamStAddr;
	const int uBlkSz = 512;
	int nReadSize;
	int nGoldenStreamOffset = 0;
	u32 uTrueStAddrOfData;
	u32 uSrcFileOffset=0;	
	u32 uFrameCount=0;
	u32 uEncStreamOffset = 0;
	MFC_CODEC_MODE eMode;		
	bool bResult = true;
	bool bIsNoMoreStream;

	// 1. Move firmware and init base settings.
	//-------------------------------------------
	
	MFC_MoveFirmwareToCodeBuf(uFreeMemBuf);
	MFC_GetCodeBufEndAddr(&uFreeMemBuf);		
   	MFC_StartBitProcessor();

	MFC_InitBaseForProcesses1(uFreeMemBuf, ENCODING_WITH_ALL_PARAMETERS);	
	MFC_GetBaseBufEndAddr(&uFreeMemBuf);
	MFC_SetFlushingStreamBufModeInEncoding();

	// 2. Read a config file.
	//------------------------
	
	while(!SDHC_OpenMedia(SDHC_HCLK, &oSdhc));	
	if (!FAT_LoadFileSystem(&oSdhc))
		Assert(0);

	FAT_GetTotalNumOfFiles(&uTotalNumOfFiles, &oSdhc);
	for (i=0; i<uTotalNumOfFiles; i++)
	{
		FAT_GetFileName(i, pFileName, &oSdhc);
		Disp("%02d -- %s\n", i, pFileName);
	}
	
	Disp(" Which config file to read ? ");
	sel = GetIntNum();

	uConfigFileStAddr = uFreeMemBuf;	
	if (!FAT_ReadFile2(sel, uConfigFileStAddr, &uConfigFileSize, &oSdhc))
		Assert(0);

	uFreeMemBuf = (uFreeMemBuf+uConfigFileSize+STREAM_WR_SIZE-1)/STREAM_WR_SIZE*STREAM_WR_SIZE;

	// 3. Parse the config file and set parameters.
	//----------------------------------------------

	uProcessIdx = 0;
	MFC_ParseConfigFileAndSetParameters(uProcessIdx, uConfigFileStAddr);

	MFC_GetEncPicSizeCfg(uProcessIdx, &uWidth, &uHeight);
	MFC_GetEncNumOfFramesCfg(uProcessIdx, &uNumOfFrames);
	MFC_GetEncFrameRateCfg(uProcessIdx, &uFrameRate);

	MFC_GetGoldenStreamFileName(uProcessIdx, pGoldenStreamFileName);
	MFC_GetCodecModeFromName(pGoldenStreamFileName, false, &eMode);	

	// 4. Keep one frame sized memory of the source YUV file.
	//--------------------------------------------------------

	uSrcYuvBufAddr = uFreeMemBuf;
	uSrcYuvFrameSizeInBytes = uWidth * uHeight *3/2;
	uFreeMemBuf += (uSrcYuvFrameSizeInBytes/512 + 2) * 512;
	MFC_GetSrcYuvFileName(uProcessIdx, pSrcYuvFileName);
	FAT_GetFileIndex(pSrcYuvFileName, &selSrcYuv, &oSdhc);
	
	// 5. Init a process of MFC
	//--------------------------

	uEncBufAddr = (uFreeMemBuf+STREAM_WR_SIZE-1)/STREAM_WR_SIZE*STREAM_WR_SIZE;
	MFC_InitProcessForEncoding(
		uProcessIdx, eMode, uEncBufAddr, STREAM_BUF_SIZE, uWidth, uHeight, false);
	MFC_GetProcessBufEndAddr(uProcessIdx, &uFreeMemBuf);

⌨️ 快捷键说明

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