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

📄 tskvideooutput.c

📁 合众达DEC643的视频例程 CCS 2.20.18 开发
💻 C
字号:
/*
 *  Copyright 2003 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 <csl.h>
#include <csl_dat.h>
#include <csl_cache.h>
#include <chan.h>
#include <scom.h>
#include <utl.h>
#include <fvid.h>
#include <tsk.h>

#include <edc.h>
#include <vport.h>
#include <vportdis.h>
#include <saa7105.h>    
#include <dec643.h>                     
#include <evmdm642_disParamsSDTVDefault.h>

#include"evmdm642_capParamsSDTVDefault.h"
#include"vportcap.h"
#include "appMain.h"
#include "appThreads.h"
#include "tskVideoOutput.h"
#include "prepost.h"

/*确定图像的参数*/
int numPixels = 720;//每行720个像素
int numLines  = 576;//每帧576行(PAL)


/*确定处理的范围*/
/*A             */
/*              */
/*             D*/ 
int intAPixels = 190;
int intALines = 118;
int intDPixels = 530; 
int intDLines = 458;
/*****画矩形边框函数的声明*****/
void drawRectangle();
/*****进行图像反色处理*********/
void videoReverse();

static VPORTCAP_Params EVMDM642_vCapParamsChan 
  = EVMDM642_CAP_PARAMS_CHAN_EMBEDDED_DEFAULT(PAL720);

VPORT_PortParams EVMDM642_vDisParamsPort 
  = EVMDM642_DIS_PARAMS_PORT_DEFAULT;

static VPORTDIS_Params EVMDM642_vDisParamsChan 
  = EVMDM642_DIS_PARAMS_CHAN_BT656_DEFAULT(PAL);

static SAA7105_ConfParams EVMDM642_vDisParamsSAA7105 
  = EVMDM642_DIS_PARAMS_SAA7105_SDTV_DEFAULT(PAL720, SVIDEO);


FVID_Handle  disChan;

