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

📄 dctq_test.c

📁 s3c24a0固件测试代码 ? ? ? ? ?啊 
💻 C
📖 第 1 页 / 共 2 页
字号:
     */
	    //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 + -