📄 video.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.
*
*/
/* "@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)" */
#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 "saa7121.h"
#include "tvp5150a.h"
#include "edma_c.h"
#include <evmdm642.h>
#include "vcapparams.h"
#include "vdisparams.h"
#include "sobel.h"
#include "contrast.h"
extern unsigned char nMemTemp[720*3];
volatile int m_old_x = 0;
volatile int m_old_y = 0;
volatile int old_point_x = 0;
volatile int old_point_y = 0;
#define ImageSize 414720 //720*576
#define BufSize 17280 //180*96
#pragma DATA_SECTION(in_data,".external");
#pragma DATA_ALIGN(in_data,4);
unsigned char in_data[ImageSize];
#pragma DATA_SECTION(ping_data,".internal");
#pragma DATA_ALIGN(ping_data,4);
unsigned char ping_data[BufSize];
#pragma DATA_SECTION(pong_data,".internal");
#pragma DATA_ALIGN(pong_data,4);
unsigned char pong_data[BufSize];
#pragma DATA_SECTION(sdr, ".internal");
#pragma DATA_SECTION(dst, ".internal");
#pragma DATA_ALIGN(sdr,4);
#pragma DATA_ALIGN(dst,4);
static unsigned char * sdr;
static unsigned char * dst;
/* heap IDs defined in the BIOS configuration file */
extern Int EXTERNALHEAP;
static int pingpong = 0;
volatile int edma_test = 0 ;
/*
* ======== main ========
*/
main()
{
/******************************************************/
/* open CSL DAT module for fast copy */
/******************************************************/
int i ;
CSL_init();
CACHE_clean(CACHE_L2ALL, 0, 0);
CACHE_setL2Mode(CACHE_128KCACHE);
CACHE_enableCaching(CACHE_EMIFA_CE00);
CACHE_enableCaching(CACHE_EMIFA_CE01);
DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
/* for(i = 0; i < 130; i ++)
{
}
InitEdma();
for(i = 0; i< 100; i++)
{};
edma_test = AllocEdma(1);*/
ICETEKDM642PCIBoardInit();
}
/*
* ======== tskVideoLoopback ========
* video loopback function.
*/
void tskVideoLoopback()
{
Int i , j ;
unsigned int m_nID;
Int status;
FVID_Handle disChan;
Int frames = 0;
FVID_Frame *disFrameBuf;
Int numLinesDis = EVMDM642_vDisParamsChan.imgVSizeFld1;
Int numLinesCap = EVMDM642_vCapParamsChan.fldYStop1 -
EVMDM642_vCapParamsChan.fldYStrt1+1;
Int numLines = (numLinesDis > numLinesCap) ? numLinesCap : numLinesDis;
FVID_Handle capChan;
Int numPixels = EVMDM642_vCapParamsChan.fldXStop1 -
EVMDM642_vCapParamsChan.fldXStrt1+1;
FVID_Frame *capFrameBuf;
Int capLinePitch = EVMDM642_vCapParamsChan.fldXStop1 -
EVMDM642_vCapParamsChan.fldXStrt1+1;
Int disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;
numLines *= 2; /* both fields */
/******************************************************/
/* allocate both capture and display frame buffers */
/* in external heap memory */
/******************************************************/
EVMDM642_vCapParamsChan.segId = EXTERNALHEAP;
EVMDM642_vDisParamsChan.segId = EXTERNALHEAP;
EVMDM642_vDisParamsSAA7121.hI2C = EVMDM642_I2C_hI2C;
EVMDM642_vCapParamsTVP5150A.hI2C = EVMDM642_I2C_hI2C;
/******************************************************/
/* initialization of capture driver */
/******************************************************/
capChan=FVID_create("/VP0CAPTURE/A/0",IOM_INPUT,&status,(Ptr)&EVMDM642_vCapParamsChan,NULL);
/******************************************************/
/* initialization of display driver */
/******************************************************/
disChan=FVID_create("/VP2DISPLAY/0",IOM_OUTPUT,&status,(Ptr)&EVMDM642_vDisParamsChan,NULL);
/******************************************************/
/* configure video encoder & decoder */
/******************************************************/
FVID_control(disChan,VPORT_CMD_EDC_BASE+EDC_CONFIG,(Ptr)&EVMDM642_vDisParamsSAA7121);
FVID_control(capChan,VPORT_CMD_EDC_BASE+EDC_CONFIG,(Ptr)&EVMDM642_vCapParamsTVP5150A);
/******************************************************/
/* 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 )
{
j=0;
// old_point_y = 29*old_point_y /30 ;
// old_point_x = 29*old_point_x /30 ;
m_nID = DAT_copy2d(DAT_1D2D,capFrameBuf->frame.iFrm.y1,in_data,720,576,720);
DAT_wait(m_nID);
/* for ( i = 168; i < 552; i +=4 )
{
m_nID=DAT_copy(&in_data[i*720+96],&temp_data[j],384);
DAT_wait(m_nID);
j+= 384;
}*/
j=0 ;
sdr = in_data ;
if( pingpong )
{
dst = ping_data ;
SetEdma(edma_test,
_EDMA_OPT_PRI_MEDIUM|
_EDMA_OPT_ESIZE_8|
_EDMA_OPT_2DS_YES|
_EDMA_OPT_SUM_INC|
_EDMA_OPT_2DD_NO|
_EDMA_OPT_DUM_INC|
_EDMA_OPT_LINK_YES|
_EDMA_OPT_FS_YES|
_EDMA_OPT_TCC(edma_test),
(uint32)(sdr),
(uint32)((0x4380<<16) |0x01 ),
(uint32)(dst),
(uint32)((0x03<<16) |0x02 ),
(uint32) ((0x00<<16) |0x00));
ClearEdma(edma_test);
StartEdma(edma_test);
WaitEdma(edma_test);
YY_contrast(ping_data , pong_data);
}
else
{
dst = pong_data ;
SetEdma(edma_test,
_EDMA_OPT_PRI_MEDIUM|
_EDMA_OPT_ESIZE_8|
_EDMA_OPT_2DS_YES|
_EDMA_OPT_SUM_INC|
_EDMA_OPT_2DD_NO|
_EDMA_OPT_DUM_INC|
_EDMA_OPT_LINK_YES|
_EDMA_OPT_FS_YES|
_EDMA_OPT_TCC(edma_test),
(uint32)(sdr),
(uint32)((0x4380<<16) |0x01 ),
(uint32)(dst),
(uint32)((0x03<<16) |0x02 ),
(uint32) ((0x00<<16) |0x00));
ClearEdma(edma_test);
StartEdma(edma_test);
WaitEdma(edma_test);
YY_contrast( pong_data , ping_data);
}
/* for ( i = 0; i < numLines; i ++ )
{
DAT_copy(&in_data[i*720],disFrameBuf->frame.iFrm.y1+i*disLinePitch,numPixels);
}*/
pingpong = (pingpong + 1) & 1;
for ( i = 64; i < numLines-64 ; i ++ )
{
DAT_copy(&in_data[(i-old_point_y*4)*720-old_point_x*4],disFrameBuf->frame.iFrm.y1+i*disLinePitch+64,numPixels-128);
}
//偏移显示
/* for ( i = 0; i < numLines; i ++ )
{
m_nID=DAT_copy(capFrameBuf->frame.iFrm.y1+i*capLinePitch,&in_data[i*720],numPixels);
DAT_wait(m_nID);
}/*
/* //滤波
for ( i = 0; i < numLines; i ++ )
{
m_nID=DAT_copy(capFrameBuf->frame.iFrm.y1+i*capLinePitch,nMemTemp,numPixels);
DAT_wait(m_nID);
if ( i>144 && i<432 ) ICETEKDM642PCISobel();
DAT_copy(nMemTemp,disFrameBuf->frame.iFrm.y1+i*disLinePitch,numPixels);
}*/
DAT_wait(DAT_XFRID_WAITALL);
FVID_exchange(capChan, &capFrameBuf);
FVID_exchange(disChan, &disFrameBuf);
frames ++;
}
/* {
DAT_copy2d(DAT_1D2D,capFrameBuf->frame.iFrm.y1,disFrameBuf->frame.iFrm.y1,720,576,720);
DAT_copy2d(DAT_1D2D,capFrameBuf->frame.iFrm.cb1,disFrameBuf->frame.iFrm.cb1,360,576,360);
DAT_copy2d(DAT_1D2D,capFrameBuf->frame.iFrm.cr1,disFrameBuf->frame.iFrm.cr1,360,576,360);
DAT_wait(DAT_XFRID_WAITALL);
FVID_exchange(capChan, &capFrameBuf);
FVID_exchange(disChan, &disFrameBuf);
frames ++;
}*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -