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

📄 mc_test.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
字号:
/******************************************************************************

 Filename:	mc_test.c

 Descriptions		 
 - MPEG4 MC block routines

 History
 -19.Dec.2003
  draft
 
 Copyright (c) 2003 SAMSUNG Electronics.
 # However, Anybody can use this code without our permission.  

 ******************************************************************************/


#include "def.h"
#include "2460addr.h"
#include "fim20_def.h"
#include "mc_test.h"

volatile unsigned int mcDone;

#define USE_MC_ENCODE_REGISTER		TRUE



//rMC_CNFG
#define MC_XY_UPDATE			(1<<31)


//rMC_CMND
#define MC_ROUND_BIT_0			(0<<17)
#define MC_ROUND_BIT_1			(1<<17)

#define MC_ENCODE_MODE			(1<<6)
#define MC_DECODE_MODE			(0<<6)

#define MC_INT_REQ_CLEAR		(1<<5)

#define MC_OP_START			(1<<4)

#define MC_OP_ABORT			(1<<1)


void McEngine(PIMAGE420 pPrevImage,PIMAGE420 pMcedImage,PME_VECTOR pMeVector,unsigned int mode)
{

    	unsigned int m,n;
    	unsigned int opUnit;
    
    	m=pPrevImage->imageWidth/16;
    	n=pPrevImage->imageHeight/16;
    	opUnit=m*n;

    	mcDone=0;

    	if( (pPrevImage->type != IMAGE420_PADDED) ||
		(pMcedImage->type != IMAGE420_PADDED))
    	{
		printf("ERROR:McEngine:incorrect image format!\n");
    	}

#if USE_MC_ENCODE_REGISTER
    	rMC_PFYSA_ENC=pPrevImage->yStartAddr;
    	rMC_PFCbSA_ENC=pPrevImage->cbStartAddr;
    	rMC_PFCrSA_ENC=pPrevImage->crStartAddr;
    
    	rMC_CFYSA_ENC=pMcedImage->yStartAddr;
    	rMC_CFCbSA_ENC=pMcedImage->cbStartAddr;
    	rMC_CFCrSA_ENC=pMcedImage->crStartAddr;

    	rMC_MVSA_ENC=(unsigned int)pMeVector;
#else
    	rMC_PFYSA_DEC=pPrevImage->yStartAddr;
    	rMC_PFCbSA_DEC=pPrevImage->cbStartAddr;
    	rMC_PFCrSA_DEC=pPrevImage->crStartAddr;
    
    	rMC_CFYSA_DEC=pMcedImage->yStartAddr;
    	rMC_CFCbSA_DEC=pMcedImage->cbStartAddr;
    	rMC_CFCrSA_DEC=pMcedImage->crStartAddr;

    	rMC_MVSA_DEC=(unsigned int)pMeVector;    
#endif

#if (FIMV20 == TRUE)
    	rMC_CNFG=	MC_XY_UPDATE| 
       		(0<<24)|  //MC y count
       		(0<<16)|  //MC x count
       		(opUnit<<0);
    	rMC_IMGFMT=((n-1)<<8)|((m-1)<<0);

    	rMC_CMND= 	MC_ROUND_BIT_1 |MC_ENCODE_MODE |MC_INT_REQ_CLEAR |MC_OP_START;
#else
	rMC_CMND = 0x00018c70; //396 MB
#endif	

}




#define MC_XY_UPDATE_EVERY_GOB		TRUE		
    // FALSE is recommended for MC_XY_UPDATE_EVERY_GOB. 
    // but, TRUE condition is applied for test.

void McEngineGob(PIMAGE420 pPrevImage,PIMAGE420 pMcedImage,PME_VECTOR pMeVector,unsigned int opUnit,unsigned int mode)
{

    	unsigned int m,n;
#if MC_XY_UPDATE_EVERY_GOB
    	static mCnt,mx,my;
#endif

    	m=pPrevImage->imageWidth/16;
    	n=pPrevImage->imageHeight/16;

    	mcDone=0;
    	if( (pPrevImage->type != IMAGE420_PADDED) ||
		(pMcedImage->type != IMAGE420_PADDED))
    	{
		printf("ERROR:McEngine:incorrect image format!\n");
    	}

    	if(mode&MC_FRAME_START_MODE)
    	{
    #if USE_MC_ENCODE_REGISTER
		rMC_PFYSA_ENC=pPrevImage->yStartAddr;
		rMC_PFCbSA_ENC=pPrevImage->cbStartAddr;
		rMC_PFCrSA_ENC=pPrevImage->crStartAddr;

		rMC_CFYSA_ENC=pMcedImage->yStartAddr;
		rMC_CFCbSA_ENC=pMcedImage->cbStartAddr;
		rMC_CFCrSA_ENC=pMcedImage->crStartAddr;

		rMC_MVSA_ENC=(unsigned int)pMeVector;
    #else
		rMC_PFYSA_DEC=pPrevImage->yStartAddr;
		rMC_PFCbSA_DEC=pPrevImage->cbStartAddr;
		rMC_PFCrSA_DEC=pPrevImage->crStartAddr;

		rMC_CFYSA_DEC=pMcedImage->yStartAddr;
		rMC_CFCbSA_DEC=pMcedImage->cbStartAddr;
		rMC_CFCrSA_DEC=pMcedImage->crStartAddr;

		rMC_MVSA_DEC=(unsigned int)pMeVector;    
    #endif
    
    #if !MC_XY_UPDATE_EVERY_GOB
        	rMC_CNFG=MC_XY_UPDATE| 
		 		(0<<24)|  //MC y count
		 		(0<<16)|  //MC x count
		 		(opUnit<<0);
    #else
 		mx=0;my=0;mCnt=0;    
    #endif
    
		rMC_IMGFMT=((n-1)<<8)|((m-1)<<0);

    }

#if MC_XY_UPDATE_EVERY_GOB
    	mx=mCnt%m;
    	my=mCnt/m;
    	rMC_CNFG=MC_XY_UPDATE|  
	     	(my<<24)|  //MC y count
	     	(mx<<16)|  //MC x count
	     	(opUnit<<0);
    		mCnt+=opUnit;
#endif    	

#if FIMV20
    	rMC_CMND=	MC_ROUND_BIT_1 |
			MC_ENCODE_MODE |
			MC_INT_REQ_CLEAR |
			MC_OP_START;
#else

    	rMC_CMND=	MC_ROUND_BIT_1 |
			MC_ENCODE_MODE |
			MC_INT_REQ_CLEAR |
			MC_OP_START|(0<<0)|(opUnit<<8);
#endif

}





void __irq McIsr(void)
{
	unsigned int c_optime=0;
    	ClearPending(BIT_MC);	
	//c_optime = mtimer_stop();
		
	//printf("mc= %d\n", c_optime*16);
    	mcDone=1;
    	printf("{mc}");
}

void McInitIsr(void)
{
    	pISR_MC=(unsigned int)McIsr;
    
    	rINTMSK&=~BIT_MC;
}



⌨️ 快捷键说明

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