ifo.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #ifndef __IFO_H__
  2. #define __IFO_H__
  3. #ifndef DVD_VIDEO_LB_LEN
  4. #define DVD_VIDEO_LB_LEN 2048
  5. #endif
  6. #define OFFSET_IFO 0x0000
  7. #define OFFSET_VTS 0x0000
  8. #define OFFSET_LEN 0x00C0
  9. #define IFO_OFFSET_TAT 0x00C0
  10. #define OFFSET_VTSI_MAT 0x0080
  11. #define IFO_OFFSET_VIDEO 0x0100
  12. #define IFO_OFFSET_AUDIO 0x0200
  13. #define IFO_OFFSET_SUBPIC 0x0250
  14. // for debug and error output
  15. /**
  16.  * Video Info Table 
  17.  */
  18. typedef struct {
  19. #if BYTE_ORDER == BIG_ENDIAN
  20. u_char compression      : 2;
  21. u_char system           : 2;
  22. u_char ratio            : 2;
  23. u_char perm_displ       : 2;
  24. u_char line21_1         : 1;
  25. u_char line21_2         : 1;
  26. u_char source_res       : 2;
  27. u_char letterboxed      : 1;
  28. u_char mode             : 1;
  29. #else
  30. u_char perm_displ       : 2;
  31. u_char ratio            : 2;
  32. u_char system           : 2;
  33. u_char compression      : 2;
  34. u_char mode             : 1;
  35. u_char letterboxed      : 1;
  36. u_char source_res       : 2;
  37. u_char line21_2         : 1;
  38. u_char line21_1         : 1;
  39. #endif
  40. } ifo_video_info_t;
  41. /**
  42.  * Audio Table
  43.  */
  44. typedef struct {
  45. #if MPEG3_LITTLE_ENDIAN
  46. u_char num_channels : 3;    // number of channels (n+1)
  47. u_char sample_freq : 2;    // sampling frequency
  48. u_char quantization : 2;    // quantization
  49. u_char appl_mode2 : 1;    // audio application mode
  50. u_char appl_mode1 : 1;    // 
  51. u_char type : 2;    // audio type (language included?)
  52. u_char multichannel_extension: 1;
  53. u_char coding_mode : 2;
  54. #else
  55. u_char appl_mode2 : 1;
  56. u_char quantization : 2;
  57. u_char sample_freq : 2;
  58. u_char num_channels : 3;
  59. u_char coding_mode : 2;
  60. u_char multichannel_extension: 1;
  61. u_char type : 2;
  62. u_char appl_mode1 : 1;
  63. #endif
  64. u_short lang_code : 16;   // <char> description
  65. u_int   foo : 8;    // 0x00000000 ?
  66. u_int   caption : 8;
  67. u_int   bar : 8;    // 0x00000000 ?
  68. } ifo_audio_t;
  69. #define IFO_AUDIO_LEN 7
  70. /**
  71.  * Subpicture Table
  72.  */
  73. typedef struct {
  74. u_short prefix  : 16;           // 0x0100 ?
  75. u_short lang_code : 16;         // <char> description
  76. u_char foo      : 8;            // dont know
  77. u_char caption  : 8;            // 0x00 ?
  78. } ifo_spu_t;
  79. /**
  80.  * Time Map Table header entry
  81.  */
  82. #if 0
  83. typedef struct {
  84. u_char  tu : 16;    // time unit (in seconds)
  85. u_int : 16;   // don't know
  86. } ifo_tmt_hdr_t;
  87. #endif
  88. typedef struct {
  89. u_int : 24;   // don't know
  90. u_char  tu : 8;    // time unit (in seconds)
  91. } ifoq_tmt_hdr_t;
  92. //#define IFO_TMT_HDR_LEN 4
  93. #define IFOQ_TMT_HDR_LEN 1
  94. /**
  95.  * hmm
  96.  */
  97. typedef struct {
  98.         u_short vob_id          : 16;   // Video Object Identifier
  99.         u_char  cell_id         : 8;    // Cell Identifier
  100.         u_char                  : 8;    // don't know
  101.         u_int   start           : 32;   // Cell start
  102.         u_int   end             : 32;   // Cell end
  103. } ifo_cell_addr_t;
  104. typedef struct {
  105. u_short vob_id : 16; // Video Object Identifier
  106. u_short cell_id : 16; // Cell Identifier
  107. } ifo_pgc_cell_pos_t;
  108. /**
  109.  * Part of Title AND Title set Cell Address
  110.  */
  111. typedef struct {
  112. u_short pgc; // Program Chain (PTT)
  113. u_short pg; // Program (PTT)
  114. u_long start; // Start of VOBU (VTS? CADDR)
  115. u_long end; // End of VOBU (VTS? CADDR)
  116. } ifo_ptt_data_t;
  117. typedef struct {
  118. u_int num; // Number of Chapters
  119. ifo_ptt_data_t *data; // Data
  120. } ifo_ptt_sub_t;
  121. typedef struct {
  122. u_int num; // Number of Titles
  123. ifo_ptt_sub_t *title; // Titles
  124. } ifo_ptt_t;
  125. typedef struct {
  126. u_char chain_info : 8; // 0x5e 0xde(2 angles, no overlay), 0x5f 0x9f 0x9f 0xdf(4 angles overlay), 0x2 0xa 0x8(1 angle)
  127. u_char foo : 8; // parent control ??
  128. u_char still_time : 8;
  129. u_char cell_cmd : 8;
  130.         //u_int   foo             : 32;
  131.         u_int   len_time        : 32;
  132.         u_int   vobu_start      : 32;   // 1st vobu start
  133.         u_int   ilvu_end        : 32;
  134.         u_int   vobu_last_start : 32;
  135.         u_int   vobu_last_end   : 32;
  136. } ifo_pgci_cell_addr_t;
  137. #define PGCI_CELL_ADDR_LEN 24
  138. #define ID_NUM_MENU_VOBS 0
  139. #define ID_NUM_TITLE_VOBS 1
  140. #define ID_MAT 0
  141. #define ID_PTT 1
  142. #define ID_TSP 1
  143. #define ID_TITLE_PGCI 2
  144. #define ID_MENU_PGCI 3
  145. #define ID_TMT 4
  146. #define ID_MENU_CELL_ADDR 5
  147. #define ID_MENU_VOBU_ADDR_MAP 6
  148. #define ID_TITLE_CELL_ADDR 7
  149. #define ID_TITLE_VOBU_ADDR_MAP  8
  150. /**
  151.  * Information Table - for internal use only
  152.  */
  153.  
  154. typedef struct {
  155. u_int num_menu_vobs;
  156. u_int vob_start;
  157. u_char *data[10];
  158. int fd; // file descriptor
  159. int64_t pos; // offset of ifo file on device 
  160. } ifo_t;
  161. /**
  162.  * Generic header
  163.  */
  164. #define IFO_HDR_LEN 8
  165. #define IFOQ_HDR_LEN 2
  166. typedef struct {
  167.         u_short num     : 16;   // number of entries
  168.         u_short         : 16;   // don't known (reserved?)
  169.         u_int   len     : 32;   // length of table
  170. } ifo_hdr_t;
  171. typedef struct {
  172.         u_short         : 16;   // don't known (reserved?)
  173.         u_short num     : 16;   // number of entries
  174.         u_int   len     : 32;   // length of table
  175. } ifoq_hdr_t;
  176. /**
  177.  * Prototypes
  178.  */
  179. ifo_t *ifoOpen (int fd, int64_t pos);
  180. int ifoClose (ifo_t *ifo);
  181. u_int ifoGetVOBStart (ifo_t *ifo);
  182. int ifoGetNumberOfTitles (ifo_t *ifo);
  183. int ifoGetNumberOfParts (ifo_t *ifo);
  184. int ifoGetVMGPTT (ifo_hdr_t *hdr, char **ptr);
  185. int ifoGetPGCI (ifo_hdr_t *hdr, int title, char **ptr);
  186. int ifoGetCLUT (char *pgc, char **ptr);
  187. u_int ifoGetCellPlayInfo (u_char *pgc, u_char **ptr);
  188. u_int ifoGetCellPos (u_char *pgc, u_char **ptr);
  189. int ifoGetProgramMap (char *pgc, char **ptr);
  190. int ifoGetCellAddr (char *cell_addr, char **ptr);
  191. int ifoGetCellAddrNum (char *hdr);
  192. int ifoGetAudio (char *hdr, char **ptr);
  193. int ifoGetSPU (char *hdr, char **ptr);
  194. ifo_ptt_t *ifo_get_ptt (ifo_t *ifo);
  195. int ifo_get_num_title_pgci (ifo_t *ifo);
  196. u_char *ifo_get_ptr_title_pgci (ifo_t *ifo, int index);
  197. char *ifoDecodeLang (u_short descr);
  198. int ifoIsVTS (ifo_t *ifo);
  199. int ifoIsVMG (ifo_t *ifo);
  200. void ifoPrintVideo (u_char *ptr);
  201. void ifoPrintCellPlayInfo (u_char *ptr, u_int num);
  202. void ifoPrintCellInfo (u_char *ptr, u_int num);
  203. void ifoPrintCellPos (u_char *ptr, u_int num);
  204. void ifoPrintCLUT (u_char *ptr); 
  205. void ifoPrintProgramMap (u_char *ptr, u_int num);
  206. #ifdef PARSER
  207. void ifoPrintAudio (ifo_audio_t *ptr, u_int num);
  208. void ifoPrintSPU (ifo_spu_t *ptr, u_int num);
  209. void ifoPrintTMT (ifo_t *ifo);
  210. void ifoPrintVMOP (u_char *opcode);
  211. void ifoPrint_ptt (ifo_ptt_t *ptt);
  212. void ifoPrint_vts_vobu_addr_map (ifo_t *ifo);
  213. void ifoPrint_vtsm_vobu_addr_map (ifo_t *ifo);
  214. void ifoPrint_vts_cell_addr (ifo_t *ifo);
  215. void ifoPrint_vtsm_cell_addr (ifo_t *ifo);
  216. void ifoPrint_title_pgci (ifo_t *ifo);
  217. void ifoPrint_pgc_cmd (u_char *pgc_ptr);
  218. void ifoPrintTSP (u_char *toast);
  219. void ifoPrint_pgc (u_char *ptr);
  220. #endif
  221. #endif