📄 tskvideooutput.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 + -