/*-------------------------------------------------------*/
/* Initialize the display channel                        */
/*-------------------------------------------------------*/
void tskVideoOutputInit()
{
    int status;    

	EVMDM642_vDisParamsChan.segId = extHeap; //EXTERNALHEAP;
    EVMDM642_vDisParamsSAA7105.hI2C = DEC643_I2C_hI2C;
    
    /******************************************************/
    /* 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);

}


/*-------------------------------------------------------*/
/* Start the display channel                             */
/*-------------------------------------------------------*/
void tskVideoOutputStart() 
{
	FVID_control(disChan, VPORT_CMD_START, NULL);
}

FVID_Frame *disFrameBuf;
/*视频处理及输出任务*/
void tskVideoOutput()
{
   	Int i;
	
	SCOM_Handle fromInput1toDIS,fromDIStoInput1;
		
	FVID_Frame *capFrameBuf;
	//FVID_Frame *disFrameBuf;
    /*设置显示的行数*/
    Int numLinesDis = EVMDM642_vDisParamsChan.imgVSizeFld1;
    /*设置采集的行数*/
    Int numLinesCap = (EVMDM642_vCapParamsChan.fldYStop1 -
       			      EVMDM642_vCapParamsChan.fldYStrt1+1);
    /*判断是显示区域大,还是采集区域大,取其小者*/   
    Int numLines = (numLinesDis > numLinesCap) ? numLinesCap : numLinesDis;
    /*设置采集像素数*/
    Int numPixels = (EVMDM642_vCapParamsChan.fldXStop1 - 
       			    EVMDM642_vCapParamsChan.fldXStrt1+1);
    /*设置采集行的增量*/
    Int capLinePitch = (EVMDM642_vCapParamsChan.fldXStop1 - 
                       EVMDM642_vCapParamsChan.fldXStrt1+1);
    /*设置显示行的增量*/
    Int disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;
    
    numLines *= 2; /* both fields */
      		         
    /*打开SCOM模块*/
    fromInput1toDIS = SCOM_open("IN1TODIS");
	fromDIStoInput1 = SCOM_open("DISTOIN1");

    /*申请一个空间*/
    FVID_alloc(disChan, &disFrameBuf); 
    
    while(1)
    {
	 	/*-----------------------------------------------------------*/
	  	/* Wait for the message from the process task to recieve new */
	  	/* frame to be displayed.                                    */
	   	/*-----------------------------------------------------------*/
	 	capFrameBuf = (FVID_Frame *)SCOM_getMsg(fromInput1toDIS, SYS_FOREVER);
		
		/*将数据放入相应的显示缓冲区*/
		/*
    	for(i = 0; i < numLines; i ++) 
        {
            DAT_copy(capFrameBuf->frame.iFrm.y1 + i * capLinePitch, 
                     disFrameBuf->frame.iFrm.y1 + i * disLinePitch,
                     numPixels);
        }
        DAT_wait(DAT_XFRID_WAITALL);		         
		CACHE_clean(CACHE_L2ALL,NULL,NULL);
		*/
		disFrameBuf = capFrameBuf;	
		 /*画边框*/    
//    	drawRectangle(); 
    
		/*进行图像反色处理*/
//		videoReverse();	
		
//		memset(disFrameBuf->frame.iFrm.cb1,0x00,((FRM_WIDTH*FRM_HEIGHT)>>1));
// 		memset(disFrameBuf->frame.iFrm.cr1,0x00,((FRM_WIDTH*FRM_HEIGHT)>>1));		   

	   	/*-----------------------------------------------------------*/
	   	/* Display the decoded frame.                                */
	  	/*-----------------------------------------------------------*/
	    FVID_exchange(disChan, &disFrameBuf);
	
	  	/*-----------------------------------------------------------*/
		/* Send message to process task to continue                  */ 
		/*-----------------------------------------------------------*/
	 	SCOM_putMsg(fromDIStoInput1, NULL);/* loop forever */
    }	
}

/*画矩形边框函数的定义*/
void drawRectangle()
{
    int i,j;
    /*画上边*/
    for(i=intALines-4;i<intALines;i++)  //边框长度
	{
	    for(j=intAPixels-6;j<intDPixels+6;j++) //边框宽度
	    {
	    	 *(Uint8 *)(disFrameBuf->frame.iFrm.y1 + i*numPixels + j) = 0xFF;
	    }
	}	

	/*画下边*/
    for(i=intDLines;i<intDLines+4;i++)//边框长度
	{
	    for(j=intAPixels-6;j<intDPixels+6;j++) //边框宽度
	    {
	    	 *(Uint8 *)(disFrameBuf->frame.iFrm.y1 + i*numPixels + j) = 0xFF;
	    }
	}
	/*画左边*/
    for(i=intALines;i<intDLines;i++)//边框长度
	{
	    for(j=intAPixels-6;j<intAPixels;j++) //边框宽度
	    {
	    	 *(Uint8 *)(disFrameBuf->frame.iFrm.y1 + i*numPixels + j) = 0xFF;
	    }
	}
	
	/*画右边*/
    for(i=intALines;i<intDLines;i++)//边框长度
	{
	    for(j=intDPixels;j<intDPixels+6;j++) //边框宽度
	    {
	    	 *(Uint8 *)(disFrameBuf->frame.iFrm.y1 + i*numPixels + j) = 0xFF;
	    }
	}
} 

/*进行图像反色处理*/
void videoReverse()
{
	int i,j;
	for(i=intALines;i<intDLines;i++) //行数
	{
	    for(j=intAPixels;j<intDPixels;j++) //像素个数/每行
	    {
            *(Uint8 *)(disFrameBuf->frame.iFrm.y1 + i*numPixels + j) =  0xFF-*(Uint8 *)(disFrameBuf->frame.iFrm.y1 + i*numPixels + j);
//	    	*(Uint8 *)(disFrameBuf->frame.iFrm.cb1 + i*numPixels + j) =  0xFF-*(Uint8 *)(disFrameBuf->frame.iFrm.cb1 + i*numPixels + j);
//	    	*(Uint8 *)(disFrameBuf->frame.iFrm.cr1 + i*numPixels + j) =  0xFF-*(Uint8 *)(disFrameBuf->frame.iFrm.cr1 + i*numPixels + j);
	    }    	 
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -