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

DVD

开发平台:

Unix_Linux

  1. This module, dvd_file, can be used to access DVD Video discs 
  2. mounted onto the filesystem, e.g. an udf mounted DVD-ROM. 
  3. This access does not place restrictions on the physical 
  4. order of files or blocks on the medium, as direct DVD Video
  5. access does. As a direct result of this, CSS is not working.
  6. Only unencrypted DVD Video discs can be played.
  7. The Makefile is more a dummy Makefile, it just compiles the 
  8. object file. The use of this module is to include it in
  9. a project of your own, e.g. a DVD Video Navigator.
  10. _____________________________________________________________________
  11. How to access The DVD Video
  12. First, you have to tell where the disc resides in the filesystem.
  13. Pass the path to or into the VIDEO_TS directory (not case sensitive), 
  14. as well as the requested block size (for DVD Video: 2048) to 
  15. FileSetVideoPath(). Unless the path is set successfully, all 
  16. other functions return with an error.
  17. Then, you can use FileReadVMGM(), FileReadVTSM() and FileReadVTS()
  18. to read a single block of VIDEO_TS.VOB, VTS_xx_0.VOB and VTS_xx_y.VOB, 
  19. respectively. Where xx is the video title set number ('vtsn'), 
  20. and y the segment number 1 to 9 of the title file. The segment 
  21. number is determined automatically from the block number.
  22. 'lbnum' is the number of the block to read, relative to the
  23. beginning of the file and starting from 0.
  24. 'data' has to point to at least 2048 bytes allocated memory.
  25. simplified example:
  26. #include "DVDPlayerAPI.h"
  27. #include "dvd_file.h"
  28. #define LB_LEN 2048  // Length of one logical block in bytes
  29. int vtsn;          // current video title set number 
  30. u32 lbn;           // logical block number currently being played
  31. u32 vobu_ea;       // last block of current VOBU
  32. DVDDomainID Domain;
  33. unsigned char LB[LB_LEN];
  34. int InfoFileParser(int VTS_number, void *infostruct) {
  35.   int blocks;
  36.   u8 *infodata;
  37.   int bup=0;  // do we use the backup?
  38.   int request;
  39.   if ((VTS_number<0) || (VTS_number>99)) return 1;  // illegal title number
  40.   request=((VTS_number)?2:1);
  41.   while (1) {
  42.     if (!(blocks=FileReadIFO(VTS_number,bup,&infodata))) return 1;
  43.     if (ParseInfo(infodata,infostruct)!=request) {  // not provided here
  44.       free(infodata);
  45.       if (bup++) return 1;
  46.       continue;
  47.     } else {
  48.       return 0;
  49.     }
  50.   }
  51. }
  52. void Play() {
  53.   int err;
  54.   switch (Domain) {
  55.     case DVDDomainVideoManagerMenu: 
  56.       err=FileReadVMGM(lbn,LB);
  57.       break;
  58.     case DVDDomainVideoTitleSetMenu: 
  59.       err=FileReadVTSM(vtsn,lbn,LB);
  60.       break;
  61.     case DVDDomainTitle: 
  62.       err=FileReadVTS(vtsn,lbn,LB);
  63.       break;
  64.     default:
  65.       lbn=vobu_ea;
  66.       err=1;
  67.       break;
  68.   }
  69.   if (!err) {
  70.     err=parse_LB(LB);  // function not included in example
  71.   }
  72.   ps.lbn++;
  73. }
  74. int main (int argc, char* argv[]) {
  75.   FileSetVideoPath(argv[1],LB_LEN);
  76.   InfoFileParser(0,vmgi);
  77.   // now, insert lots of magical dvd menu stuff.
  78.   // results in "play title 1", for example.
  79.   vtsn=1;
  80.   InfoFileParser(vtsn,vtsi);
  81.   Domain=DVDDomainTitle;  // this is done magically
  82.   lbn=0;  // this as well. actual numbers may vary.
  83.   while (ps.lbn<=vobu_ea) Play();
  84. }
  85.   
  86. _____________________________________________________________________
  87. Version history:
  88. 19991209 (chw)
  89.   First release.
  90.   
  91.