📄 video_rgb.c
字号:
/*
* 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>
#include <tsk.h>
#include <sem.h>
#include <gio.h>
#include <csl_dat.h>
#include <csl_cache.h>
#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 <osdcolor.h>
#include <osdutil.h>
//#include <tskOSD.h>
#include <evmdm642_capParamsSDTVDefault.h>
#include <evmdm642_disParamsVGADefault.h>
#define OSDBUF_HSIZE 720
/*确定处理的范围*/
/*A */
/* */
/* D*/
int intAPixels = 0;
int intALines = 0;
int intDPixels = 530;
int intDLines = 410;
/*确定图像的参数*/
int numPixels = 720;//每行720个像素
int numLines = 576;//每帧576行(PAL)
/*二值化阈值初始化*/
Uint8 intThreshold = 0x80;
/*****进行阈值分割处理*********/
void threshold();
/*****画矩形边框函数的声明*****/
void drawRectangle();
/*画白色区域函数的声明*/
void drawWhite();
/* coefficients for color space conversion */
static const short coeffs[5] = {0x2543, 0x3313, -0x0C8A, -0x1A04, 0x408D};
/********************************************************/
/* define a address for buffer of User */
/********************************************************/
Uint32 tempYbuffer = 0x80200000; //临时
Uint32 tempCbbuffer = 0x80254600;
Uint32 tempCrbuffer = 0x8027E900;
Uint8 *osdBuf=(Uint8 *)0x80400000;
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);
static TVP51XX_ConfParams EVMDM642_vCapParamsTVP51XX
= EVMDM642_CAP_PARAMS_TVP51XX_EMBEDDED_DEFAULT(PAL601, COMPOSITE, 0);
/* The available display modes are: **
** VGA(640x480@60fps) **
** SVGA(800x600@60fps) **
** XGA(1024x768@60fps) */
/* display configuration parameters */
VPORT_PortParams EVMDM642_vDisParamsPort
= EVMDM642_DIS_PARAMS_PORT_DEFAULT;
static VPORTDIS_Params EVMDM642_vDisParamsChan
= EVMDM642_DIS_PARAMS_CHAN_RGB565_DEFAULT(VGA);
static SAA7105_ConfParams EVMDM642_vDisParamsSAA7105
= EVMDM642_DIS_PARAMS_SAA7105_RGB565_DEFAULT(VGA);
/* heap IDs defined in the BIOS configuration file */
extern Int EXTERNALHEAP;
/*
* ======== main ========
*/
main()
{
/******************************************************/
/* open CSL DAT module for fast copy */
/******************************************************/
CSL_init();
CACHE_clean(CACHE_L2ALL, 0, 0);
CACHE_setL2Mode(CACHE_256KCACHE);
CACHE_enableCaching(CACHE_EMIFA_CE00);
CACHE_enableCaching(CACHE_EMIFA_CE01);
DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
}
/*
* ======== tskVideoLoopback ========
* video loopback function.
*/
void tskVideoLoopback()
{
Int status;
Int i;
Int frames = 0; //不是必需的,如用到七彩条纹显示,需要
char *pString="00 2008nian 12yue 22ri 00";
FVID_Handle capChan;
FVID_Frame *capFrameBuf;
FVID_Handle disChan;
FVID_Frame *disFrameBuf;
OSDUTIL_Point a, b;
//捕捉的行数
Int numLinesCap = (EVMDM642_vCapParamsChan.fldYStop1 -
EVMDM642_vCapParamsChan.fldYStrt1+1) * 2;
//捕获的每行的偏移量
Int capLinePitch = EVMDM642_vCapParamsChan.fldXStop1 -
EVMDM642_vCapParamsChan.fldXStrt1+1;
//显示的行数
Int disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;
//显示的列数
Int numLinesDis = EVMDM642_vDisParamsChan.imgVSizeFld1;
//每行的像素个数
Int numPixels = EVMDM642_vCapParamsChan.fldXStop1 -
EVMDM642_vCapParamsChan.fldXStrt1+1;
//显示行数和捕捉行数,谁小选谁.
Int numLines = (numLinesDis > numLinesCap) ? numLinesCap : numLinesDis;
/******************************************************/
/* 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);
/******************************************************/
/* 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);
/*numPixels=720;
capLinePitch=720;
disLinePitch=640; */
/*-----------字符叠加相关--------------------------------*/
a.x = 0;
a.y = 0;
b.x = OSDBUF_HSIZE -1;
b.y = numLines-intDLines-1;
OSDUTIL_rectangle((Uint8 *)osdBuf, &a, &b, 0xff, OSDBUF_HSIZE);
/*-------------------------------------------------------*/
frames ++;
while(1)
{/* loop forever */
/*将数据存入显示缓冲区,并清采集完成的标志*/
for(i=0;i<numLines;i++)
{
DAT_copy((void *)((Uint32)capFrameBuf->frame.iFrm.y1 + i * numPixels),
(void *)(tempYbuffer+ i * numPixels),
numPixels);
}
/* for(i=intDLines;i<numLines;i++)
{
DAT_copy( (void *)( (char*)osdBuf + (i-intDLines) * numPixels),
(void *)( (char*)tempYbuffer + i * numPixels),
numPixels);
} */
for(i=0;i<numLines;i++)
{
DAT_copy((void *)((Uint32)capFrameBuf->frame.iFrm.cb1 + i * (numPixels >> 1)),
(void *)(tempCbbuffer+ i * (numPixels >> 1)),
(numPixels >> 1));
}
for(i=0;i<numLines;i++)
{
DAT_copy((void *)((Uint32)capFrameBuf->frame.iFrm.cr1 + i * (numPixels >> 1)),
(void *)(tempCrbuffer+ i * (numPixels >> 1)),
(numPixels >> 1));
}
/*--------字符叠加-----------------------*/
a.x = 120;
a.y = 20;
/* if (frames%10==0) (*pString)='2';
else (*pString)='1';*/
(*pString)='0'+(frames%10);
OSDUTIL_text((Uint8 *)osdBuf, OSDBUF_HSIZE,
&a, pString,
OSDUTIL_FONT_DEFAULT, 0x00, 0xff);
for(i=intDLines;i<numLines;i++)
{
DAT_copy( (void *)( (char*)osdBuf + (i-intDLines) * numPixels),
(void *)( (char*)tempYbuffer + i * numPixels),
numPixels);
}
/*--------------------------------------*/
/*画边框*/
// drawRectangle();
/*画白色区域*/
// drawWhite();
/*进行阈值分割处理*/
// threshold();
// FillFrmBufRGB(&disFrameBuf->frame.rpFrm, EVMDM642_vDisParamsChan.imgHSizeFld1,
// EVMDM642_vDisParamsChan.imgVSizeFld1, frames%(EVMDM642_vDisParamsChan.imgHSizeFld1>>3));
for(i = 0; i < numLines; i++)
{
yc2rgb16(coeffs,
(char *)tempYbuffer + i * (capLinePitch),
(char *)tempCbbuffer + (capLinePitch >> 1) * i,
(char *)tempCrbuffer + (capLinePitch >> 1) * i,
disFrameBuf->frame.rpFrm.buf + (disLinePitch << 1) * i,
numPixels);
}
/***************************************************/
/* 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);
}*/
FVID_exchange(capChan, &capFrameBuf);
CACHE_clean(CACHE_L2ALL, 0, 0);
FVID_exchange(disChan, &disFrameBuf);
frames ++;
}
}
/*画矩形边框函数的定义*/
void drawRectangle()
{
int i,j;
/*画上边*/
for(i=intALines-4;i<intALines;i++) //边框长度
{
for(j=intAPixels-6;j<intDPixels+6;j++) //边框宽度
{
*(Uint8 *)((char*)tempYbuffer+i*numPixels+j) = 0x00;
}
}
/*画下边*/
for(i=intDLines;i<intDLines+4;i++)//边框长度
{
for(j=intAPixels-6;j<intDPixels+6;j++) //边框宽度
{
*(Uint8 *)((char*)tempYbuffer+i*numPixels+j) = 0x00;
}
}
/*画左边*/
for(i=intALines;i<intDLines;i++)//边框长度
{
for(j=intAPixels-6;j<intAPixels;j++) //边框宽度
{
*(Uint8*)((char*)tempYbuffer+i*numPixels+j)=0x00;
}
}
/*画右边*/
for(i=intALines;i<intDLines;i++)//边框长度
{
for(j=intDPixels;j<intDPixels+6;j++) //边框宽度
{
*(Uint8*)((char*)tempYbuffer+i*numPixels+j)=0x80;
}
}
}
/*画白色区域函数的定义*/
void drawWhite()
{
int i,j;
/*画下边*/
for(i=intDLines;i<intDLines+4;i++)//边框长度
{
for(j=intAPixels-6;j<intDPixels+(numLines-intDLines);j++) //边框宽度
{
*(Uint8 *)((char*)tempYbuffer+i*numPixels+j) = 0x00;
}
}
/*画右边*/
for(i=intALines;i<intDLines;i++)//边框长度
{
for(j=intDPixels;j<intDPixels+(numPixels-intDPixels);j++) //边框宽度
{
*(Uint8*)((char*)tempYbuffer+i*numPixels+j)=0x00;
}
}
}
/*****进行阈值分割处理*********/
void threshold()
{
int i,j;
for(i=intALines;i<intDLines;i++)//行数
{
for(j=intAPixels;j<intDPixels;j++) //像素数/每行
{
*(Uint8*)((char*)tempYbuffer+i*numPixels +j)
=*(Uint8*)((char*)tempYbuffer+i*numPixels+j)<intThreshold?0x00:0xFF;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -