xbs.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:12k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /* X Window Backend Scale Tool
  2.  *      Version 0.2
  3.  *
  4.  * This program is based on parts from
  5.  *      xcaptest which was written by Bill Dirks
  6.  *      and modified by Ryan Drake.
  7.  *      Some modifications to the driver of Ryan Drake
  8.  *      are necessary. (fixes include in 0.0.7-mb2)
  9.  *      Code mostly rewriten by Alexader Werth
  10.  *      to support Backend Scaler.
  11.  * This program is in the public domain.
  12.  *
  13.  * gcc -o xbs -Wall xbs.c
  14.  *
  15.  */
  16. /*  This program does not properly detect when the X Windows desktop is
  17.  *  32 bits per pixel. (Some X functions use a value of 24 for the depth
  18.  *  when it is really 32 for reasons I don't understand.) As a workaround,
  19.  *  if you are running a 32-bpp X Windows screen, use -b on the command
  20.  *  line, or uncomment this line:  */
  21. /*#define X_DEPTH  32*/
  22. #define SCREEN_X      1152
  23. #define SCREEN_Y      864
  24. /*  Set these according to your capture device set-up */
  25. #define DEFAULT_STD   "PAL" /*-> "PAL" or "NTSC" */
  26. #define DEFAULT_WIDTH  356
  27. #define DEFAULT_HEIGHT 288
  28. #define DEFAULT_X      0
  29. #define DEFAULT_Y      0
  30. #define DEFAULT_INPUT  1
  31. #define DEFAULT_CROMA  268
  32. #define MY_WIDTH  488
  33. #define MY_HEIGHT 366
  34. #define MY_X      SCREEN_X-MY_WIDTH
  35. #define MY_Y      SCREEN_Y-MY_HEIGHT
  36. #define MY_CROMA  268
  37. /*  MY_PIXELFORMAT should match your X Window screen mode  */
  38. /*  If MY_PIXELFORMAT is not defined, capturing will be set to the
  39.     screen format automatically (I hope)  */
  40. //#define MY_PIXELFORMAT V4L2_PIX_FMT_BGR32
  41. /* V4L2_PIX_FMT_YUYV */
  42. /* V4L2_PIX_FMT_GREY */
  43. /* V4L2_PIX_FMT_YUV420 */
  44. /* V4L2_PIX_FMT_RGB555 */
  45. /* V4L2_PIX_FMT_RGB565 */
  46. /* V4L2_PIX_FMT_BGR24 */
  47. /* V4L2_PIX_FMT_BGR32 */
  48. /*  Uncomment the following to test stuff  */
  49. #define TEST_INPUTS      /* enumerate the inputs */
  50. #define TEST_FORMATS     /* enumerate the image formats */
  51. #define TEST_CONTROLS    /* enumerate the controls */
  52. #define TEST_CAPTURE     /* test video capture */
  53. #include <sys/time.h>
  54. #include <sys/types.h>
  55. #include <sys/stat.h>
  56. #include <sys/ioctl.h>
  57. #include <fcntl.h>
  58. #include <unistd.h>
  59. #include <stdlib.h>
  60. #include <stdio.h>
  61. #include <string.h>
  62. #include <sys/mman.h>
  63. #include <errno.h>
  64. #define max(a,b) ((a) > (b) ? (a) : (b))
  65. /* These are needed to use the Videum driver */
  66. #include <linux/fs.h>
  67. #include <linux/kernel.h>
  68. #include <linux/videodev2.h>  /* Video for Linux Two */
  69. int x_depth;
  70. #define VIDIN_ID 1010
  71. void printctrl(struct v4l2_queryctrl *qc)
  72. {
  73. printf("  %-12s %-6s %8d %8d %7d %8d  %sn",
  74.        qc->name,
  75.        (qc->type == V4L2_CTRL_TYPE_MENU) ? "(menu)" : 
  76.        (qc->type == V4L2_CTRL_TYPE_BOOLEAN) ? "(bool)" :
  77.        "(int)",
  78.        qc->minimum, qc->maximum, qc->step, qc->default_value,
  79.        qc->catname);
  80. }
  81. int CallBS(int x, int y, int w, int h, int croma, int source, int enableBS, char* device, 
  82.            int argc, char** argv,int laber, int debug){
  83.   struct   v4l2_capability      cap;
  84.   struct   v4l2_captureparm     parm;
  85.   struct   v4l2_standard        std;
  86.   struct   v4l2_window          bswin;
  87.   struct   v4l2_queryctrl       qc;
  88.   struct   v4l2_control         vc;
  89.   int      err;
  90.   int      i;
  91.   int      vid;
  92.   int      input;
  93.   // ---> Put in the device node name <---
  94.   vid = open(device, O_RDONLY);
  95.   if (vid < 0)
  96.   {
  97.     printf("No video device "%s"n", device);
  98.     return -1;
  99.   }
  100.   err = ioctl(vid, VIDIOC_QUERYCAP, &cap);
  101.   if (err)
  102.   {
  103.     printf("QUERYCAP returned error %dn", errno);
  104.     return -1;
  105.   }
  106.   if (laber) printf("Device node:  %sn", device);
  107.   if (laber) printf("Device:       %sn", cap.name);
  108.   if (debug) printf("Croma:        %dn", croma);
  109.   if (debug) printf("Input:        %dn", source);
  110.   if (laber) printf("Capabilities:");
  111.   if (laber) if (cap.flags & V4L2_FLAG_READ)       printf(" capture via read();");
  112.   if (laber) if (cap.flags & V4L2_FLAG_STREAMING)  printf(" streaming capture;");
  113.   if (laber) if (cap.flags & V4L2_FLAG_PREVIEW)    printf(" automatic preview;");
  114.   if (laber) if (cap.flags & V4L2_FLAG_SELECT)     printf(" select() call;");
  115.   if (laber) if (cap.flags & V4L2_FLAG_TUNER)      printf(" tuner;");
  116.   if (laber) if (cap.flags & V4L2_FLAG_MONOCHROME) printf(" monochrome only;");
  117.   if (laber) printf("n");
  118.   if (cap.type != V4L2_TYPE_CAPTURE)
  119.   {
  120.     printf("Not a capture device.n");
  121.     return 1;
  122.   }
  123.   if(laber) {
  124.     printf("Video inputs on this device:n");
  125.     for (i = 0, err = 0; err == 0; ++i)
  126.     {
  127.       struct v4l2_input inp;
  128.       inp.index = i;
  129.       err = ioctl(vid, VIDIOC_ENUMINPUT, &inp);
  130.       if (!err) 
  131.         printf("  %d: "%s" is a%s, %s audion", i,
  132.                   inp.name,
  133.                   (inp.type == V4L2_INPUT_TYPE_TUNER) ?
  134.                   " TV tuner" : "n analog input",
  135.                   (inp.capability & V4L2_INPUT_CAP_AUDIO) ? 
  136.                   "has" : "no"
  137.                );
  138.     }
  139.   }
  140.   input = source;
  141.   err = ioctl(vid, VIDIOC_S_INPUT, input);
  142.   if (err)
  143.     printf("S_INPUT returned error %dn",errno);
  144.   if (laber) {
  145.     printf("Video standards supported:");
  146.     for (i = 0, err = 0; err == 0; ++i) {
  147.       struct v4l2_enumstd estd;
  148.       estd.index = i;
  149.       err = ioctl(vid, VIDIOC_ENUMSTD, &estd);
  150.       if (!err) {
  151.         printf("%c %s", i?',':' ', estd.std.name);
  152. #ifdef DEFAULT_STD
  153.         if (strcmp(DEFAULT_STD, estd.std.name) == 0)
  154.         std = estd.std;
  155. #endif
  156.       }
  157.     }
  158.     printf("n");
  159.   }
  160.   if (laber) {
  161.     printf("Video capture image formats supported:n");
  162.     for (i = 0, err = 0; err == 0; ++i)
  163.     {
  164.       struct v4l2_fmtdesc fmtd;
  165.       fmtd.index = i;
  166.       err = ioctl(vid, VIDIOC_ENUM_CAPFMT, &fmtd);
  167.       if (!err)
  168.       printf("  %d: %s  (%s)n", i,
  169.       fmtd.description,
  170.          (fmtd.flags & V4L2_FMT_FLAG_COMPRESSED) ?
  171.          "compressed" : "uncompressed");
  172.     }
  173.   }
  174.   if (laber) {
  175.     printf("Controls supported:n");
  176.     printf("  Label        type    Minimum  Maximum    Step  Default  Categoryn");
  177.     qc.id = V4L2_CID_BRIGHTNESS;
  178.     if (ioctl(vid, VIDIOC_QUERYCTRL, &qc) == 0)
  179.       printctrl(&qc);
  180.     qc.id = V4L2_CID_CONTRAST;
  181.     if (ioctl(vid, VIDIOC_QUERYCTRL, &qc) == 0)
  182.       printctrl(&qc);
  183.     qc.id = V4L2_CID_SATURATION;
  184.     if (ioctl(vid, VIDIOC_QUERYCTRL, &qc) == 0)
  185.       printctrl(&qc);
  186.     qc.id = V4L2_CID_HUE;
  187.     if (ioctl(vid, VIDIOC_QUERYCTRL, &qc) == 0)
  188.       printctrl(&qc);
  189.   }
  190.   vc.value = 120;
  191.   vc.id = V4L2_CID_BRIGHTNESS;
  192.   ioctl(vid, VIDIOC_S_CTRL, &vc);
  193.   vc.value = 10;
  194.   vc.id = V4L2_CID_CONTRAST;
  195.   ioctl(vid, VIDIOC_S_CTRL, &vc);
  196.   vc.value = 0;
  197.   vc.id = V4L2_CID_BRIGHTNESS;
  198.   ioctl(vid, VIDIOC_S_CTRL, &vc);
  199.   vc.value = 0;
  200.   vc.id = V4L2_CID_HUE;
  201.   ioctl(vid, VIDIOC_S_CTRL, &vc);
  202.   ioctl(vid, VIDIOC_G_PARM, &parm);
  203.   err = ioctl(vid, VIDIOC_S_PARM, &parm);
  204.   if (err) printf("S_PARM returned error %dn",err);
  205.   //#ifdef DEFAULT_STD
  206.   //err = ioctl(vid, VIDIOC_S_STD, &std);
  207.   //if (err) printf("S_STD returned error %dn",errno);
  208.   //#endif
  209.   //ioctl(vid, VIDIOC_G_FMT, &fmt);
  210.   bswin.x = x;
  211.   bswin.y = y;
  212.   bswin.width = w;
  213.   bswin.height = h;
  214.   bswin.chromakey = croma;
  215.   bswin.clips = NULL;
  216.   bswin.clipcount = 0;
  217.   err = ioctl(vid, VIDIOC_S_WIN, &bswin);
  218.   if (debug) printf("err = ioctl(vid, VIDIOC_S_WIN, &bswin); %dn",err);
  219.   err = ioctl(vid, VIDIOC_PREVIEW ,&enableBS);
  220.   if (debug) printf("err = ioctl(vid, VIDIOC_PREVIEW ,0); %dn",err);
  221.   return 0;
  222. }
  223. int CloseBSWin( int laber, int debug){
  224.   return 0;
  225. }
  226. void PrintUsage(char* programname);
  227. void PrintHelp();
  228. int strtodec(char* s,long* val);
  229. int main( int argc, char** argv )
  230. {
  231.   int enableBS=1;
  232.   int x=DEFAULT_X;
  233.   int y=DEFAULT_Y;
  234.   int w=DEFAULT_WIDTH;
  235.   int h=DEFAULT_HEIGHT;
  236.   int croma=DEFAULT_CROMA;
  237.   int source=DEFAULT_INPUT;
  238.   char* device="/dev/video0";
  239.   int err=0;
  240.   int arguments=0;           // zum Parsen der Kommandozeile
  241.   int option;                // zum Parsen der Kommandozeile
  242.   int fehlerflag=0;          // Fehler in der Komandozeile
  243.   char *av0;                 // enth鋖t den Namen des aufgerufenen Programms
  244.   int laber=0;               // Ausgabelevel
  245.   int debug=0;               // Debuglevel
  246.   av0 = (char*) strrchr(argv[0], '/');                                         // Namen des aufgerufenen Programms holen 
  247.   if (av0 == NULL) av0 = argv[0];
  248.   else av0++;
  249.   while ((option = getopt(argc, argv, "vhdp::s::k:i:brfouc")) != -1)           // Programmoptionen parsen
  250.     {
  251.     switch (option)
  252.       {
  253.       case 'p':
  254.         strtodec(argv[optind],(long*)&x);
  255.         strtodec(argv[optind+1],(long*)&y);
  256.         arguments+=2;
  257.         break;
  258.       case 's':
  259.         strtodec(argv[optind],(long*)&w);
  260.         strtodec(argv[optind+1],(long*)&h);
  261.         arguments+=2;
  262.         break;
  263.       case 'k':
  264.         if (!strcmp(argv[optind-1],"lb")) {
  265.           croma= 268;
  266.         } else if (!strcmp(argv[optind-1],"p")) {
  267.           croma= 2031647;
  268.         } else strtodec(argv[optind-1],(long*)&croma);
  269.         arguments+=1;
  270.         break;
  271.       case 'i':
  272.         if (!strcasecmp(argv[optind-1],"Composite")) {
  273.           source= 0;
  274.         } else if (!strcasecmp(argv[optind-1],"SVHS")) {
  275.           source= 1;
  276.         } else if (!strcasecmp(argv[optind-1],"Tuner")) {
  277.           source= 2;
  278.         } else strtodec(argv[optind-1],(long*)&source);
  279.         arguments+=1;
  280.         break;
  281.       case 'b':
  282.         x_depth = 32;
  283.         break;
  284.       case 'r':
  285.         x=SCREEN_X-w;
  286.         y=SCREEN_Y-h;
  287.         break;
  288.       case 'f':
  289.         x=0;
  290.         y=0;
  291.         w=SCREEN_X;
  292.         h=SCREEN_Y;
  293.         break;
  294.       case 'o':
  295.         croma=-1;
  296.         break;
  297.       case 'u':
  298.         x=MY_X;
  299.         y=MY_Y;
  300.         w=MY_WIDTH;
  301.         h=MY_HEIGHT;
  302.         croma=MY_CROMA;
  303.         break;
  304.       case 'c':
  305.         enableBS = 0;
  306.         break;
  307.       case 'v':
  308.         laber += 1;
  309.         break;
  310.       case 'h':
  311.         PrintUsage(av0);
  312.         PrintHelp();
  313.         exit(1);
  314.         break;
  315.       case 'd':
  316.         debug += 1;
  317.         break;
  318.       case '?':
  319.         fehlerflag = 1;
  320.       };
  321.       if (debug) printf("option: %c  optind: %dn",option,optind);
  322.     };
  323.   if (fehlerflag) {
  324.     PrintUsage(av0);
  325.     exit(1);
  326.     };
  327.   if (debug) printf("optind: %d  argc: %d  arguments: %dn",optind,argc,arguments);
  328.   if (optind+arguments<argc) {  
  329.     if (debug) printf("last argument: %sn",argv[argc-1]);
  330.     device=argv[argc-1];
  331.   }
  332.   if (debug) printf("debug     : %dn",debug);
  333.   if (debug) printf("verbose   : %dn",laber);
  334.   if (laber) printf("pos  x y  : %d %dn",x,y);
  335.   if (laber) printf("size w h  : %d %dn",w,h);
  336.   err = CallBS(x,y,w,h,croma,source,enableBS,device,argc,argv,laber,debug);                                                      
  337.   if (err) { fprintf( stderr, "OpenBSWin returns %dn", err ); }                         
  338.   return 0;
  339. }
  340. int NumberCharacter(char c) {
  341.   if ( (c>='0') & (c<='9') ) return -1;
  342.   return 0;
  343. }
  344. int strtodec(char* s,long* val) { 
  345.   int i=0;                                                                                         // interpret string as value
  346.   long l=0;
  347.   while(s[i]!=0) {
  348.     if (!NumberCharacter(s[i]) ) return -1;
  349.     l= l*10+(s[i]-'0');
  350.     i++;
  351.   }
  352.   *val= l;
  353.   return 0;
  354. };
  355. void PrintUsage(char* programname)
  356. {
  357.   fprintf(stderr,"usage: %s [-hvdbcufor] [-k color] [-i input] [-p xpos ypos] [-s width height] [device]n", programname);       // usage
  358. }
  359. void PrintHelp()
  360. {
  361.   fprintf(stderr,"This program fires up the backend scaler of the Marvel G200.n");                // help message
  362.   fprintf(stderr,"-h : displays this help messagen");                                             
  363.   fprintf(stderr,"-v : adds some infosn");
  364.   fprintf(stderr,"-d : debug infosn");
  365.   //fprintf(stderr,"-t : type of video format NTSC|PAL|SECAM.(not yet supported)n");
  366.   fprintf(stderr,"-i : Video input (0:Composite | 1:SVHS | 2:Tuner)n");
  367.   fprintf(stderr,"-b : for 32bit color X-Servers.n");
  368.   fprintf(stderr,"-c : close backend scaler.n");
  369.   fprintf(stderr,"-k : croma key format rgb 24bit (default is overlay).n");
  370.   fprintf(stderr,"-u : user prefered mode.n");
  371.   fprintf(stderr,"-p : pos xpos ypos. The position of the top left corner of the window.n");
  372.   fprintf(stderr,"-s : size width height. The width and height of the window.n");
  373.   fprintf(stderr,"-f : full screen.n");
  374.   fprintf(stderr,"-o : overlay mode.n");
  375.   fprintf(stderr,"-r : set window in bottom right corner of the screen.n");
  376. }