/* * Copyright 2004 by Texas Instruments Incorporated. * All
rights reserved. Property of Texas Instruments Incorporated. *
Restricted rights to use, duplicate or disclose this code are *
granted through contract. * */ #include <std.h>
//如果使用C语言,必须将此文件作为第一个头文件。 #include <tsk.h> #include
<sem.h> #include <gio.h>
#include <csl_dat.h> #include <csl_cache.h>
//使用CSL库,要用到的一些头文件,可参考CSL
#include <fvid.h> //视频驱动头文件 #include <edc.h> #include
<vport.h> #include <vportcap.h> #include
<vportdis.h> #include <saa7105.h> #include
<tvp51xx.h> #include <dec643.h> //芯片头文件。 //#include
<evmdm642.h>
#include <evmdm642_capParamsSDTVDefault.h> //捕获设备配置文件 #include
<evmdm642_disParamsVGADefault.h> //如用VGA显示,需要的显示设备配置文件
#include "colorbar.h" //如显示彩色滚动条,需要,否则不需要。
VPORT_PortParams EVMDM642_vCapParamsPort =
EVMDM642_CAP_PARAMS_PORT_EMBEDDED_DEFAULT; //定义捕获端口。
/* caputure configuration parameters */ /* embedded sync mode
is recommended as it offers better re-sync capability */
/* The available capture modes are */ /*
NTSC720 */ /* PAL720
*/ static VPORTCAP_Params EVMDM642_vCapParamsChan =
EVMDM642_CAP_PARAMS_CHAN_EMBEDDED_DEFAULT(PAL720); //捕获(即采集端口)端口,
为PAL制式。可依据需要改为NTSC制式
static TVP51XX_ConfParams EVMDM642_vCapParamsTVP51XX =
EVMDM642_CAP_PARAMS_TVP51XX_EMBEDDED_DEFAULT(PAL601, COMPOSITE, 0);
/* coefficients for color space conversion */ static const short
coeffs[5] = {0x2543, 0x3313, -0x0C8A, -0x1A04, 0x408D}; //VGA显示,需将
YCbCr656转换为RGB565,这是必要的转换矩阵
/* display configuration parameters */ VPORT_PortParams
EVMDM642_vDisParamsPort //显示端口定义 =
EVMDM642_DIS_PARAMS_PORT_DEFAULT;
/* The available display modes are: ** ** VGA(640x480@60fps) ** **
SVGA(800x600@60fps) ** **
XGA(1024x768@60fps)
*/
static VPORTDIS_Params EVMDM642_vDisParamsChan =
EVMDM642_DIS_PARAMS_CHAN_RGB565_DEFAULT(VGA);
//这里的显示端口定义为VGA,即支持的是VGA输出。
static SAA7105_ConfParams EVMDM642_vDisParamsSAA7105 =
EVMDM642_DIS_PARAMS_SAA7105_RGB565_DEFAULT(VGA);
/* heap IDs defined in the BIOS configuration file */ extern Int
EXTERNALHEAP; //在DSP/BIOS中已定义
/* * ======== main ======== */ main() {
/******************************************************/ /* open
CSL DAT module for fast copy */
/******************************************************/
CSL_init(); //调用任何CSL库中的函数,必须先在此调用该函数。
CACHE_clean(CACHE_L2ALL, 0, 0); //清洗Cache
CACHE_setL2Mode(CACHE_256KCACHE); //设置Cache模式
CACHE_enableCaching(CACHE_EMIFA_CE00); //使能EMIFA CE0空间
CACHE_enableCaching(CACHE_EMIFA_CE01); //使能EMIFA CE1空间
DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D); }
/* * ======== tskVideoLoopback ======== * video loopback
function. */ void tskVideoLoopback() { Int i;
Int status; Int frames = 0;
FVID_Handle disChan; FVID_Frame *disFrameBuf;
FVID_Handle capChan; FVID_Frame *capFrameBuf;
/*设置显示的行数 VGA制式为480,PAL制为576*/ Int numLinesDis =
EVMDM642_vDisParamsChan.imgVSizeFld1;
/*设置采集的行数 PAL制为576*/ Int numLinesCap =
(EVMDM642_vCapParamsChan.fldYStop1 -
EVMDM642_vCapParamsChan.fldYStrt1+1)*2;
/*判断是显示区域大,还是采集区域大,取其小者480*/ Int numLines =
(numLinesDis > numLinesCap) ? numLinesCap : numLinesDis;
/*设置采集像素数 PAL制为720*/ Int numPixels =
(EVMDM642_vCapParamsChan.fldXStop1 -
EVMDM642_vCapParamsChan.fldXStrt1+1);
/*设置采集行的增量 PAL制为720*/
Int capLinePitch = (EVMDM642_vCapParamsChan.fldXStop1 -
EVMDM642_vCapParamsChan.fldXStrt1+1); /*设置显示行的增量
VGA制为640*/ Int disLinePitch =
EVMDM642_vDisParamsChan.imgHSizeFld1; // numLines *= 2;
/* both fields */ //如果输出为PAL制,前面numLinesCap不要*2,这里再*2
/******************************************************/
/* allocate both capture and display frame buffers */ /* in
external heap memory */
/******************************************************/
EVMDM642_vDisParamsChan.segId = EXTERNALHEAP;
EVMDM642_vDisParamsSAA7105.hI2C = DEC643_I2C_hI2C;
EVMDM642_vCapParamsChan.segId = EXTERNALHEAP;
EVMDM642_vCapParamsTVP51XX.hI2C = DEC643_I2C_hI2C;
/******************************************************/
/* initialization of capture driver */
/******************************************************/ capChan =
FVID_create("/VP1CAPTURE/A/1", 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_vCapParamsTVP51XX);
CACHE_clean(CACHE_L2ALL, 0, 0); //CSL函数,冲洗Cache
/******************************************************/
/* 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 */
/***************************************************/ /* copy
data from capture buffer to display buffer */
/***************************************************/ for(i =
0; i < numLines; i++) { yc2rgb16(coeffs,
capFrameBuf->frame.iFrm.y1 + i * (capLinePitch),
capFrameBuf->frame.iFrm.cb1 + (capLinePitch >> 1) * i,
capFrameBuf->frame.iFrm.cr1 + (capLinePitch >> 1) * i,
disFrameBuf->frame.rpFrm.buf + (disLinePitch << 1) * i,
numPixels);
}//调用函数yc2rgb16,将YCbCr656转化为RGB565,这个函数为TI的汇编代码编写。
FVID_exchange(capChan, &capFrameBuf); //采集一帧视频
/*FillFrmBufRGB(&disFrameBuf->frame.rpFrm,
EVMDM642_vDisParamsChan.imgHSizeFld1,
EVMDM642_vDisParamsChan.imgVSizeFld1, frames
%(EVMDM642_vDisParamsChan.imgHSizeFld1 >> 3));*/
//上面这段代码,是VGA显示时,显示七色滚动条的。如果想显示采集的图像,不需这个。
CACHE_clean(CACHE_L2ALL, 0, 0);
FVID_exchange(disChan, &disFrameBuf); //显示一帧视频。
frames ++;
|