📄 mobile_demo.c
字号:
/******************************************************************************
Filename: mobile_demo.c
Descriptions
- MPEG4 ME 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 "2460lib.h"
#include "fim20_def.h"
#include "memc_test.h"
#include "dctq_test.h"
#include "vlx_test.h"
#include "deblock.h"
#include "mobile_demo.h"
#include "camif.h"
#include "lcdlib.h"
#include "post.h"
#include "camproset.h"
#include "pll.h"
#define CAM_ENABLE (1)
#if (FIMV_DEMO_IMAGE_SIZE == QCIF)
#define FIMV_IMAGE_WIDTH (176)
#define FIMV_IMAGE_HEIGHT (144)
#elif (FIMV_DEMO_IMAGE_SIZE == CIF)
#define FIMV_IMAGE_WIDTH (352)
#define FIMV_IMAGE_HEIGHT (288)
#elif (FIMV_DEMO_IMAGE_SIZE == VGA)
#define FIMV_IMAGE_WIDTH (640)
#define FIMV_IMAGE_HEIGHT (480)
#elif (FIMV_DEMO_IMAGE_SIZE == MPIXEL)
#define FIMV_IMAGE_WIDTH (1152)
#define FIMV_IMAGE_HEIGHT (864)
#endif
#define FIMV_MBLK_NUM ((FIMV_IMAGE_WIDTH/16)*(FIMV_IMAGE_HEIGHT/16))
volatile unsigned int d_dctqDone, d_meDone, d_mcDone, d_vlxDone, d_camDone;
volatile unsigned int c_dctqDone, c_meDone, c_mcDone, c_vlxDone, c_camDone;
volatile unsigned int c_dctqCnt, c_meCnt, c_mcCnt, c_vlxCnt, c_camCnt;
volatile unsigned int _DCTQ_FLAG,_ME_FLAG,_MC_FLAG, _CAMIF_FLAG, _POSTLCD_FLAG;
volatile unsigned int prevImageNum, frameNum;
static IMAGE420 currImage; //no-padded image YCbCr420
static IMAGE420 currImage2[4]; //no-padded image YCbCr420
static IMAGE420 refImage[4]; //padded image YCbCr420
static IMAGE420 dctqCoeff[4]; //no-padded, the size is twice than currImage.
static ME_VECTOR meVector[4][(FIMV_IMAGE_WIDTH/16)*(FIMV_IMAGE_HEIGHT/16)];
static unsigned int meVector2[4];
static PQINFO pQInfo;
void * mp4_function[][2]=
{
//(void *)TestDctq_Encoder, "DCTQ ",
//(void *)TestDctq_2048X2048, "2048*2048 Test ",
//(void *)TestVLC_CoeffMem, "VLC <-Coeff Mem ",
//(void *)TestVLC_fromDCTQ, "VLC <-DCTQ ",
//(void *)TestVLD_DCTQ, "VLD ->DCTQ ",
(void *)TestVlx, "Vlx test ",
(void *)TestMeMc, "ME MC Test ",
(void *)Test_Post_CIF_16, "post test ",
(void *)Mobile_Image_Demo, "Mobile Demo ",
//(void *)S5X532_Iic_Test, "camera preview ",
(void *)Mpeg4_camera_image, "Mpeg4 <-camera ",
//(void *)AHB_I_Bus_Test, "AHB-I arbitration test ",
0,0
};
void Ch22_mpeg4_test(void)
{
int i;
while(1)
{
i = 0;
printf("\n\nS3C2460A MPEG4 Test Program \n\n");
while(1)
{ //display menu
printf("%2d:%s",i,mp4_function[i][1]);
i++;
if((int)(mp4_function[i][0])==0)
{
printf("\n");
break;
}
if((i%4)==0)
printf("\n");
}
printf("\nSelect the function to test : ");
i = GetIntNum();
printf("\n");
if(i==-1) break;
if(i>=0 && (i<(sizeof(mp4_function)/8)) )
( (void (*)(void)) (mp4_function[i][0]) )();
}
}
void AHB_I_Bus_Test(void)
{
int i;
unsigned int pVlcData;
// step 1 : Initialize ISR
Fim20DemoIsrUnmask();
// step 2 : Initialize memory map
//Fim20DemoMem();
// step 3 : start scheduler
printf("ref[0] = %08x\n",refImage[0]);
printf("cur[3] = %08x, pre[3]=%08x\n", currImage2[3],refImage[3]);
printf("FC=%d\n", (rMODE&(0x3<<10))>>10);
//printf("rpriority=%d, %d\n", rPRIORITY0, rPRIORITY1);
//rPRIORITY0=rPRIORITY1 |= 0x1;
//Fim20Scheduler();
// Post_Envid_On();
// printf("dkdkdkd\n");
// printf("FC=%d\n", (rMODE&(0x3<<10))>>10);
//Uart_TxEmpty(0);
PostSetFimv16B(FIMV_IMAGE_WIDTH,FIMV_IMAGE_HEIGHT,240,320, refImage[0].frameStartAddr,mpegframebuffer);
//LcdEnvidOnOff(1);
Init_FIMV20_Isr();
pVlcData=(_NONCACHE_STARTADDRESS+0x00a00000);
VlcConfig4Dctq(352,(unsigned int)pVlcData,(352/16)*(284/16),0);
//DctqEngine(&currImage,&prevImage,&dctqCoeff,pQInfo,DCTQ_WITH_VLC_COEFF_WRITE);
//DctqEngine(&currImage, &refImage[prevImageNum], &dctqCoeff[frameNum], pQInfo, DCTQ_FRAME_START_MODE);
DctqEngine(&currImage, &refImage[prevImageNum], &dctqCoeff[frameNum], pQInfo, DCTQ_WITH_VLC_COEFF_WRITE);
MeEngine(&currImage, &refImage[prevImageNum], meVector[frameNum%4], 0);
McEngine(&refImage[prevImageNum], &refImage[1 ], meVector[frameNum%4], 0);
// PostStartProcessing(0, 0);
while(1){
//printf("1");
}
// step 4 : mask mpeg4 ISR
//Fim20DemoIsrMask();
}
/*
c:camera r:reference d:dctq_coeff
C0 C1 C2 C3 C4 C5
------------------------------------------------------------------------
Cap:c0 EC:c0r3-r0 Post1:r0
Dc:c0r0-d0
Post2:c0
Cap:c1 EC:c1r0-r1 Post1:r1
Dc:c1r1-d1
Post2:c1
Cap:c2 EC:c2r1-r2 Post1:r2
Dc:c2r2-d2
Post2:c2
Cap:c3 EC:c3r2-r3 Post1:r3
Dc:c3r3-d3
Post2:c3
Cap:c0 EC:c0r3-r0
Dc:c0r0-d0
Post2:c0
cap:c1
C0->C1->C2->C3->C4->C5
+ |
| |
+--<--<--<---+
*/
unsigned int FimvImageWidth, FimvImageHeight, fpsNum;
void Image_Select(void)
{
printf("[Camera Encoder Test]\n");
printf("Select Image Size: \n 1. QCIF 2.CIF 3.VGA \n");
switch(getchar())
{
case '1':
FimvImageWidth = QCIF_XSIZE;
FimvImageHeight = QCIF_YSIZE;
break;
case '2':
FimvImageWidth = CIF_XSIZE;
FimvImageHeight = CIF_YSIZE;
break;
case '3':
FimvImageWidth = VGA_XSIZE;
FimvImageHeight = VGA_YSIZE;
default:
break;
}
}
void Mpeg4_camera_image(void)
{
FimvImageWidth = CIF_XSIZE;
FimvImageHeight = CIF_YSIZE;
rGPJCON &= ~(0xf<<28); // GPJ14, 15 - input(reset value)
Camera_Open();
// step 1 : Initialize ISR
Fim20DemoIsrUnmask();
// step 2 : Initialize memory map
Fim20DemoMem();
Lcd_Init_Mpeg();
// step 3 : start scheduler
Fim20Scheduler();
// step 4 : mask mpeg4 ISR
Fim20DemoIsrMask();
CamIIC_close();
ReturnCamifPort();
}
#if CAM_ENABLE
extern volatile unsigned int amount;
void Camera_Open(void)
{
SetCamifPort();
CamSelectPort(0);
if (rGPJDAT & (1<<14) ) // GPJ14
{ // no pressing button
CAMTYPE=CAM_S5X3A1;
CAMSIZE=SXGA_XSIZE;
}
else
{ // pressed button
CAMTYPE=CAM_S5X532;
CAMSIZE=VGA_XSIZE;
}
CAMIICID=0x5a;
rCLKSRCCON = (rCLKSRCCON & ~(1<<13))|(1<<5); // select UPLL
SetUPLL( 72, 3, 1); // 96MHz
SetCAMClockDivider(3); // UPLL/(CAMCLK_DIV+1)
CamReset();
CameraModuleSetting();
// Camera setting
if (rGPJDAT & (1<<14) ) // GPJ14
CamInit(FimvImageWidth, FimvImageHeight, 352, 288, 240, 0, (_NONCACHE_STARTADDRESS+0), LCDFRAMEBUFFERFG2);
else
CamInit(FimvImageWidth, FimvImageHeight, 352, 288, 100, 0, (_NONCACHE_STARTADDRESS+0), LCDFRAMEBUFFERFG2);
}
void Lcd_Init_Mpeg(void)
{
if (rGPJDAT & (1<<15) ) // GPJ14
{ // no pressing button
Init_240X320_AMLCD();
LcdBGInit(MODE_SER_16BIT565_240320|MODE_MPEG_DISPLAY_16B);
}
else
{ // pressed button
LcdBGInit(MODE_PAR_16BIT565_240320|MODE_MPEG_DISPLAY_16B);
}
}
void Fim20Scheduler(void)
{
unsigned int camif_flag, dctq_flag, me_flag, mc_flag, post_flag;
c_camDone=c_dctqDone=c_meDone=c_mcDone=0;
c_dctqCnt= c_meCnt= c_mcCnt= c_vlxCnt= c_camCnt=0;
_CAMIF_FLAG=_DCTQ_FLAG=_ME_FLAG=_MC_FLAG=_POSTLCD_FLAG=0;
camTestMode=CAM_TEST_MODE_CODEC_POST;
camCodecCaptureCount=0;
camPviewCaptureCount=0;
camPviewStatus=CAM_STOPPED;
camCodecStatus=CAM_STOPPED;
fpsNum=0;
frameNum = 0;
//Timer_Start(2);
calculate_FPS_WDT();
CamCaptureStart(CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT);
LcdEnvidOnOff(1);
while(!Uart_GetKey()){
camif_flag = _CAMIF_FLAG;
dctq_flag = _DCTQ_FLAG;
me_flag = _ME_FLAG;
if(camif_flag==0x00000020) {
if(dctq_flag==0x00000000) {
//printf("s_d\n");
_DCTQ_FLAG = 0x00000010;
//printf("S : dctq_flag = 10-->");
FdStartDctq(0);
}
}
// process the 1st inter frame
else if(camif_flag==0x00000030) {
if(dctq_flag==0x00000011) {
if(me_flag==0x00000000) {
_ME_FLAG = 0x00000020;
//printf("S : me_flag = 20-->");
FdStartMe(1, 0);
}
}
}
// process the 2nd inter frame
else if(camif_flag==0x00000040) {
if(dctq_flag==0x00000021) {
if(me_flag==0x00000021) {
_ME_FLAG = 0x00000030;
//printf("S : me_flag = 30-->");
FdStartMe(2, 1);
}
}
}
// process the 3rd inter frame
else if(camif_flag==0x00000010) {
if(dctq_flag==0x00000031) {
if(me_flag==0x00000031) {
_ME_FLAG = 0x00000040;
//printf("S : me_flag = 40-->");
FdStartMe(3, 2);
}
}
}
dctq_flag = _DCTQ_FLAG;
post_flag = _POSTLCD_FLAG;
if(dctq_flag==0x00000011) {
if(post_flag==0x00000000) {
_POSTLCD_FLAG = 0x00000010;
//printf("S : post_flag = 10-->");
//PostStartProcessing(0);
PostStartFIMV20(refImage[0].frameStartAddr);
//printf("cp1 = %d\n",camcnt);
}
}
else if(dctq_flag==0x00000021) {
if(post_flag==0x00000011) {
_POSTLCD_FLAG = 0x00000020;
//printf("S : post_flag = 20-->");
//PostStartProcessing(1);
PostStartFIMV20(refImage[1].frameStartAddr);
//printf("cp2 = %d\n",camcnt);
}
}
else if(dctq_flag==0x00000031) {
if(post_flag==0x00000021) {
_POSTLCD_FLAG = 0x00000030;
//printf("S : post_flag = 30-->");
//PostStartProcessing(2);
PostStartFIMV20(refImage[2].frameStartAddr);
//printf("cp3 = %d\n",camcnt);
}
}
else if(dctq_flag==0x00000041) {
if(post_flag==0x00000031) {
_POSTLCD_FLAG = 0x00000040;
//printf("S : post_flag = 40-->");
//PostStartProcessing(3);
PostStartFIMV20(refImage[3].frameStartAddr);
}
}
me_flag = _ME_FLAG;
mc_flag = _MC_FLAG;
if(me_flag==0x00000021) {
if(mc_flag==0x00000000) {
_MC_FLAG = 0x00000020;
//printf("S : mc_flag = 20-->");
FdStartMc(0,1);
}
}
else if(me_flag==0x00000031) {
if(mc_flag==0x00000021) {
_MC_FLAG = 0x00000030;
//printf("S : mc_flag = 30-->");
FdStartMc(1,2);
}
}
else if(me_flag==0x00000041) {
if(mc_flag==0x00000031) {
_MC_FLAG = 0x00000040;
//printf("S : mc_flag = 40-->");
FdStartMc(2,3);
_ME_FLAG = 0x00000000;
//printf("S : me_flag = 0-->");
}
}
//Delay(70);
//printf("c%d\n",camcnt);
mc_flag = _MC_FLAG;
dctq_flag = _DCTQ_FLAG;
if(mc_flag==0x00000021) {
if(dctq_flag==0x00000011) {
_DCTQ_FLAG = 0x00000020;
//printf("S : dctq_flag = 20-->");
FdStartDctq(1);
}
}
else if(mc_flag==0x00000031) {
if(dctq_flag==0x00000021) {
_DCTQ_FLAG = 0x00000030;
FdStartDctq(2);
}
}
else if(mc_flag==0x00000041) {
if(dctq_flag==0x00000031) {
_DCTQ_FLAG = 0x00000040;
//printf("S : dctq_flag = 40-->");
FdStartDctq(3);
_MC_FLAG = 0x00000000;
//printf("S : mc_flag = 0-->");
}
}
}
CamCaptureStop();
while(!(camCodecStatus==CAM_STOPPED ));
rINTSUBMSK2 |= (BIT_SUB_CAMIF_C);
rINTMSK |=(BIT_CAMIF_BLOCK_POST);
}
#endif
void FdStartDctq(unsigned int frameNum)
{
//DctqEngine(&currImage2[frameNum],&refImage[frameNum],&dctqCoeff[frameNum],pQInfo,DCTQ_FRAME_START_MODE);
//DctqEngine(&currImage,&prevImage,&dctqCoeff,pQInfo,DCTQ_WITH_VLC_COEFF_WRITE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -