DM642 视频采集基本架构

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

落鹤生 发布于 2010-01-15 21:40 点击: 995次 
来自:hi.baidu.com
本文以实际代码的方式介绍TI德州仪器的DM642,DM643视频采集基本架构。
 

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

  1. /* Copyright 2004 by Texas Instruments Incorporated.  
  2. * All rights reserved. Property of Texas Instruments Incorporated.  
  3. * Restricted rights to use, duplicate or disclose this code are  
  4. * granted through contract.  
  5. */ 
  6.  
  7. #include <std.h>       //如果使用C语言,必须将此文件作为第一个头文件。  
  8. #include <tsk.h>   
  9. #include <sem.h>     
  10. #include <gio.h>  
  11. #include <csl_dat.h>  
  12. #include <csl_cache.h> //使用CSL库,要用到的一些头文件,可参考CSL  
  13. #include <fvid.h>      //视频驱动头文件  
  14. #include <edc.h>  
  15. #include <vport.h>   
  16. #include <vportcap.h>  
  17. #include <vportdis.h>  
  18. #include <saa7105.h>     
  19. #include <tvp51xx.h>      
  20. #include <dec643.h>    //芯片头文件。  
  21.  
  22. //#include <evmdm642.h>  
  23. #include <evmdm642_capParamsSDTVDefault.h>   //捕获设备配置文件  
  24. #include <evmdm642_disParamsVGADefault.h>   //如用VGA显示,需要的显示设备配置文件  
  25. #include "colorbar.h"                       //如显示彩色滚动条,需要,否则不需要。  
  26.  
  27. VPORT_PortParams EVMDM642_vCapParamsPort   
  28. = EVMDM642_CAP_PARAMS_PORT_EMBEDDED_DEFAULT;   //定义捕获端口。  
  29.  
  30. /* caputure configuration parameters */ 
  31. /* embedded sync mode is recommended as it offers better re-sync capability */ 
  32. /* The available capture modes are */ 
  33. /* NTSC720                         */ 
  34. /* PAL720                          */ 
  35.  
  36. static VPORTCAP_Params EVMDM642_vCapParamsChan   
  37. = EVMDM642_CAP_PARAMS_CHAN_EMBEDDED_DEFAULT(PAL720);      
  38.  
  39. //捕获(即采集端口)端口,为PAL制式。可依据需要改为NTSC制式  
  40. static TVP51XX_ConfParams EVMDM642_vCapParamsTVP51XX   
  41. = EVMDM642_CAP_PARAMS_TVP51XX_EMBEDDED_DEFAULT(PAL601, COMPOSITE, 0);  
  42.  
  43. /* coefficients for color space conversion */ 
  44. static const short coeffs[5] = {0x2543, 0x3313, -0x0C8A, -0x1A04, 0x408D};   
  45.  
  46. //VGA显示,需将YCbCr656转换为RGB565,这是必要的转换矩阵  
  47. /* display configuration parameters */ 
  48. VPORT_PortParams EVMDM642_vDisParamsPort   //显示端口定义  
  49. = EVMDM642_DIS_PARAMS_PORT_DEFAULT;  
  50.  
  51. /* The available display modes are: **  
  52. ** VGA(640x480@60fps)               **  
  53. ** SVGA(800x600@60fps)              **  
  54. ** XGA(1024x768@60fps)              */                  
  55.  
  56. static VPORTDIS_Params EVMDM642_vDisParamsChan     
  57. = EVMDM642_DIS_PARAMS_CHAN_RGB565_DEFAULT(VGA);  
  58.  
  59. //这里的显示端口定义为VGA,即支持的是VGA输出。  
  60. static SAA7105_ConfParams EVMDM642_vDisParamsSAA7105   
  61. = EVMDM642_DIS_PARAMS_SAA7105_RGB565_DEFAULT(VGA);  
  62.  
  63. /* heap IDs defined in the BIOS configuration file */ 
  64. extern Int EXTERNALHEAP; //在DSP/BIOS中已定义  
  65. /*  
  66. * ======== main ========  
  67. */ 
  68.  
  69. main()  
  70. {  
  71.     /******************************************************/ 
  72.     /* open CSL DAT module for fast copy                  */ 
  73.     /******************************************************/ 
  74.     CSL_init();                               //调用任何CSL库中的函数,必须先在此调用该函数。  
  75.     CACHE_clean(CACHE_L2ALL, 0, 0);           //清洗Cache                 
  76.     CACHE_setL2Mode(CACHE_256KCACHE);         //设置Cache模式  
  77.     CACHE_enableCaching(CACHE_EMIFA_CE00);    //使能EMIFA CE0空间  
  78.     CACHE_enableCaching(CACHE_EMIFA_CE01);    //使能EMIFA CE1空间  
  79.     DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);  
  80. }  
  81.  
  82. /*  
  83. * ======== tskVideoLoopback ========  
  84. * video loopback function.  
  85. */ 
  86.  
  87. void tskVideoLoopback()  
  88. {         
  89.     Int i;  
  90.     Int status;      
  91.     Int frames = 0;  
  92.     FVID_Handle disChan;   
  93.     FVID_Frame *disFrameBuf;  
  94.     FVID_Handle capChan;  
  95.     FVID_Frame *capFrameBuf;  
  96.  
  97.     /*设置显示的行数 VGA制式为480,PAL制为576*/ 
  98.     Int numLinesDis = EVMDM642_vDisParamsChan.imgVSizeFld1;  
  99.  
  100.     /*设置采集的行数 PAL制为576*/ 
  101.     Int numLinesCap = (EVMDM642_vCapParamsChan.fldYStop1 -  
  102.                 EVMDM642_vCapParamsChan.fldYStrt1+1)*2;  
  103.  
  104.     /*判断是显示区域大,还是采集区域大,取其小者480*/     
  105.     Int numLines = (numLinesDis > numLinesCap) ? numLinesCap : numLinesDis;  
  106.  
  107.     /*设置采集像素数 PAL制为720*/ 
  108.     Int numPixels = (EVMDM642_vCapParamsChan.fldXStop1 -   
  109.               EVMDM642_vCapParamsChan.fldXStrt1+1);  
  110.  
  111.     /*设置采集行的增量 PAL制为720*/ 
  112.     Int capLinePitch = (EVMDM642_vCapParamsChan.fldXStop1 -   
  113.                        EVMDM642_vCapParamsChan.fldXStrt1+1);  
  114.  
  115.     /*设置显示行的增量 VGA制为640*/ 
  116.     Int disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;  
  117.  
  118.    // numLines *= 2; /* both fields */    //如果输出为PAL制,前面numLinesCap不要*2,这里再*2  
  119.     /******************************************************/ 
  120.     /* allocate both capture and display frame buffers    */ 
  121.     /* in external heap memory                            */ 
  122.     /******************************************************/ 
  123.     EVMDM642_vDisParamsChan.segId = EXTERNALHEAP;  
  124.     EVMDM642_vDisParamsSAA7105.hI2C = DEC643_I2C_hI2C;  
  125.     EVMDM642_vCapParamsChan.segId = EXTERNALHEAP;  
  126.     EVMDM642_vCapParamsTVP51XX.hI2C = DEC643_I2C_hI2C;  
  127.  
  128.     /******************************************************/ 
  129.     /* initialization of capture driver                   */ 
  130.     /******************************************************/ 
  131.     capChan = FVID_create("/VP1CAPTURE/A/1",   
  132.             IOM_INPUT, &status, (Ptr)&EVMDM642_vCapParamsChan, NULL);      
  133.  
  134.     /******************************************************/ 
  135.     /* initialization of display driver                   */ 
  136.     /******************************************************/ 
  137.     disChan = FVID_create("/VP2DISPLAY", IOM_OUTPUT,   
  138.         &status, (Ptr)&EVMDM642_vDisParamsChan, NULL);  
  139.  
  140.     /******************************************************/ 
  141.     /* configure video encoder & decoder                  */ 
  142.     /******************************************************/ 
  143.     FVID_control(disChan, VPORT_CMD_EDC_BASE + EDC_CONFIG,   
  144.         (Ptr)&EVMDM642_vDisParamsSAA7105);  
  145.     FVID_control(capChan, VPORT_CMD_EDC_BASE + EDC_CONFIG,   
  146.         (Ptr)&EVMDM642_vCapParamsTVP51XX);  
  147.     CACHE_clean(CACHE_L2ALL, 0, 0);        //CSL函数,冲洗Cache  
  148.  
  149.     /******************************************************/ 
  150.     /* start capture & display operation                  */      
  151.     /******************************************************/ 
  152.     FVID_control(disChan, VPORT_CMD_START, NULL);  
  153.     FVID_control(capChan, VPORT_CMD_START, NULL);  
  154.  
  155.     /********************************************************/ 
  156.     /* request a frame buffer from display & capture driver */ 
  157.     /********************************************************/ 
  158.     FVID_alloc(disChan, &disFrameBuf);  
  159.     FVID_alloc(capChan, &capFrameBuf);  
  160.     frames ++;  
  161.     while(1)  
  162.     {/* loop forever */ 
  163.         /***************************************************/ 
  164.         /* copy data from capture buffer to display buffer */ 
  165.         /***************************************************/ 
  166.         for(i = 0; i < numLines; i++)   
  167.         {  
  168.             yc2rgb16(coeffs, capFrameBuf->frame.iFrm.y1 + i * (capLinePitch),  
  169.                 capFrameBuf->frame.iFrm.cb1 + (capLinePitch >> 1) * i,   
  170.                 capFrameBuf->frame.iFrm.cr1 + (capLinePitch >> 1) * i,   
  171.                 disFrameBuf->frame.rpFrm.buf + (disLinePitch << 1) * i,   
  172.                 numPixels);  
  173.         }//调用函数yc2rgb16,将YCbCr656转化为RGB565,这个函数为TI的汇编代码编写。  
  174.           
  175.         FVID_exchange(capChan, &capFrameBuf);    //采集一帧视频  
  176.       /*FillFrmBufRGB(&disFrameBuf->frame.rpFrm,   
  177.              EVMDM642_vDisParamsChan.imgHSizeFld1,  
  178.              EVMDM642_vDisParamsChan.imgVSizeFld1,   
  179.              frames %(EVMDM642_vDisParamsChan.imgHSizeFld1 >> 3));*/ 
  180.         //上面这段代码,是VGA显示时,显示七色滚动条的。如果想显示采集的图像,不需这个。  
  181.         CACHE_clean(CACHE_L2ALL, 0, 0);  
  182.         FVID_exchange(disChan, &disFrameBuf);    //显示一帧视频。  
  183.  
  184.         frames ++;                
  185.    }  

 

 
 
 
-
 
-
-

 

posted on 2013-07-27 12:34  My小菜一碟  阅读(555)  评论(0编辑  收藏  举报

导航