📄 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 "24a0addr.h"
#include "24a0lib.h"
#include "fim20_def.h"
#include "memc_test.h"
#include "dctq_test.h"
#include "vlx_test.h"
#include "mobile_demo.h"
//#include "iic_s5x532.h"
#include "camif.h"
#include "lcdlib.h"
#include "post.h"
#include "camproset.h"
#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 U32 d_dctqDone, d_meDone, d_mcDone, d_vlxDone, d_camDone;
volatile U32 c_dctqDone, c_meDone, c_mcDone, c_vlxDone, c_camDone;
volatile U32 c_dctqCnt, c_meCnt, c_mcCnt, c_vlxCnt, c_camCnt;
volatile U32 _DCTQ_FLAG,_ME_FLAG,_MC_FLAG, _CAMIF_FLAG, _POSTLCD_FLAG;
volatile U32 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 U32 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;
Uart_Printf("\n\nS3C24A0A MPEG4 Test Program \n\n");
while(1)
{ //display menu
Uart_Printf("%2d:%s",i,mp4_function[i][1]);
i++;
if((int)(mp4_function[i][0])==0)
{
Uart_Printf("\n");
break;
}
if((i%2)==0)
Uart_Printf("\n");
}
Uart_Printf("\nSelect the function to test : ");
i = Uart_GetIntNum();
Uart_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;
U32 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]);
Uart_Printf("FC=%d\n", (rMODE&(0x3<<10))>>10);
//Uart_Printf("rpriority=%d, %d\n", rPRIORITY0, rPRIORITY1);
//rPRIORITY0=rPRIORITY1=0x1;
//Fim20Scheduler();
// Post_Envid_On();
// printf("dkdkdkd\n");
// Uart_Printf("FC=%d\n", (rMODE&(0x3<<10))>>10);
Uart_TxEmpty(0);
PostInit(384, 320, 352, 288, 16, 16,
240, 320, 240, 320, 0, 0,
0x11000000, LCDFRAMEBUFFERBG1, POST_IN_YCBYCR420|POST_OUT_RGB16B);
LcdEnvidOnOff(1);
Init_FIMV20_Isr();
pVlcData=(U32 *)0x12300000;
VlcConfig4Dctq(352,(U32)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
+ |
| |
+--<--<--<---+
*/
U32 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)
{
//printf(" wif");
//MMU_WaitForInterrupt();
//rPRIORITY0 |= (0<<1); // fixed priority I-BUS
//rPRIORITY1 |= (0<<1); // fixed priority I-BUS
Image_Select();
Camera_Initialize();
// step 1 : Initialize ISR
Fim20DemoIsrUnmask();
// step 2 : Initialize memory map
Fim20DemoMem();
// step 3 : start scheduler
Fim20Scheduler();
// step 4 : mask mpeg4 ISR
Fim20DemoIsrMask();
//LcdEnvidOnOff(0);
}
void Camera_Initialize(void)
{
rCIGCTRL|=(1<<31);
Delay(100);
rCIGCTRL&=~(1<<31);
CamReset(1);
CameraModuleSetting();
}
extern volatile U32 camTestMode;
extern volatile U32 camCodecCaptureCount;
extern volatile U32 camPviewCaptureCount;
extern volatile U32 camCodecStatus;
extern volatile U32 camPviewStatus;
extern volatile U32 amount;
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) {
_DCTQ_FLAG = 0x00000010;
//Uart_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;
//Uart_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;
//Uart_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;
//Uart_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;
//Uart_Printf("S : post_flag = 10-->");
//PostStartProcessing(0);
PostStartFIMV20(refImage[0].frameStartAddr);
//Uart_Printf("cp1 = %d\n",camcnt);
}
}
else if(dctq_flag==0x00000021) {
if(post_flag==0x00000011) {
_POSTLCD_FLAG = 0x00000020;
//Uart_Printf("S : post_flag = 20-->");
//PostStartProcessing(1);
PostStartFIMV20(refImage[1].frameStartAddr);
//Uart_Printf("cp2 = %d\n",camcnt);
}
}
else if(dctq_flag==0x00000031) {
if(post_flag==0x00000021) {
_POSTLCD_FLAG = 0x00000030;
//Uart_Printf("S : post_flag = 30-->");
//PostStartProcessing(2);
PostStartFIMV20(refImage[2].frameStartAddr);
//Uart_Printf("cp3 = %d\n",camcnt);
}
}
else if(dctq_flag==0x00000041) {
if(post_flag==0x00000031) {
_POSTLCD_FLAG = 0x00000040;
//Uart_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;
//Uart_Printf("S : mc_flag = 20-->");
FdStartMc(0,1);
}
}
else if(me_flag==0x00000031) {
if(mc_flag==0x00000021) {
_MC_FLAG = 0x00000030;
//Uart_Printf("S : mc_flag = 30-->");
FdStartMc(1,2);
}
}
else if(me_flag==0x00000041) {
if(mc_flag==0x00000031) {
_MC_FLAG = 0x00000040;
//Uart_Printf("S : mc_flag = 40-->");
FdStartMc(2,3);
_ME_FLAG = 0x00000000;
//Uart_Printf("S : me_flag = 0-->");
}
}
//Delay(70);
//Uart_Printf("c%d\n",camcnt);
mc_flag = _MC_FLAG;
dctq_flag = _DCTQ_FLAG;
if(mc_flag==0x00000021) {
if(dctq_flag==0x00000011) {
_DCTQ_FLAG = 0x00000020;
//Uart_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;
//Uart_Printf("S : dctq_flag = 40-->");
FdStartDctq(3);
_MC_FLAG = 0x00000000;
//Uart_Printf("S : mc_flag = 0-->");
}
}
}
}
void FdStartDctq(U32 frameNum)
{
//DctqEngine(&currImage2[frameNum],&refImage[frameNum],&dctqCoeff[frameNum],pQInfo,DCTQ_FRAME_START_MODE);
//DctqEngine(&currImage,&prevImage,&dctqCoeff,pQInfo,DCTQ_WITH_VLC_COEFF_WRITE);
//DctqEngine(&currImage, &refImage[prevImageNum], &dctqCoeff[frameNum], pQInfo, DCTQ_WITH_VLC_COEFF_WRITE);
DctqEngine(&currImage2[frameNum],&refImage[frameNum],&dctqCoeff[frameNum],pQInfo,DCTQ_WITH_VLC_COEFF_NOTWRITE);
}
void FdStartMe(U32 frameNum,U32 prevFrameNum)
{
MeEngine(&currImage2[frameNum],&refImage[prevFrameNum],meVector2[frameNum],0);
}
void FdStartMc(U32 frameNum,U32 prevFrameNum)
{
McEngine(&refImage[prevFrameNum],&refImage[frameNum],meVector2[frameNum],0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -