📄 ime9650_main.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.
*
*/
/* "@(#) 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 <csl_edma.h>
#include <csl_timer.h>
#include <fvid.h>
#include <edc.h>
#include <vport.h>
#include <vportcap.h>
#include <vportdis.h>
#include <saa7115.h>
#include "saa7121.h"
#include <evmdm642.h>
#include "vcapparams.h"
#include "vdisparams.h"
#include "IME9650_utils.h"
#include "IME9650_init.h"
#define ONE_SECOND 0x23C3460
#include <stdio.h>
/* heap IDs defined in the BIOS configuration file */
extern Int EXTERNALHEAP;
IME9650_Params params;
// 1. CIF(352x288)
// 2. VGA(640x480)
#define CAPTUREFRAMEFORMAT 2
int frames = 0;
unsigned int bDSPWB=0;
main()
{
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);
}
/*
* ======== tskVideoLoopback ========
* video loopback function.
*/
void tskVideoLoopback()
{
Int status;
int nImageHeight,nImageWidth,x0,y0;
int flag;
FILE* fin1;
FILE* fin2;
// display channel
FVID_Handle disChan;
FVID_Frame *disFrameBuf;
// capture channel
FVID_Handle capChan;
FVID_Frame *capFrameBuf;
Uint8 *ptrBayerSrc;
#if ( CAPTUREFRAMEFORMAT==1 )
nImageWidth=352;
nImageHeight=288;
x0=184; y0=144;
#else if ( CAPTUREFRAMEFORMAT==2 )
nImageWidth=640;
nImageHeight=480;
x0=40; y0=48;
#endif
IME9650_configCapParams(&EVMDM642_vCapParamsChan, ¶ms, CAPTUREFRAMEFORMAT,nImageWidth, nImageHeight, 21, 3, 1561);
/******************************************************
Set the Threshold
******************************************************/
EVMDM642_vCapParamsChan.thrld = EVMDM642_vCapParamsChan.thrld >> 3;
/******************************************************/
/* allocate both capture and display frame buffers */
/* in external heap memory */
/******************************************************/
EVMDM642_vCapParamsChan.segId = EXTERNALHEAP;
EVMDM642_vDisParamsChan.segId = EXTERNALHEAP;
// Set to handle of I2C
EVMDM642_vDisParamsSAA7121.hI2C = EVMDM642_I2C_hI2C;
/******************************************************/
/* initialization of capture driver 1 Channel A */
/* and capture driver 1 Channel A */
/* FVID object must match BIOS Driver Name */
/******************************************************/
capChan = FVID_create("/VP1CAPTURE/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 & IME9650 */
/******************************************************/
FVID_control(capChan, VPORT_CMD_EDC_BASE + EDC_CONFIG, (Ptr)¶ms);
FVID_control(disChan, VPORT_CMD_EDC_BASE + EDC_CONFIG, (void *)&EVMDM642_vDisParamsSAA7121);
/******************************************************/
/* 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);
flag = 0;
while ( 1 )
{
// 取得行输入图象数据640x480或352x288,数据排列: CbYCrYCbY...共640x2x480或352x2x288个字节
ptrBayerSrc = (Uint8 *)capFrameBuf->frame.rpFrm.buf;
// 将采集的图象数据转换成分别存放的YCbCr图象以供显示程序使用
BT656ToPAL(ptrBayerSrc,(Uint8 *)(disFrameBuf->frame.iFrm.y1),(Uint8 *)(disFrameBuf->frame.iFrm.cb1),(Uint8 *)(disFrameBuf->frame.iFrm.cr1),nImageWidth,nImageHeight,x0,y0);
// 如果设置bDSPWB为非0值,DSP运行自动白平衡算法,并更改摄像头的设置
if ( bDSPWB )
DSPWhiteBlance((Uint8 *)(disFrameBuf->frame.iFrm.y1),(Uint8 *)(disFrameBuf->frame.iFrm.cb1),(Uint8 *)(disFrameBuf->frame.iFrm.cr1),x0,y0);
//Sobel边缘检测函数的调用
Sobel((Uint8 *)(disFrameBuf->frame.iFrm.y1));
/* if(flag==50)
{
fin2=fopen("c:\\input.raw","wb");
fwrite(disFrameBuf->frame.iFrm.y1,720*576,1,fin2);
fclose(fin2);
} */
FVID_exchange(disChan, &disFrameBuf);
CACHE_clean(CACHE_L2ALL, 0, 0);
FVID_exchange(capChan, &capFrameBuf);
frames ++;
}
}
void prdFrameCount()
{
frames = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -