video_rgb.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:7k
源码类别:

DSP编程

开发平台:

C/C++

  1. /*
  2.  *  Copyright 2003 by Texas Instruments Incorporated.
  3.  *  All rights reserved. Property of Texas Instruments Incorporated.
  4.  *  Restricted rights to use, duplicate or disclose this code are
  5.  *  granted through contract.
  6.  *  
  7.  */
  8. /* "@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)" */
  9. #include <std.h>
  10. #include <tsk.h>  
  11. #include <sem.h>   
  12. #include <gio.h>
  13. #include <csl_dat.h>
  14. #include <csl_cache.h>
  15. #include <fvid.h>
  16. #include <edc.h>
  17. #include <vport.h>
  18. #include <vportcap.h>
  19. #include <vportdis.h>
  20. #include <saa7105.h>
  21. #include <saa7115.h>    
  22. #include <evmdm642.h>
  23. #include "colorbarRGB.h"
  24. #include "evmdm642_vcapparams.h"
  25. #include "evmdm642_vdisparams.h"   
  26. /* heap IDs defined in the BIOS configuration file */
  27. extern Int EXTERNALHEAP;
  28. #ifdef _LOOPBACK
  29. static const  short coeffs[5] = {0x2543, 0x3313, -0x0C8A, -0x1A04, 0x408D};
  30. #endif
  31. /*
  32.  * ======== main ========
  33.  */
  34. main()
  35. {
  36.     /******************************************************/
  37.     /* open CSL DAT module for fast copy                  */
  38.     /******************************************************/
  39.     CSL_init();                                             
  40.     CACHE_clean(CACHE_L2ALL, 0, 0);
  41.     CACHE_setL2Mode(CACHE_256KCACHE);       
  42.     CACHE_enableCaching(CACHE_EMIFA_CE00);
  43.     CACHE_enableCaching(CACHE_EMIFA_CE01);
  44.     DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
  45. }
  46. /*
  47.  * ======== tskVideoLoopback ========
  48.  * video loopback function.
  49.  */
  50. void tskVideoLoopback()
  51. {
  52.     Int status;
  53.     FVID_Handle disChan; 
  54.     Int frames = 0;
  55.     FVID_Frame *disFrameBuf;
  56.     Int numLinesDis = EVMDM642_vDisParamsChan.imgVSizeFld1;
  57.     Int numLinesCap = EVMDM642_vCapParamsChan.fldYStop1 -
  58.        EVMDM642_vCapParamsChan.fldYStrt1+1;
  59.     
  60.     Int numLines = (numLinesDis > numLinesCap) ? numLinesCap : numLinesDis;
  61. #ifdef _LOOPBACK
  62.     Int i;
  63.     FVID_Handle capChan; 
  64.     Int numPixels = EVMDM642_vCapParamsChan.fldXStop1 - 
  65.        EVMDM642_vCapParamsChan.fldXStrt1+1;
  66.     FVID_Frame *capFrameBuf;
  67.     Int capLinePitch = EVMDM642_vCapParamsChan.fldXStop1 - 
  68.        EVMDM642_vCapParamsChan.fldXStrt1+1;
  69.     Int disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;
  70. #ifdef _PIP
  71.     VPORTCAP_Params EVMDM642_vCapParamsChan2 = EVMDM642_vCapParamsChan;
  72.     FVID_Handle capChan2; 
  73.     FVID_Frame *capFrameBuf2;
  74.     Int yPitch = capLinePitch >> 1;
  75.     Int cPitch = ((capLinePitch >> 2) + 7) & (~ 7);
  76.     Int xOffset = disLinePitch - yPitch;
  77.     Int yOffset = numLinesDis - numLines;
  78. #endif
  79. #endif                
  80.  
  81.     numLines *= 2; /* both fields */
  82.     /******************************************************/
  83.     /* allocate both capture and display frame buffers    */
  84.     /* in external heap memory                            */
  85.     /******************************************************/
  86.         EVMDM642_vCapParamsChan.segId = EXTERNALHEAP;
  87.         EVMDM642_vDisParamsChan.segId = EXTERNALHEAP;
  88.         EVMDM642_vDisParamsSAA7105.hI2C = EVMDM642_I2C_hI2C;
  89.         EVMDM642_vCapParamsSAA7115.hI2C = EVMDM642_I2C_hI2C;
  90.     /******************************************************/
  91.     /* initialization of capture driver                   */
  92.     /******************************************************/
  93. #ifdef _LOOPBACK
  94.     capChan = FVID_create("/VP0CAPTURE/A/0", 
  95.             IOM_INPUT, &status, (Ptr)&EVMDM642_vCapParamsChan, NULL);
  96. #ifdef _PIP
  97.     EVMDM642_vCapParamsChan2.scale = VPORT_SCALING_ENABLE;
  98.         EVMDM642_vCapParamsChan2.fldOp = VPORT_FLDOP_FLD1;        
  99.         EVMDM642_vCapParamsChan2.thrld >>=1;
  100.     capChan2 = FVID_create("/VP1CAPTURE/A/1", 
  101.             IOM_INPUT, &status, (Ptr)&EVMDM642_vCapParamsChan2, NULL);
  102. #endif          
  103. #endif          
  104.     /******************************************************/
  105.     /* initialization of display driver                   */
  106.     /******************************************************/
  107.     disChan = FVID_create("/VP2DISPLAY", IOM_OUTPUT, 
  108.         &status, (Ptr)&EVMDM642_vDisParamsChan, NULL);
  109.     
  110.     /******************************************************/
  111.     /* configure video encoder & decoder                  */
  112.     /******************************************************/
  113.     FVID_control(disChan, VPORT_CMD_EDC_BASE + EDC_CONFIG, 
  114.         (Ptr)&EVMDM642_vDisParamsSAA7105);
  115. #ifdef _LOOPBACK
  116.     FVID_control(capChan, VPORT_CMD_EDC_BASE + EDC_CONFIG, 
  117.         (Ptr)&EVMDM642_vCapParamsSAA7115);
  118. #ifdef _PIP
  119.     EVMDM642_vCapParamsSAA7115.aFmt = SAA7115_AFMT_COMPOSITE;
  120.     FVID_control(capChan2, VPORT_CMD_EDC_BASE+EDC_CONFIG, 
  121.         (Ptr)&EVMDM642_vCapParamsSAA7115);
  122. #endif
  123. #endif
  124.     
  125.     EVMDM642_rset(0x10, 0x20); /* unlock DLL */
  126.     EVMDM642_rset(0x10, 0x00); /* set FPGA in 16-bit mode */
  127.     while(!(EVMDM642_rget(0x13) & 0x40)); /* wait until DLL is locked */
  128.     /******************************************************/
  129.     /* start capture & display operation                  */    
  130.     /******************************************************/
  131.     FVID_control(disChan, VPORT_CMD_START, NULL);
  132. #ifdef _LOOPBACK
  133.     FVID_control(capChan, VPORT_CMD_START, NULL);
  134. #ifdef _PIP
  135.     FVID_control(capChan2, VPORT_CMD_START, NULL);
  136. #endif    
  137. #endif    
  138.     
  139.     /********************************************************/
  140.     /* request a frame buffer from display & capture driver */
  141.     /********************************************************/
  142.     FVID_alloc(disChan, &disFrameBuf);
  143. #ifdef _LOOPBACK
  144.     FVID_alloc(capChan, &capFrameBuf);
  145. #ifdef _PIP
  146.     FVID_alloc(capChan2, &capFrameBuf2);
  147. #endif      
  148. #endif
  149.     frames ++;
  150.     while(1){/* loop forever */
  151. #ifdef _LOOPBACK
  152.         /* copy data from capture buffer to display buffer */
  153.         /***************************************************/
  154.         for(i = 0; i < numLines; i++) {
  155.             yc2rgb16(coeffs, capFrameBuf->frame.iFrm.y1 + i * (capLinePitch),
  156.                 capFrameBuf->frame.iFrm.cb1 + (capLinePitch >> 1) * i, 
  157.                 capFrameBuf->frame.iFrm.cr1 + (capLinePitch >> 1) * i, 
  158.                 disFrameBuf->frame.rpFrm.buf + (disLinePitch << 1) * i, 
  159.                 numPixels);
  160.         }
  161.         FVID_exchange(capChan, &capFrameBuf);
  162. #ifdef _PIP  
  163.         for(i = 0; i < (numLines >> 1); i++) {
  164.             yc2rgb16(coeffs, capFrameBuf2->frame.iFrm.y1 + i * yPitch,
  165.                 capFrameBuf2->frame.iFrm.cb1 + cPitch * i, 
  166.                 capFrameBuf2->frame.iFrm.cr1 + cPitch * i, 
  167.                 disFrameBuf->frame.rpFrm.buf + (disLinePitch << 1) 
  168.                 * (yOffset + i) + (xOffset * 2), (numPixels >> 1));
  169.         }
  170.         FVID_exchange(capChan2, &capFrameBuf2);
  171. #endif
  172. #else
  173.         FillFrmBufRGB(&disFrameBuf->frame.rpFrm, EVMDM642_vDisParamsChan.imgHSizeFld1,
  174.             EVMDM642_vDisParamsChan.imgVSizeFld1, frames %(EVMDM642_vDisParamsChan.imgHSizeFld1 >> 3));
  175. #endif
  176.         CACHE_clean(CACHE_L2ALL, 0, 0);
  177.         FVID_exchange(disChan, &disFrameBuf); 
  178.         
  179.         frames ++;              
  180.    }
  181. }