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

DVD

开发平台:

Unix_Linux

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <stdlib.h>
  4. #include <linux/types.h>
  5. #include <dxr2.h>
  6. #include <fcntl.h>
  7. int main(int argc, char* argv[]) 
  8. {
  9.   int t;
  10.   int fd;
  11.   int uCodeFD;
  12.   int uCodeSize;
  13.   int mpegFD;
  14.   dxr2_threeArg_t buf3;
  15.   dxr2_uCode_t* uCode;
  16.   char buffer[0x20000];
  17.   int size;
  18.   int i;
  19.   // check args
  20.   if (argc != 2) {
  21.     
  22.     printf("Syntax: test <MPEG filename>n");
  23.     exit(1);
  24.   }
  25.   
  26.   // open device
  27.   if ((fd = open("/dev/dxr2", O_WRONLY)) < 0) {
  28.     
  29.     fprintf(stderr, "ERROR: device (%s): %sn", "/dev/dxr2", strerror(errno));
  30.     exit(1);
  31.   }  
  32.   // open the mpeg
  33.   if ((mpegFD = open(argv[1], O_RDONLY)) < 0) {
  34.     
  35.     fprintf(stderr, "ERROR: Could not open mpeg (%s): %sn", argv[1], strerror(errno));
  36.     exit(1);
  37.   }
  38.   // Read ucode
  39.   if ((uCodeFD = open("dvd1.ux", O_RDONLY)) < 0) {
  40.     
  41.     fprintf(stderr, "ERROR: Could not open uCode (%s): %sn", "dvd1.ux", strerror(errno));
  42.     exit(1);
  43.   }
  44.   uCodeSize = lseek(uCodeFD, 0, SEEK_END);
  45.   if ((uCode = malloc(uCodeSize + 4)) == NULL) {
  46.     
  47.     fprintf(stderr, "ERROR: Could not allocate memory for uCode: %sn", strerror(errno));
  48.     exit(1);
  49.   }
  50.   lseek(uCodeFD, 0, SEEK_SET);
  51.   if (read(uCodeFD, uCode+4, uCodeSize) != uCodeSize) {
  52.     
  53.     fprintf(stderr, "ERROR: Could not read uCode uCode: %sn", strerror(errno));
  54.     exit(1);
  55.   }
  56.   close(uCodeFD);
  57.   uCode->uCodeLength = uCodeSize;
  58.   // upload ucode
  59.   if (ioctl(fd, DXR2_IOC_INIT_ZIVADS, uCode)) {
  60.     
  61.     fprintf(stderr, "uCode upload failed!n");
  62.     exit(1);
  63.   }
  64.   // CHANGEME
  65.   // TV mode. can be DXR2_TVFORMAT_PAL or DXR2_TVFORMAT_NTSC
  66.   buf3.arg1 = DXR2_TVFORMAT_PAL;
  67.   printf("output tv format status = %in", ioctl(fd, DXR2_IOC_SET_OUTPUT_TV_FORMAT, &buf3));
  68.   // source video frequency
  69.   // set to DXR2_SRC_VIDEO_FREQ_25 for NTSC mpegs, or DXR2_SRC_VIDEO_FREQ_30 for PAL ones
  70.   buf3.arg1 = DXR2_SRC_VIDEO_FREQ_25;
  71.   buf3.arg2 = 0x2d0;
  72.   buf3.arg3 = 0x1e0;
  73.   printf("source video format status = %in", ioctl(fd, DXR2_IOC_SET_SOURCE_VIDEO_FORMAT, &buf3));
  74.   // output aspect ratio 4:3
  75.   buf3.arg1 = DXR2_ASPECTRATIO_4_3;
  76.   printf("output aspect ratio status = %in", ioctl(fd, DXR2_IOC_SET_OUTPUT_ASPECT_RATIO, &buf3));
  77.   // source aspect ratio 4:3
  78.   buf3.arg1 = DXR2_ASPECTRATIO_4_3;
  79.   printf("source aspect ratio status = %in", ioctl(fd, DXR2_IOC_SET_SOURCE_ASPECT_RATIO, &buf3));
  80.   // use normal scaling mode (i.e. NOT letterboxed or pan/scanned
  81.   buf3.arg1 = DXR2_ASPECTRATIOMODE_NORMAL;
  82.   printf("aspect ratio mode status = %in", ioctl(fd, DXR2_IOC_SET_ASPECT_RATIO_MODE, &buf3));
  83.   // CHANGEME
  84.   // BITSTREAM TYPE
  85.   // can be DXR2_BITSTREAM_TYPE_MPEG_VCD for MPEG1 stream (i.e. video CDs), or DXR2_BITSTREAM_TYPE_MPEG_VOB for
  86.   // (unencrypted) DVD .VOB files
  87.   //  buf3.arg1 = DXR2_BITSTREAM_TYPE_MPEG_VCD;
  88.   buf3.arg1 = DXR2_BITSTREAM_TYPE_MPEG_VOB;
  89.   printf("bitstream type status = %in", ioctl(fd, DXR2_IOC_SET_BITSTREAM_TYPE, &buf3));
  90.   // macrovision off
  91.   buf3.arg1 = DXR2_MACROVISION_OFF;
  92.   printf("macrovision status = %in", ioctl(fd, DXR2_IOC_SET_MACROVISION_MODE, &buf3));
  93.   // volume = max
  94.   buf3.arg1 = 19;
  95.   printf("volume status = %in", ioctl(fd, DXR2_IOC_SET_AUDIO_VOLUME, &buf3));
  96.   // mute is OFF
  97.   buf3.arg1 = DXR2_AUDIO_MUTE_OFF;
  98.   printf("mute off = %in", ioctl(fd, DXR2_IOC_AUDIO_MUTE, &buf3));
  99.   // 16 bit audio
  100.   buf3.arg1 = DXR2_AUDIO_WIDTH_16;
  101.   printf("audio width = %in", ioctl(fd, DXR2_IOC_SET_AUDIO_DATA_WIDTH, &buf3));
  102.   // audio freq = 44.1 kHz
  103.   buf3.arg1 = DXR2_AUDIO_FREQ_441;
  104.   printf("audio width = %in", ioctl(fd, DXR2_IOC_SET_AUDIO_SAMPLE_FREQUENCY, &buf3));
  105.   // not quite sure actually... 
  106.   buf3.arg1 = DXR2_IEC958_ENCODED;
  107.   printf("iec958 status = %in", ioctl(fd, DXR2_IOC_IEC958_OUTPUT_MODE, &buf3));
  108.   // CHANGEME
  109.   // select audio stream.
  110.   // arg1 is the type of audio stream... for MPEG1 (VCD), you'll want DXR2_STREAM_AUDIO_MPEG,
  111.   // and for AC3, you'll want DXR2_STREAM_AUDIO_AC3
  112.   // arg2 is the ID of WHICH audio stream to play.
  113.   // buf3.arg1 = DXR2_STREAM_AUDIO_AC3;
  114.   buf3.arg1 = DXR2_STREAM_AUDIO_MPEG;
  115.   buf3.arg2 = 0;
  116.   printf("select stream status = %in", ioctl(fd, DXR2_IOC_SELECT_STREAM, &buf3));
  117.   
  118.   // enter play mode!
  119.   printf("play status = %in", ioctl(fd, DXR2_IOC_PLAY, NULL));
  120.   // main loop, sending data to card.
  121.   // this SHOULD really have a reader and a writer thread, but that can wait till after
  122.   // we've finished fixing the card itself
  123.   size=1;
  124.   while(size != 0) {
  125.     // read in some data
  126.     size = read(mpegFD, buffer, 0x8000);
  127.     write(fd, buffer, size);   
  128.   }
  129.   // close it again
  130.   close(fd);
  131.   return(0);
  132. }
  133.