分享

DM642,DM643视频采集基本架构--程序注释

 chuanshaoke 2010-07-07

/*
* 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>       //如果使用C语言,必须将此文件作为第一个头文件。
#include <tsk.h>
#include <sem.h>  
#include <gio.h>

#include <csl_dat.h>
#include <csl_cache.h> //使用CSL库,要用到的一些头文件,可参考CSL


#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 <evmdm642.h>

#include <evmdm642_capParamsSDTVDefault.h>   //捕获设备配置文件
#include <evmdm642_disParamsVGADefault.h>   //如用VGA显示,需要的显示设备配置文件

#include "colorbar.h"                       //如显示彩色滚动条,需要,否则不需要。

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);   
//捕获(即采集端口)端口, 为PAL制式。可依据需要改为NTSC制式

static TVP51XX_ConfParams EVMDM642_vCapParamsTVP51XX
= EVMDM642_CAP_PARAMS_TVP51XX_EMBEDDED_DEFAULT(PAL601, COMPOSITE, 0);

/* coefficients for color space conversion */
static const short coeffs[5] = {0x2543, 0x3313, -0x0C8A, -0x1A04, 0x408D};
//VGA显示,需将 YCbCr656转换为RGB565,这是必要的转换矩阵


/* display configuration parameters */
VPORT_PortParams EVMDM642_vDisParamsPort   //显示端口定义
= EVMDM642_DIS_PARAMS_PORT_DEFAULT;

/* The available display modes are: **
** VGA(640x480@60fps)               **
** SVGA(800x600@60fps)              **
** XGA(1024x768@60fps)              */                

static VPORTDIS_Params EVMDM642_vDisParamsChan  
= EVMDM642_DIS_PARAMS_CHAN_RGB565_DEFAULT(VGA);

//这里的显示端口定义为VGA,即支持的是VGA输出。

static SAA7105_ConfParams EVMDM642_vDisParamsSAA7105
= EVMDM642_DIS_PARAMS_SAA7105_RGB565_DEFAULT(VGA);

/* heap IDs defined in the BIOS configuration file */
extern Int EXTERNALHEAP; //在DSP/BIOS中已定义

/*
* ======== main ========
*/
main()
{
    /******************************************************/
    /* open CSL DAT module for fast copy                  */
    /******************************************************/
    CSL_init();                               //调用任何CSL库中的函数,必须先在此调用该函数。

    CACHE_clean(CACHE_L2ALL, 0, 0);           //清洗Cache              
    CACHE_setL2Mode(CACHE_256KCACHE);         //设置Cache模式
    CACHE_enableCaching(CACHE_EMIFA_CE00);    //使能EMIFA CE0空间
    CACHE_enableCaching(CACHE_EMIFA_CE01);    //使能EMIFA CE1空间
    DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
}

/*
* ======== tskVideoLoopback ========
* video loopback function.
*/
void tskVideoLoopback()
{      
    Int i;
    Int status;   
    Int frames = 0;

    FVID_Handle disChan;
    FVID_Frame *disFrameBuf;

    FVID_Handle capChan;
    FVID_Frame *capFrameBuf;

    /*设置显示的行数 VGA制式为480,PAL制为576*/
    Int numLinesDis = EVMDM642_vDisParamsChan.imgVSizeFld1;

    /*设置采集的行数 PAL制为576*/
    Int numLinesCap = (EVMDM642_vCapParamsChan.fldYStop1 -
                EVMDM642_vCapParamsChan.fldYStrt1+1)*2;

    /*判断是显示区域大,还是采集区域大,取其小者480*/  
    Int numLines = (numLinesDis > numLinesCap) ? numLinesCap : numLinesDis;

    /*设置采集像素数 PAL制为720*/
    Int numPixels = (EVMDM642_vCapParamsChan.fldXStop1 -
              EVMDM642_vCapParamsChan.fldXStrt1+1);

    /*设置采集行的增量 PAL制为720*/
    Int capLinePitch = (EVMDM642_vCapParamsChan.fldXStop1 -
                       EVMDM642_vCapParamsChan.fldXStrt1+1);
   
    /*设置显示行的增量 VGA制为640*/
    Int disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;
     
   // numLines *= 2; /* both fields */    //如果输出为PAL制,前面numLinesCap不要*2,这里再*2


    /******************************************************/
    /* 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);        //CSL函数,冲洗Cache

    /******************************************************/
    /* 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)
    {/* loop forever */
          
        /***************************************************/
        /* 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);
        }//调用函数yc2rgb16,将YCbCr656转化为RGB565,这个函数为TI的汇编代码编写。
       
        FVID_exchange(capChan, &capFrameBuf);    //采集一帧视频

      /*FillFrmBufRGB(&disFrameBuf->frame.rpFrm,
             EVMDM642_vDisParamsChan.imgHSizeFld1,
             EVMDM642_vDisParamsChan.imgVSizeFld1,
             frames %(EVMDM642_vDisParamsChan.imgHSizeFld1 >> 3));*/
        //上面这段代码,是VGA显示时,显示七色滚动条的。如果想显示采集的图像,不需这个。

        CACHE_clean(CACHE_L2ALL, 0, 0);
                  
        FVID_exchange(disChan, &disFrameBuf);    //显示一帧视频。
       
        frames ++;             

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多