⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 video_rgb.c

📁 自己编写的,采用DSP实现字符叠加的程序,基于合众达SEED-DEC643的扳子,CCS2.2环境,原来的例程是采用FPGA实现字符叠加的,改程序完全采用DSP进行叠加.
💻 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 + -