setvideo.c
上传用户:caisangzi8
上传日期:2013-10-25
资源大小:15756k
文件大小:6k
源码类别:

DVD

开发平台:

C/C++

  1. //
  2. // FILE
  3. // setvideo.c
  4. //
  5. #include "user_init.h"
  6. #include "config.h"
  7. #include "regmap.h"
  8. #include "global.h"
  9. #include "aspect.h"
  10. #include "vpp.h"
  11. #ifndef DVDRELEASE
  12. #define MONE_SETUP
  13. #endif
  14. /*
  15. * Notify     : If you want to revise this function,you must note
  16. *              both sel_disp_sp_ch and do_PCI_HL function.
  17. *              Additionally, the function is complexly.
  18. *
  19. * Test disc  : MIB,Panasonic,NF002
  20. * Compare IC : ESS,C-Cub
  21. *
  22. * MIB  contenttype   16:9    LB    PS
  23. *      Wide Screen     F      W     W
  24. *      Full Screen     F      F     F
  25. *
  26. * Pan. contenttype   16:9    LB    PS
  27. *      Title menu      F      W     W
  28. *      Menu            F      W     W
  29. *      1/1             F      W     F
  30. *
  31. * NF2  contenttype   16:9    LB    PS
  32. *      ALL             F      L     W
  33. *
  34. */
  35. void
  36. set_video_default_offset(void)
  37. {
  38.     vpp_zoom_x = 0;
  39.     vpp_zoom_y = 0;
  40.     vpp_zoom_offset_mode = OFFSET_CENTER;
  41. }
  42. void
  43. set_video_aspect(void)
  44. {
  45.     // 00_11 4:3
  46.     // 11_00 16:9, both letter-box and pan-scan
  47.     // 11_01 16:9, both pan-scan
  48.     // 11_10 16:9, both letter-box
  49.     //
  50. #define MODE_NORMAL             0x03            // 0011
  51. #define MODE_WIDE_BOTH          0x0c            // 1100
  52. #define MODE_WIDE_PS            0x0d            // 1101
  53. #define MODE_WIDE_LB            0x0e            // 1110
  54. #define MODE_IS_WIDE(m)         ((m)&0x0c)
  55.     int _src_mode;
  56.     // 0x0c 16:9 TV (direct for anamorphic output
  57.     // 0x0d 4:3, 16:9 will be displayed in pan-scan
  58.     // 0x0e 4:3, 16:9 will be displayed in letterbox
  59.     //
  60. #define USER_TVASPECT_WIDE      0x0c
  61. #define USER_TVASPECT_NORMAL_PS 0x0d
  62. #define USER_TVASPECT_NORMAL_LB 0x0e
  63. #define USER_TVASPECT_AUTOWSS   0x0f
  64.     int user    = (UserSet.P_V_CFG)>>8;
  65.     int _output_aspect;
  66. #define ninf_get_dvd_VMGM_V_ATR()   (pDSV->dV_ATR)
  67.     if (show_logo || (cd_type_loaded!=CDDVD))
  68.         _src_mode = MODE_NORMAL;                // always 4:3
  69.     else
  70.         _src_mode = (ninf_get_dvd_VMGM_V_ATR()>>8)&0x0f;
  71.     #ifdef MONE_SETUP
  72.     printf("set_video_aspect: cfg:%x mode:%x A:%x Z:%xn",UserSet.P_V_CFG>>8,_src_mode,mode_aspect,vpp_zoom);
  73.     #endif
  74.     //
  75.     // OUTPUT_ASPECT_NORMAL         4:3 source on 4:3 TV, (WSS=4:3)
  76.     // OUTPUT_ASPECT_COMPRESSED     4:3 source on 16:9 TV, (WSS=16:9)
  77.     // OUTPUT_ASPECT_ANAMORPHIC     16:9 source on 16:9 TV, (WSS=16:9)
  78.     // OUTPUT_ASPECT_LETTERBOX      16:9 source on 4:3 TV, (WSS=4:3LB)
  79.     // OUTPUT_ASPECT_PANSCAN        16:9 source on 4:3 TV, (WSS=4:3PS)
  80.     //
  81.     //              setup=4:3LB setup=4:3PS setup=16:9  setup=autowss
  82.     //  4:3 source  NORMAL NORMAL     COMPRESSED  NORMAL
  83.     // 16:9 source  LB          PS     ANAMORPHIC  ANAMORPHIC
  84.     //
  85.     if (!MODE_IS_WIDE(_src_mode)) {
  86. #ifdef  ENABLE_COMPRESSED_ASPECT
  87.         // 4:3 source
  88.         if (user==USER_TVASPECT_WIDE)
  89.             _output_aspect = OUTPUT_ASPECT_COMPRESSED;  // compress to 4:3 on 16:9 TV
  90.         else
  91.             _output_aspect = OUTPUT_ASPECT_NORMAL;      // display 4:3
  92. #else
  93.         _output_aspect = OUTPUT_ASPECT_NORMAL;      // display 4:3
  94. #endif
  95.     } else {
  96.         // 16:9 source
  97.         if (user==USER_TVASPECT_WIDE || user==USER_TVASPECT_AUTOWSS) {
  98.             _output_aspect = OUTPUT_ASPECT_ANAMORPHIC;
  99.         } else {
  100.             // 16:9 source on 4:3 TV, depends on user selected letterbox/pan-scan favorite
  101.             if (_src_mode==MODE_WIDE_LB)
  102.                 user=USER_TVASPECT_NORMAL_LB;   // limited to display letterbox only
  103.             else if (_src_mode==MODE_WIDE_PS)
  104.                 user=USER_TVASPECT_NORMAL_PS;   // limited to display pan-scan only
  105.             if (user==USER_TVASPECT_NORMAL_PS)
  106.                 _output_aspect = OUTPUT_ASPECT_PANSCAN;
  107.             else
  108.                 _output_aspect = OUTPUT_ASPECT_LETTERBOX;
  109.         }
  110.     }
  111.     set_output_aspect(_output_aspect);
  112.     //
  113.     // mode_aspect=0: no display compression
  114.     // mode_aspect=1: vertical compression by 3:4
  115.     // mode_aspect=2: horizontal compression by 3:4
  116.     //
  117.     switch(_output_aspect)
  118.     {
  119.         case OUTPUT_ASPECT_ANAMORPHIC:
  120.             vpp_zoom=ZOOM_LB;   mode_aspect=0;  break;
  121.         case OUTPUT_ASPECT_LETTERBOX:
  122.             vpp_zoom=ZOOM_LB;   mode_aspect=1;  break;
  123.         case OUTPUT_ASPECT_PANSCAN:
  124.             vpp_zoom=ZOOM_PS;   mode_aspect=1;  break;
  125. #ifdef  ENABLE_COMPRESSED_ASPECT
  126.         case OUTPUT_ASPECT_COMPRESSED:
  127.             vpp_zoom=ZOOM_LB;   mode_aspect=2;  break;
  128. #endif
  129.         default:
  130.         case OUTPUT_ASPECT_NORMAL:
  131.             vpp_zoom=ZOOM_LB;   mode_aspect=0;  break;
  132.     }
  133.     set_video_default_offset();
  134.     #ifdef MONE_SETUP
  135.     printf("vtr:%x vpp:%x aspect:%x n",pDSV->dV_ATR,vpp_zoom,mode_aspect);
  136.     #endif
  137. }
  138. //
  139. // FUNCTION
  140. // startup_vpp
  141. //
  142. // DESCRIPTION
  143. // use vpp_zoom/vpp_zoom_x/vpp_zoom_y to setup Offset/Display
  144. //
  145. // SIDE EFFECT
  146. // change v
  147. //
  148. #ifdef ROTATE_RESTORE_ZOOM//dingzhy
  149. UINT8 zoom_flag;
  150. #endif
  151. void startup_vpp(void)
  152. {
  153.     //set_zoom_max(vpp_zoom,&vpp_zoom_x,&vpp_zoom_y);
  154.     setVPP_OffsetMode(vpp_zoom_offset_mode);
  155.     setVPP_OffsetX(vpp_zoom_x);
  156.     setVPP_OffsetY(vpp_zoom_y);
  157.     setVPP_Display(vpp_zoom);
  158.     setVPP_DoIt();
  159.     #ifdef ROTATE_RESTORE_ZOOM//dingzhy
  160.     zoom_flag = vpp_zoom;
  161.     #endif
  162.     #ifdef MONE_SETUP
  163.     printf("startup_vpp ,zoom:%x (x,y):%d y:%d max(x,y):%d %dn",
  164.         vpp_zoom,vpp_zoom_x,vpp_zoom_y,getVPP_XOffsetMax(),getVPP_YOffsetMax());
  165.     #endif
  166. }
  167. void startup_vpp_now(void)
  168. {
  169.     startup_vpp();
  170.     setVPP_DoItNow();
  171. }