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

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.21 06-26-03 (ddk-b10)" */
  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 "colorbar.h"
  24. #include "evmdm642_vcapparams.h"
  25. #include "evmdm642_vdisparams.h"   
  26. #ifdef _NTSC_SRC
  27. #include "../settings/evmdm642_vdisparamsNTSC.c"  
  28. #endif
  29. #ifdef _PAL_SRC
  30. #include "../settings/evmdm642_vdisparamsPAL.c"
  31. #endif
  32. /* heap IDs defined in the BIOS configuration file */
  33. extern Int EXTERNALHEAP;
  34. /*
  35.  * ======== main ========
  36.  */
  37. main()
  38. {
  39.     /******************************************************/
  40.     /* open CSL DAT module for fast copy                  */
  41.     /******************************************************/
  42.     CSL_init();                                             
  43.     CACHE_clean(CACHE_L2ALL, 0, 0);
  44.     CACHE_setL2Mode(CACHE_256KCACHE);       
  45.     CACHE_enableCaching(CACHE_EMIFA_CE00);
  46.     CACHE_enableCaching(CACHE_EMIFA_CE01);
  47.     DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);          
  48. }
  49. /*
  50.  * ======== tskVideoLoopback ========
  51.  * video loopback function.
  52.  */
  53. void tskVideoLoopback()
  54. {
  55.     Int status;
  56.     FVID_Handle disChan; 
  57.     Int frames = 0;
  58.     FVID_Frame *disFrameBuf;
  59.     Int numLinesDis = EVMDM642_vDisParamsChan.imgVSizeFld1;
  60.     Int numLinesCap = EVMDM642_vCapParamsChan.fldYStop1 -
  61.        EVMDM642_vCapParamsChan.fldYStrt1+1;
  62.     
  63.     Int numLines;                 
  64.     Int xOffset;
  65.     Int yOffset;
  66.     FVID_Handle capChan; 
  67.     Int numPixels = EVMDM642_vCapParamsChan.fldXStop1 - 
  68.        EVMDM642_vCapParamsChan.fldXStrt1+1;
  69.     FVID_Frame *capFrameBuf;
  70.     Int capLinePitch = EVMDM642_vCapParamsChan.fldXStop1 - 
  71.        EVMDM642_vCapParamsChan.fldXStrt1+1;
  72.     Int disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;
  73.     /* since the default setting is for NTSC, we need to adjust */
  74.     /* that if capture input is in PAL format                   */
  75.     #ifdef _PAL
  76.     EVMDM642_vCapParamsSAA7115.inMode = SAA7115_MODE_PAL720;
  77.     #endif
  78.     
  79.     
  80.     if(EVMDM642_vCapParamsChan.fldOp == VPORT_FLDOP_FRAME) {    
  81.         numLinesCap *= 2; /* account for both fields */
  82.     }                         
  83.     if(EVMDM642_vDisParamsChan.fldOp == VPORT_FLDOP_FRAME) {    
  84.         numLinesDis *= 2; /* account for both fields */
  85.     }                         
  86.     numLines = (numLinesCap < numLinesDis) ? numLinesCap : numLinesDis;
  87.     
  88.     xOffset = (disLinePitch - capLinePitch) >> 1;
  89.     yOffset = (numLinesDis - numLinesCap ) >> 1;
  90.     yOffset &= ~1; /* make sure it is even */
  91.     if( xOffset < 0) {
  92.         xOffset = 0;
  93.     }
  94.     if( yOffset < 0) {
  95.         yOffset = 0;
  96.     }
  97.     /******************************************************/
  98.     /* allocate both capture and display frame buffers    */
  99.     /* in external heap memory                            */
  100.     /******************************************************/
  101.     EVMDM642_vCapParamsChan.segId = EXTERNALHEAP;
  102.     EVMDM642_vDisParamsChan.segId = EXTERNALHEAP;
  103.     EVMDM642_vDisParamsSAA7105.hI2C = EVMDM642_I2C_hI2C;
  104.     EVMDM642_vCapParamsSAA7115.hI2C = EVMDM642_I2C_hI2C;
  105.     /******************************************************/
  106.     /* initialization of capture driver                   */
  107.     /******************************************************/
  108.     capChan = FVID_create("/VP0CAPTURE/A/0", 
  109.             IOM_INPUT, &status, (Ptr)&EVMDM642_vCapParamsChan, NULL);
  110.     /******************************************************/
  111.     /* initialization of display driver                   */
  112.     /******************************************************/
  113.     disChan = FVID_create("/VP2DISPLAY", IOM_OUTPUT, 
  114.         &status, (Ptr)&EVMDM642_vDisParamsChan, NULL);
  115.     
  116.     /******************************************************/
  117.     /* configure video encoder & decoder                  */
  118.     /******************************************************/
  119.     FVID_control(disChan, VPORT_CMD_EDC_BASE + EDC_CONFIG, 
  120.         (Ptr)&EVMDM642_vDisParamsSAA7105);
  121.     FVID_control(capChan, VPORT_CMD_EDC_BASE + EDC_CONFIG, 
  122.         (Ptr)&EVMDM642_vCapParamsSAA7115);
  123.     /******************************************************/
  124.     /* start capture & display operation                  */    
  125.     /******************************************************/
  126.     FVID_control(disChan, VPORT_CMD_START, NULL);
  127.     FVID_control(capChan, VPORT_CMD_START, NULL);
  128.     
  129.     /********************************************************/
  130.     /* request a frame buffer from display & capture driver */
  131.     /********************************************************/
  132.     FVID_alloc(disChan, &disFrameBuf);
  133.     FVID_alloc(capChan, &capFrameBuf);
  134.     frames ++;
  135.     while(1){/* loop forever */
  136.         Int i;
  137.         /* copy data from capture buffer to display buffer */
  138.         /***************************************************/
  139.         for(i = 0; i < numLines; i ++) {
  140.             DAT_copy(capFrameBuf->frame.iFrm.y1 + i * capLinePitch, 
  141.                      disFrameBuf->frame.iFrm.y1 + i * disLinePitch 
  142.                      + xOffset + yOffset * disLinePitch,
  143.                      numPixels);
  144.             DAT_copy(capFrameBuf->frame.iFrm.cb1 + i * (capLinePitch >> 1), 
  145.                      disFrameBuf->frame.iFrm.cb1 + 
  146.                      (i + yOffset) * (disLinePitch >> 1) + (xOffset >> 1),
  147.                      numPixels>>1);
  148.             DAT_copy(capFrameBuf->frame.iFrm.cr1 + i * (capLinePitch >> 1), 
  149.                      disFrameBuf->frame.iFrm.cr1 + 
  150.                      (i + yOffset) * (disLinePitch >> 1) + (xOffset >> 1),
  151.                      numPixels>>1);
  152.         }
  153.         FVID_exchange(capChan, &capFrameBuf);
  154.         FVID_exchange(disChan, &disFrameBuf);
  155.         
  156.         frames ++;              
  157.    }
  158. }