分享

video

 春华_秋实 2012-02-21

本人使用的dm6437的开发板下有一个程序video_loopback。今天要做一个详细的分析。来看看其中的门道。

我的目的:

1.打算使用video_loopback程序修改它成为我所用的程序。(加上我的算法)

2.将之改造测试我的算法的一个程序。

如何来做:

我先来分析程序的结构一步一步的找到一些蛛丝马迹。呵呵。自顶向下!!!现在用到了。

1.打开video_loopback工程,在source目录里面有三个文件:main.c,tvp5164.c,vodeo_loopback_test.c

省去一些步骤,直接到video_loopback_test.c,看下面的代码:

        /* Setup Front-End */
        tvp5146_init( ntsc_pal_mode, output_mode ); //初始化5146芯片
        vpfe_init( ntsc_pal_mode ); //初始化前端

        /* Setup Back-End */
        vpbe_init( LOOPBACK, ntsc_pal_mode, output_mode );

         //程序看起来很简单
        /* Wait for the USER to press something useful */

       //在这里可以加上自己的算法程序来处理图像。在前段处理完成显示之前来处理!(这里需要我测试的,现在只是理论。)
        while ( 1 )
        {
            EVMDM6437_I2C_GPIO_waitForIntr( -1 );   //等待外部中断来处理
    /*
            if ( EVMDM6437_DIP_get( JP1_JUMPER ) != ntsc_pal_mode )
                break;
            if ( EVMDM6437_DIP_get( SW7_SWITCH ) != output_mode )
                break;*/   //zq change
        }

问题:如何抓取一张图片?(现在还不知道,但是方向有了,就是研究vpfe_init这个函数

看看下面的代码:

static void vpfe_init( Uint32 ntsc_pal_mode )
{
    Uint32 video_buffer = DDR_BASE + ( DDR_SIZE / 2 );//在这里我们看到了video_buffer这就是图像数据缓冲区这里除以2的原因据我分析是后一半的内存开始
    Uint32 width;
    Uint32 height;

    if ( ntsc_pal_mode == NTSC )
    {
        width   = 720;
        height = 480;
    }
    else
    {
        width   = 720;
        //height = 480;
        height = 576; //zq change
    }


    VPFE_CCDC_SYN_MODE = 0x00032F84;   // interlaced, with VD pority as negative
    VPFE_CCDC_HD_VD_WID = 0;
    VPFE_CCDC_PIX_LINES = 0x02CF020D;

    /*
     * sph = 1, nph = 1440, according to page 32-33 of the CCDC spec
     * for BT.656 mode, this setting captures only the 720x480 of the
     * active NTSV video window
     */
    VPFE_CCDC_HORZ_INFO = width << 1;   // Horizontal lines
    VPFE_CCDC_HSIZE_OFF = width << 1;   // Horizontal line offset
    VPFE_CCDC_VERT_START = 0;           // Vertical start line
    VPFE_CCDC_VERT_LINES = height >> 1; // Vertical lines
    VPFE_CCDC_CULLING   = 0xFFFF00FF;   // Disable cullng

    /*
     * Interleave the two fields
     */
    VPFE_CCDC_SDOFST    = 0x00000249;
    VPFE_CCDC_SDR_ADDR = video_buffer;
    VPFE_CCDC_CLAMP     = 0;
    VPFE_CCDC_DCSUB     = 0;
    VPFE_CCDC_COLPTN    = 0xEE44EE44;
    VPFE_CCDC_BLKCMP    = 0;
    VPFE_CCDC_FPC_ADDR = 0x86800000;
    VPFE_CCDC_FPC       = 0;
    VPFE_CCDC_VDINT     = 0;
    VPFE_CCDC_ALAW      = 0;
    VPFE_CCDC_REC656IF = 0x00000003;

    /*
     * Input format is Cb:Y:Cr:Y, w/ Y in odd-pixel position
     */
    VPFE_CCDC_CCDCFG    = 0x00000800;
    VPFE_CCDC_FMTCFG    = 0;
    VPFE_CCDC_FMT_HORZ = 0x000002D0;
    VPFE_CCDC_FMT_VERT = 0x0000020E;
    VPFE_CCDC_FMT_ADDR0 = 0;
    VPFE_CCDC_FMT_ADDR1 = 0;
    VPFE_CCDC_FMT_ADDR2 = 0;
    VPFE_CCDC_FMT_ADDR3 = 0;
    VPFE_CCDC_FMT_ADDR4 = 0;
    VPFE_CCDC_FMT_ADDR5 = 0;
    VPFE_CCDC_FMT_ADDR6 = 0;
    VPFE_CCDC_FMT_ADDR7 = 0;
    VPFE_CCDC_PRGEVEN_0 = 0;
    VPFE_CCDC_PRGEVEN_1 = 0;
    VPFE_CCDC_PRGODD_0 = 0;
    VPFE_CCDC_PRGODD_1 = 0;
    VPFE_CCDC_VP_OUT    = 0x041A2D00;
    VPFE_CCDC_PCR       = 0x00000001;   // Enable CCDC
}

看看上面这些定义就有点晕!!!

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多