📄 dctq_test.c
字号:
*/
//printf("The picture is the recon image by DCTQ/IDCTQ. Press any key!\n");
getchar();
}
void TestDctq_Decoder(void)
{
IMAGE420 currImage; //no-padded image YCbCr420
IMAGE420 prevImage; //padded image YCbCr420
IMAGE420 refImage; //padded image YCbCr420
IMAGE420 refImage2; //padded image YCbCr420
IMAGE420 dctqCoeff; //no-padded, the size is twice than currImage.
PQINFO pQInfo;
U32 qinfoMode;
U32 imageWidth=FIMV_IMAGE_WIDTH;
U32 imageHeight=FIMV_IMAGE_HEIGHT;
U32 freeBufStartAddr=0x11000000;
U32 qpStepTable[((FIMV_IMAGE_WIDTH/16)*(FIMV_IMAGE_HEIGHT/16)+3)/4]; //for deblock test
int i;
printf("[DCTQ Encoder Test]\n");
printf("Test Image size:%s\n",(FIMVTEST_IMAGE_SIZE==QCIF) ? "QCIF":
(FIMVTEST_IMAGE_SIZE==CIF) ? "CIF" :
(FIMVTEST_IMAGE_SIZE==VGA) ? "VGA" :
(FIMVTEST_IMAGE_SIZE==PQVGA)? "PQVGA":"Unknown");
printf("Select QINFO mode: 1)intra 2)inter_skip_0_2_4 3)intra_skip_01_45\n"
" 4)inter 5)inter_skip_0_2_4 6)inter_skip_01_45\n");
switch(getchar())
{
case '1':
qinfoMode=QINFO_INTRA_MODE;
break;
case '2':
qinfoMode=QINFO_INTRA_MODE|QINFO_SKIP_0_2_4;
break;
case '3':
qinfoMode=QINFO_INTRA_MODE|QINFO_SKIP_01_45;
break;
case '4':
qinfoMode=QINFO_INTER_MODE;
break;
case '5':
qinfoMode=QINFO_INTER_MODE|QINFO_SKIP_0_2_4;
break;
case '6':
qinfoMode=QINFO_INTER_MODE|QINFO_SKIP_01_45;
break;
default:
break;
}
printf("QINFO mode:%s %s\n",(qinfoMode &QINFO_INTRA_MODE) ? "Intra" :
(qinfoMode &QINFO_INTER_MODE) ? "Inter" : "Unknown",
(qinfoMode &QINFO_SKIP_0_2_4) ? "Skip_0_2_4" :
(qinfoMode &QINFO_SKIP_01_45) ? "Skip_01_45" : "" );
printf(" %s Coefficient file download address : 0x11000000\n",(qinfoMode&QINFO_INTRA_MODE)?"intra":
(qinfoMode&QINFO_INTER_MODE)?"Inter":"");
//////////////////
USB_Download();
//////////////////
printf("dctqCoeff addr: [%x,",freeBufStartAddr);
freeBufStartAddr=AllocImage420(&dctqCoeff,freeBufStartAddr,imageWidth,imageHeight,IMAGE420_DCTQ_COEFF);
// bug of cal. of filesize, so must to subtract 0x0a
printf("currImage addr: %x\n",(freeBufStartAddr+downloadFileSize-0xa));
freeBufStartAddr = AllocImage420(&currImage,(freeBufStartAddr+downloadFileSize-0xa),imageWidth,imageHeight,IMAGE420_NO_PADDED);
//printf("The picture is the currImage. Press any key!\n");
//getchar();
InitQInfo(&pQInfo,&freeBufStartAddr,imageWidth,imageHeight,qinfoMode);
DctqInitIsr();
//*********************************
// decoding path test
//*********************************
printf("\nIDCTQ only test (DCTQ decoding path)\n");
//refImage2 is used for DctqEngine() as mced_input_image and recon_output image.
printf("recon Image addr: %x\n",freeBufStartAddr);
freeBufStartAddr=AllocImage420(&refImage2,freeBufStartAddr,imageWidth,imageHeight,
IMAGE420_PADDED|IMAGE420_CLEAR);
// for debug
/*
if(qinfoMode==QINFO_INTER_MODE)
{
CopyImage420(&refImage2,&prevImage);
//if this image isn't copied, the result has to be almost same with the currImage.
}
*/
//////////////////////// DCTQ GOB operation 22-MB in case of CIF /////////////
// check the DCTQ interrupt which is 18 times!
///////////////////////////////////////////////////////////////////////////
#if DCTQ_GOB_OPERATION
for(i=0;i<(imageHeight/16);i++)
{
DctqEngineGob(&currImage,&refImage2,&dctqCoeff,pQInfo,(imageWidth/16),
((i==0)? DCTQ_FRAME_START_MODE : 0)|
DCTQ_DECODE_ONLY_MODE);
while(dctqDone==0);
printf("completed(IQ_IDCT GOB=%d).\n",i);
}
//////////////////////// DCTQ frame operation 396-MB in case of CIF ///////////
// check the DCTQ interrupt which is 1 times!
///////////////////////////////////////////////////////////////////////////
#else
Timer_Start(0);
DctqEngine(&currImage,&refImage2,&dctqCoeff,pQInfo,DCTQ_DECODE_ONLY_MODE);
//printf("Wait until IQ_IDCT is completed... ");
while(dctqDone==0);
printf("completed!\n");
#endif
//printf("This pitcture is the recon image by DCTQ coefficient & reference image.\n");
//printf("Press any key!\n");
getchar();
}
//////////////////////// JPEG Test ///////////
// rDCTQ_CTRL : DCT_ONLY[27] =SET, IDCT_ONLY[26]= SET
// rIMGFMT : any image OK but the vertical
///////////////////////////////////////////////////////////////////////////
void TestDCTQ_JPEG(void)
{
// support to FIMV20 only.
}
void DctqEngine(PIMAGE420 pCurrImage,PIMAGE420 pRefImageP,PIMAGE420 pDctqCoeff,PQINFO pQInfo,U32 mode)
{
dctqDone=0;
/*
rDCTQ_CTRL=((pRefImageP->imageWidth/16)*(pRefImageP->imageHeight/16)<<8)|
MPEG4_FORMAT_BIT|
((mode & DCTQ_DECODE_ONLY_MODE)? IS_DECODE_BIT : IS_ENCODE_BIT);
rDCTQ_CTRL=((pRefImageP->imageWidth/16)*(pRefImageP->imageHeight/16)<<8)|
MPEG4_FORMAT_BIT|
((mode & DCTQ_DECODE_ONLY_MODE)? IS_DECODE_BIT : IS_ENCODE_BIT)|
(1<<25); //SW RESET
rDCTQ_CTRL=((pRefImageP->imageWidth/16)*(pRefImageP->imageHeight/16)<<8)|
MPEG4_FORMAT_BIT|
((mode & DCTQ_DECODE_ONLY_MODE)? IS_DECODE_BIT : IS_ENCODE_BIT)|
(0<<25);
*/
rDCTQCTRL =rDCTQCTRL & ~(DCTQ_START_BIT|FRAME_START_BIT);
//FRAME_START_BIT should be zero before setting new frame address.
// S/W reset is needed for decode process just after encode process.
// But, it's not desirable...
//rDCTQ_CTRL=rDCTQ_CTRL | (1<<25); //SW RESET
// rDCTQ_CTRL=rDCTQ_CTRL & ~(1<<25); //SW RESET
rSAYCF=pCurrImage->yStartAddr;
rSACBCF=pCurrImage->cbStartAddr;
rSACRCF=pCurrImage->crStartAddr;
rSAYRF=pRefImageP->yStartAddr;
rSACBRF=pRefImageP->cbStartAddr;
rSACRRF=pRefImageP->crStartAddr;
rSAYDQF=pDctqCoeff->yStartAddr;
rSACBDQF=pDctqCoeff->cbStartAddr;
rSACRDQF=pDctqCoeff->crStartAddr;
rSAQP=(U32)pQInfo;
#if FIMV20
rIMGSIZE=((pRefImageP->imageWidth)<<16)|((pRefImageP->imageHeight)<<0);
rSHQ =(0<<31)& 0x10000000; //MPEG-4 dc-scaler Q-mode for intra-DC, [30:0] must be zero
//rSHQ=(1<<31)& 0x10000000; //H264 Q-mode for intra-DC
rDCTQCTRL=((pRefImageP->imageWidth/16)*(pRefImageP->imageHeight/16)<<8)|
((mode & DCTQ_WITH_VLC_COEFF_WRITE)? (WITH_VLC_BIT) : (0<<28)) |
((mode & DCTQ_WITH_VLC_COEFF_NOTWRITE)? (WITH_VLC_BIT|COEFF_NOT_WRITE_BIT) : ((0<<28)|(0<<29))) |
//Q_SKIP_BIT|IQ_SKIP_BIT|
DCTQ_BUSY_BIT|DCTQ_START_BIT|MPEG4_FORMAT_BIT|
((mode & DCTQ_DECODE_ONLY_MODE)? IS_DECODE_BIT : IS_ENCODE_BIT) |
FRAME_START_BIT;
#else // FIMV10
rDCTQCTRL= (1<<31)+(1<<30)+(0<<22)+(396<<8)+(1<<7)+(1<<6)+(1<<5)+(0<<4)+(1<<2)+1;
#endif
}
void DctqEngineGob(PIMAGE420 pCurrImage,PIMAGE420 pRefImageP,PIMAGE420 pDctqCoeff,PQINFO pQInfo,
U32 opUnit,U32 mode)
{
dctqDone=0;
if(mode & DCTQ_FRAME_START_MODE)
{
rDCTQCTRL=rDCTQCTRL & ~(DCTQ_START_BIT|FRAME_START_BIT);
//FRAME_START_BIT should be zero before setting new frame address.
// S/W reset is needed for decode process just after encode process.
// But, it's not desirable...
rDCTQCTRL=rDCTQCTRL | (1<<25); //SW RESET
rDCTQCTRL=rDCTQCTRL & ~(1<<25); //SW RESET
rSAYCF=pCurrImage->yStartAddr;
rSACBCF=pCurrImage->cbStartAddr;
rSACRCF=pCurrImage->crStartAddr;
rSAYRF=pRefImageP->yStartAddr;
rSACBRF=pRefImageP->cbStartAddr;
rSACRRF=pRefImageP->crStartAddr;
rSAYDQF=pDctqCoeff->yStartAddr;
rSACBDQF=pDctqCoeff->cbStartAddr;
rSACRDQF=pDctqCoeff->crStartAddr;
rSAQP=(U32)pQInfo;
#if FIMV20
rIMGSIZE=((pRefImageP->imageWidth)<<16)|((pRefImageP->imageHeight)<<0);
rSHQ=(0<<31); //MPEG-4 dc-scaler Q-mode for intra-DC
//rSHQ=(1<<31); //H264 Q-mode for intra-DC
}
rDCTQCTRL=(opUnit<<8)|
((mode & DCTQ_WITH_VLC_COEFF_WRITE)? (WITH_VLC_BIT) : 0) |
((mode & DCTQ_WITH_VLC_COEFF_NOTWRITE)? (WITH_VLC_BIT|COEFF_NOT_WRITE_BIT) : 0) |
/*Q_SKIP_BIT|IQ_SKIP_BIT|*/
DCTQ_BUSY_BIT|DCTQ_START_BIT|MPEG4_FORMAT_BIT|
((mode & DCTQ_DECODE_ONLY_MODE) ? IS_DECODE_BIT : IS_ENCODE_BIT) |
((mode & DCTQ_FRAME_START_MODE) ? FRAME_START_BIT : 0);
#else
}
rDCTQCTRL= (1<<31)+(1<<30)+(0<<22)+(opUnit<<8)+(1<<7)+(1<<6)+(1<<5)+(0<<4)+(1<<2)+FRAME_START_BIT;
#endif
}
void __irq DctqIsr(void)
{
U32 op=0;
ClearPending(BIT_DCTQ);
op=mtimer_stop();
printf("op = %d\n",op*16);
dctqDone=1;
printf("{d}");
}
void DctqInitIsr(void)
{
pISR_DCTQ=(U32)DctqIsr;
rINTMSK&=~BIT_DCTQ;
}
void InitQInfo(PQINFO *rvpQInfo,U32 *rvFreeBuf,U32 imageWidth,U32 imageHeight,U32 mode)
{
int i;
U32 mBlkCnt=(imageWidth/16)*(imageHeight/16);
*rvpQInfo=(PQINFO)(*rvFreeBuf);
//*rvFreeBuf+=mBlkCnt*4;
for(i=0;i<mBlkCnt;i++)
{
((U32 *)(*rvpQInfo))[i]=0x0;
(*rvpQInfo)[i].intraInter=
(mode&QINFO_INTRA_INTER_0_2_4) ? ((i%2==0)?1:0) :
(mode&QINFO_INTRA_INTER_01_45) ? ((i%4<=1)?1:0) :
(mode&QINFO_INTRA_MODE) ? 1:0;
//0:inter 1:intra macroblock mode.
(*rvpQInfo)[i].qpStep=3; //12 is recommended.
(*rvpQInfo)[i].skip=
(mode&QINFO_SKIP_0_2_4) ? ((i%2==0)?0x3f:0) :
(mode&QINFO_SKIP_01_45) ? ((i%4<=1)?0x3f:0) : 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -