📄 mc_test.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 + -