📄 mfc_test.c
字号:
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 + -