zoukankan      html  css  js  c++  java
  • 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.    }  
     
     
     
    -
     
    -
    -

  • 相关阅读:
    类中以双下划线開始的方法
    Dynamics CRM2016 新功能之从CRM APP中导出数据至EXCEL
    敏捷项目管理实践
    Hibernate环境搭建
    ubuntu12.04更新软件源时出现校验和不符
    修炼你自己
    http自己定义超时检測方法、主动抛出异常
    sql server 2008安装图解
    Ural 1353 Milliard Vasya&#39;s Function(DP)
    待字闺中之构造最大数分析
  • 原文地址:https://www.cnblogs.com/itxiaocaiyidie/p/3219286.html
Copyright © 2011-2022 走看看