📄 video_ntsc_pal.c
字号:
#include <std.h>
#include <tsk.h>
#include <sem.h>
#include <gio.h>
#include <csl_dat.h>
#include <csl_cache.h>
#include <csl_gpio.h>
#include <math.h>
#include <fvid.h>
#include <edc.h>
#include <vport.h>
#include <vportcap.h>
#include <vportdis.h>
#include <saa7105.h>
#include <saa7115.h>
#include <evmdm642.h>
#include "typedef.h"
#include <stdio.h>
#include "evmdm642_vcapparams.h"
#include "evmdm642_vdisparams.h"
#include "alg.h"
#include "img_thr_le2min.h"
#define save_file 0
#define TIME 80
/* heap IDs defined in the BIOS configuration file */
extern Int EXTERNALHEAP;
//#define MAXTEMPLETEWID 100
//#define MAXTEMPLETEHEI 100
#pragma DATA_SECTION(TEMPLATE, ".INTPROCBUFF");
#pragma DATA_ALIGN(TEMPLATE, 4);
uint8 TEMPLATE[MAXTEMPLETEWID*MAXTEMPLETEHEI];
#pragma DATA_SECTION(CPLD_REG, ".INTPROCBUFF");
#pragma DATA_ALIGN(CPLD_REG, 4);
static volatile uint8 CPLD_REG[32];
#pragma DATA_SECTION(BIN, ".EXTPROCBUFF");
#pragma DATA_ALIGN(BIN, 128);
static uint8 BIN[WIDTH*HEIGHT];
extern const uint8 num0[120];
extern const uint8 num1[120];
extern const uint8 num2[120];
extern const uint8 num3[120];
extern const uint8 num4[120];
extern const uint8 num5[120];
extern const uint8 num6[120];
extern const uint8 num7[120];
extern const uint8 num8[120];
extern const uint8 num9[120];
extern const uint8 numa[120];
extern const uint8 numb[120];
extern const uint8 numc[120];
extern const uint8 numd[120];
extern const uint8 nume[120];
extern const uint8 numf[120];
extern const uint8 numx[120];
extern const uint8 numy[120];
extern const uint8 numl[120];
extern const uint8 numbeit[120];
extern const uint8 numgama[120];
extern const uint8 numblank[120];
extern const uint8 numpoint[120];
extern const uint8 numminus[120];
extern const uint8 numadd[120];
extern const uint8 numequ[120];
static const uint8 * numptr[18]={num0,num1,num2,num3,num4,num5,num6,num7,num8,num9,numa,numb,numc,numd,nume,numf,numblank,numpoint};
GPIO_Config MyConfig = {
0x00000031, /* gpgc */
0x00000038, /* gpen */
0x00000018, /* gdir */
0x000000ff, /* gpval */
0x00000000, /* gphm */
0x00000000, /* gplm */
0x00000030 /* gppol */
};
GPIO_Handle mygpiohandle;
main()
{
CSL_init();
CACHE_clean(CACHE_L2ALL, 0, 0);
CACHE_setL2Mode(CACHE_128KCACHE);
CACHE_enableCaching(CACHE_EMIFA_CE00);
CACHE_enableCaching(CACHE_EMIFA_CE01);
DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
mygpiohandle = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);
GPIO_config(mygpiohandle,&MyConfig);
GPIO_pinWrite(mygpiohandle,GPIO_PIN4,1);
IRQ_disable(IRQ_EVT_EXTINT5);
IRQ_reset(IRQ_EVT_EXTINT5);
IRQ_enable(IRQ_EVT_EXTINT5);
// memset(sour,0xff,40);
}
/*
* ======== tskVideoLoopback ========
* video loopback function.
*/
void tskVideoLoopback()
{
#if save_file //for test
FILE *fp;
char *name="d:\\1.dat";
#endif
//int32 size;
//int32 c0,y0,c1,y1;
int32 m,i,j;
int32 leftx,lefty,rightx,righty,tempx,tempy;
int32 c_mx,c_lx,c_my,c_ly;
int32 status;
int32 x,y;
int32 x0,y0,x1,y1;
int32 Tr;
int32 offx,offy;
FVID_Handle disChan;
int32 frames = 0;
FVID_Frame *disFrameBuf;
int32 TEMWIDTH;
int32 TEMHEIGHT;
point portdoor1,portdoor2;
int prd_leftx[3],prd_lefty[3];
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------
// 工作模式选择
int32 findrlt=0;//找到与否
//int32 TEMPLA_CHANGE=1;//为1表示更新模板,为0表示不更新
int32 PORTMODE=0; //0为模板匹配跟踪,1为形心跟踪
int32 NEEDIMG_FIND=1; // 1表示将要全场搜索,1则为波门内搜索
int32 PRED=160;//为0后则进行全场搜索
uint8 reg1=0x1c;
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Int numLines = (numLinesDis > numLinesCap) ? numLinesCap : numLinesDis;
Int numLines=EVMDM642_vDisParamsChan.imgVSizeFld1;
FVID_Handle capChan;
int32 numPixels = EVMDM642_vCapParamsChan.fldXStop1 -
EVMDM642_vCapParamsChan.fldXStrt1+1;
FVID_Frame *capFrameBuf;
int32 capLinePitch = EVMDM642_vCapParamsChan.fldXStop1 -
EVMDM642_vCapParamsChan.fldXStrt1+1;
int32 disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;
// numLines *= 2; /* both fields */
/******************************************************/
/* allocate both capture and display frame buffers */
/* in external heap memory */
/******************************************************/
EVMDM642_vCapParamsChan.segId = EXTERNALHEAP;
EVMDM642_vDisParamsChan.segId = EXTERNALHEAP;
EVMDM642_vDisParamsSAA7105.hI2C = EVMDM642_I2C_hI2C;
EVMDM642_vCapParamsSAA7115.hI2C = EVMDM642_I2C_hI2C;
/******************************************************/
/* initialization of capture driver */
/******************************************************/
capChan = FVID_create("/VP0CAPTURE/A/0",
IOM_INPUT, &status, (Ptr)&EVMDM642_vCapParamsChan, NULL);
/******************************************************/
/* initialization of display driver */
/******************************************************/
disChan = FVID_create("/VP2DISPLAY", IOM_OUTPUT,
&status, (Ptr)&EVMDM642_vDisParamsChan, NULL);
/******************************************************/
/* configure video encoder & decoder */
/******************************************************/
FVID_control(disChan, VPORT_CMD_EDC_BASE + EDC_CONFIG,
(Ptr)&EVMDM642_vDisParamsSAA7105);
FVID_control(capChan, VPORT_CMD_EDC_BASE + EDC_CONFIG,
(Ptr)&EVMDM642_vCapParamsSAA7115);
/******************************************************/
/* start capture & display operation */
/******************************************************/
FVID_control(disChan, VPORT_CMD_START, NULL);
FVID_control(capChan, VPORT_CMD_START, NULL);
/********************************************************/
/* request a frame buffer from display & capture driver */
/********************************************************/
FVID_alloc(disChan, &disFrameBuf);
FVID_alloc(capChan, &capFrameBuf);
frames ++;
while(1){/* loop forever */
int32 i;
int gama,beit,tempgama,tempbeit,tempgamaH4,tempgamaH3,tempgamaH2,tempbeitH4,tempbeitH3,tempbeitH2;
int gamaH4, gamaH3,gamaH2,gamaH1,gamaL1,gamaL2,beitH4,beitH3,beitH2,beitH1,beitL1,beitL2;
int gamapoint,beitpoint,p1,p2;
int L,LH5,LH4,LH3,LH2,LH1,tempLH5,tempLH4,tempLH3,tempLH2;
unsigned char * frame1=capFrameBuf->frame.iFrm.y1;
unsigned char * frame2=capFrameBuf->frame.iFrm.y1+WIDTH*HEIGHT;
CPLD_REG[17]=0xff;
CPLD_REG[16]=0xFF;
CPLD_REG[19]=0xff;
CPLD_REG[18]=0xFF;
//COPY ODD FIELD ==========================
for(i = 0; i < numLines; i ++)
{
DAT_copy(frame1 + i * (capLinePitch ),
disFrameBuf->frame.iFrm.y1 + 2*i * (disLinePitch),
numPixels);
DAT_copy(capFrameBuf->frame.iFrm.cb1 + i * (capLinePitch >> 1),
disFrameBuf->frame.iFrm.cb1 + i * (disLinePitch ),
numPixels>>1);
DAT_copy(capFrameBuf->frame.iFrm.cr1 + i * (capLinePitch >> 1),
disFrameBuf->frame.iFrm.cr1 + i * (disLinePitch ),
numPixels>>1);
}
// CACHE_wbInvL2(TEMPLATE,512*287,CACHE_WAIT);
//=============================works now ===========================================================
if(0x00==(CPLD_REG[8]&0x80)) //自动搜索
{
if(1==NEEDIMG_FIND)
{
// Tr=mia(frame1);
//IMG_thr_le2min(frame1,BIN, WIDTH, HEIGHT,Tr);
findrlt=find_object(frame1,100,&leftx,&lefty,&rightx,&righty);
if(1==findrlt)
{
PRED=160;
NEEDIMG_FIND=0;
TEMWIDTH=(rightx-leftx+1);
TEMHEIGHT=(righty-lefty+1);
portdoor1.x=(leftx>10)?(leftx-10):0;
portdoor1.y=(lefty>6)?(lefty-6):0;
portdoor2.x=(rightx>502)?512:(rightx+10);
portdoor2.y=(righty>281)?287:(righty+6);
prd_leftx[0]=prd_leftx[1];
prd_lefty[0]=prd_lefty[1];
prd_leftx[1]=prd_leftx[2];
prd_lefty[1]=prd_lefty[2];
prd_leftx[2]=leftx;
prd_lefty[2]=lefty;
if((TEMWIDTH*TEMHEIGHT)<10000)//更新模板
{
PORTMODE=0;
for(i=0;i<TEMHEIGHT;i++)
{
for(j=0;j<TEMWIDTH;j++)
{
TEMPLATE[TEMWIDTH*i+j]=frame1[((lefty+i)<<9)+leftx+j];
}
}
//templa_change=0;
}
else
{
PORTMODE=1;//目标太大,转为形心跟踪
matr_cent((frame1+((portdoor1.y*WIDTH)+portdoor1.x)),(portdoor2.x-portdoor1.x+1),(portdoor2.y-portdoor1.y+1), &x0,&y0);
}
}
}//全场搜索完毕
else //波门内搜索开始
{
if(0==PORTMODE)//模板匹配模式
{
findrlt=wnd_find(TEMPLATE, (frame1+((portdoor1.y*WIDTH)+portdoor1.x)),TEMWIDTH,TEMHEIGHT,&offx,&offy);
if(1==findrlt)
{
leftx=portdoor1.x+offx;
lefty=portdoor1.y+offy;
rightx=leftx+TEMWIDTH-1;
righty=lefty+TEMHEIGHT-1;
portdoor1.x=(leftx>10)?(leftx-10):0;
portdoor1.y=(lefty>6)?(lefty-6):0;
portdoor2.x=(rightx>502)?512:(rightx+10);
portdoor2.y=(righty>281)?287:(righty+6);
prd_leftx[0]=prd_leftx[1];
prd_lefty[0]=prd_lefty[1];
prd_leftx[1]=prd_leftx[2];
prd_lefty[1]=prd_lefty[2];
prd_leftx[2]=leftx;
prd_lefty[2]=lefty;
PRED=160;
NEEDIMG_FIND=0;
}
else
{
//预测预测值
prd_leftx[2]=(prd_leftx[1]<<1)-prd_leftx[0];
prd_lefty[2]=(prd_lefty[1]<<1)-prd_lefty[0];
prd_leftx[0]=prd_leftx[1];
prd_lefty[0]=prd_lefty[1];
prd_leftx[1]=prd_leftx[2];
prd_lefty[1]=prd_lefty[2];
portdoor1.x=(prd_leftx[2]>10)?(prd_leftx[2]-10):0;
portdoor1.y=(prd_lefty[2]>6)?(prd_lefty[2]-6):0;
portdoor2.x=((TEMWIDTH+prd_leftx[2])>502)?512:(TEMWIDTH+prd_leftx[2]+10);
portdoor2.y=((TEMHEIGHT+prd_lefty[2])>281)?287:(TEMHEIGHT+prd_lefty[2]+6);
PRED--;
if(0==PRED)
NEEDIMG_FIND=1;
}
}//匹配结束
else
{
matr_cent((frame1+((portdoor1.y*WIDTH)+portdoor1.x)),(portdoor2.x-portdoor1.x+1),(portdoor2.y-portdoor1.y+1), &x1,&y1);
leftx=leftx+x1-x0;
lefty=lefty+y1-y0;
rightx=rightx+x1-x0;
righty=righty+y1-y0;
x0=x1;y0=y1;
portdoor1.x=(leftx>10)?(leftx-10):0;
portdoor1.y=(lefty>6)?(lefty-6):0;
portdoor2.x=(rightx>502)?512:(rightx+10);
portdoor2.y=(righty>281)?287:(righty+6);
}
}
} //end auto search
else //手工指定搜索
{
//extra code here
Tr=mia(frame1);
IMG_thr_le2min(frame1,BIN, WIDTH, HEIGHT,Tr);
x=(((int32)CPLD_REG[9])<<8)+(int32)CPLD_REG[10];
y=(((int32)CPLD_REG[11])<<8)+(int32)CPLD_REG[12];
findrlt=manual_find(BIN, Tr,x, y,&leftx,&lefty,&rightx,&righty);
if(1==findrlt)
{
PRED=160;
NEEDIMG_FIND=0;
TEMWIDTH=rightx-leftx+1;
TEMHEIGHT=righty-lefty+1;
portdoor1.x=(leftx>10)?(leftx-10):0;
portdoor1.y=(lefty>6)?(lefty-6):0;
portdoor2.x=(rightx>502)?512:(rightx+10);
portdoor2.y=(righty>281)?287:(righty+6);
prd_leftx[0]=prd_leftx[1];
prd_lefty[0]=prd_lefty[1];
prd_leftx[1]=prd_leftx[2];
prd_lefty[1]=prd_lefty[2];
prd_leftx[2]=leftx;
prd_lefty[2]=lefty;
}
if((TEMWIDTH*TEMHEIGHT)<10000)//更新模板
{
PORTMODE=0;
for(i=0;i<TEMHEIGHT;i++)
{
for(j=0;j<TEMWIDTH;j++)
{
TEMPLATE[TEMWIDTH*i+j]=frame1[((lefty+i)<<9)+leftx+j];
}
}
//templa_change=0;
}
else
{
PORTMODE=1;//目标太大,转为形心跟踪
matr_cent((frame1+((portdoor1.y*WIDTH)+portdoor1.x)),(portdoor2.x-portdoor1.x+1),(portdoor2.y-portdoor1.y+1), &x0,&y0);
}
} //manual search end
tempx=((leftx+rightx)>>1)-256;
tempy=((lefty+righty)>>1)-144;
reg1=(tempx<0)?reg1:(reg1&0xf7);
reg1=(tempy>0)?reg1:(reg1&0xfb);
tempx=abs(tempx);
tempy=abs(tempy);
reg1=reg1|((uint8)((tempx&0x0001)<<1));
reg1=reg1|((uint8)(tempy&0x0001));
reg1=reg1|(uint8)(findrlt<<6);
GPIO_pinWrite(mygpiohandle,GPIO_PIN4,1);
/* tempq1=rightx-leftx;
tempq2=righty-lefty;
q1=(tempq1>0xFF)?0xFF:tempq1;
q2=(tempq2>0xFF)?0xFF:tempq2;
reg6=q1;
reg7=q2;*/
RAM2=(tempx>>1);
RAM3=(tempy>>1);
GPIO_pinWrite(mygpiohandle,GPIO_PIN4,0);
//COPY EVEN FIELD====================================================================================
for(i = 0; i < numLines; i ++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -