本人使用的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 }
看看上面这些定义就有点晕!!!
|