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

DVD

开发平台:

Unix_Linux

  1. /*
  2.  * PGROGRAM CHAIN INFORMATION
  3.  *
  4.  * Copyright (C) 1998,1999  Thomas Mirlacher
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  * 
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  * 
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  * 
  20.  * The author may be reached as dent@cosy.sbg.ac.at, or
  21.  * Thomas Mirlacher, Jakob-Haringerstr. 2, A-5020 Salzburg,
  22.  * Austria
  23.  *
  24.  *------------------------------------------------------------
  25.  *
  26.  * $log$
  27.  */
  28. #ifdef PARSER
  29. #include <stdio.h>
  30. #endif
  31. #include <sys/types.h>
  32. #include <unistd.h>
  33. #include "ifo.h"
  34. #include "misc.h"
  35. #include "pgc.h"
  36. #include "decode.h"
  37. #define OFFSET_START_TBL_CMD (12+8*2+32*4+8+16*PGCI_COLOR_LEN)
  38. typedef struct {
  39. u_char : 8; // don't know
  40. u_char y : 8;
  41. u_char cr : 8;
  42. u_char cb : 8;
  43. } pgci_color_t;
  44. #define PGCI_COLOR_LEN 4
  45. void ifo_print_cell_position (u_char *ptr, u_int num);
  46. /**
  47.  *
  48.  */
  49. int ifoGetCLUT (char *pgc, char **ptr)
  50. {
  51. *ptr = pgc;
  52. if (!pgc)
  53. return -1;
  54. *ptr += 2;
  55. *ptr += 10;
  56. *ptr += 8 * 2; // AUDIO
  57. *ptr += 32 * 4; // SUBPICTURE
  58. *ptr += 8;
  59. return 0;
  60. }
  61. /**
  62.  *
  63.  */
  64. int ifoGetProgramMap (char *pgc, char **ptr)
  65. {
  66. int num;
  67. *ptr = pgc;
  68. if (!pgc)
  69. return -1;
  70. *ptr += 2;
  71. num = **ptr;
  72. *ptr += 10;
  73. *ptr += 8 * 2; // AUDIO
  74. *ptr += 32 * 4; // SUBPICTURE
  75. *ptr += 8;
  76. *ptr += 16 * PGCI_COLOR_LEN; // CLUT
  77. *ptr += 2;
  78. *ptr = get2bytes (*ptr) + pgc;
  79. return num;
  80. }
  81. /**
  82.  *
  83.  */
  84. int ifoGetCellPlayInfo (char *pgc, char **ptr)
  85. {
  86. int num;
  87. *ptr = pgc;
  88. if (!pgc)
  89. return -1;
  90. *ptr += 3;
  91. num = **ptr;
  92. *ptr += 9;
  93. *ptr += 8 * 2; // AUDIO
  94. *ptr += 32 * 4; // SUBPICTURE
  95. *ptr += 8;
  96. *ptr += 16 * PGCI_COLOR_LEN; // CLUT
  97. *ptr += 4;
  98. *ptr =  get2bytes (*ptr) + pgc;
  99. return num;
  100. }
  101. /**
  102.  *
  103.  */
  104. int ifoGetCellPos (char *pgc, char **ptr)
  105. {
  106. int num;
  107. *ptr = pgc;
  108. if (!pgc)
  109. return -1;
  110. *ptr += 3;
  111. num = **ptr;
  112. *ptr += 9;
  113. *ptr += 8 * 2; // AUDIO
  114. *ptr += 32 * 4; // SUBPICTURE
  115. *ptr += 8;
  116. *ptr += 16 * PGCI_COLOR_LEN; // CLUT
  117. *ptr += 6;
  118. *ptr = get2bytes (*ptr) + pgc;
  119. return num;
  120. }
  121. /**
  122.  *
  123.  */
  124. void ifo_print_pgc (u_char *pgc_ptr)
  125. {
  126. int i;
  127. u_int num;
  128. char *ptr = pgc_ptr;
  129. if (!ptr)
  130. return;
  131. printf ("ntPROGRAM CHAINn");
  132. printf ("t---n");
  133. /*****/
  134. printf ("foo1: %x %xn", *ptr++, *ptr++);
  135. printf ("num_programs: %x  num_cells: %xn", *ptr++, *ptr++); 
  136. /*****/
  137. printf ("nttchain time: %02x:%02x:%02x:%02xn",
  138. ptr[0],
  139. ptr[1],
  140. ptr[2],
  141. // ptr[3] & 0x1F);
  142. ptr[3] & 0x7F);
  143. // printf ("VideoMode: %sn", decode_videomode (ptr[3] >> 8));
  144. printf ("%sframes/sn", ptr[3]&0x80 ? "30" : "25 non-drop");
  145. ptr += 4;
  146. /*****/
  147. //UNKNOWN
  148. printf ("foo2: %x %xn", *ptr++, *ptr++);
  149. printf ("foo3: %x %xn", *ptr++, *ptr++);
  150. /*****/
  151. printf ("nttAUDIOn");
  152. for (i=0; i<8; i++) { // 8 subaudio streams
  153. if (*ptr & 0x80) { // avail
  154. printf ("ttt0x%02x->0x%02x unknown:0x%02xn",
  155. i,
  156. *ptr&0x7f,
  157. *(ptr+1));
  158. }
  159. ptr+=2;
  160. }
  161. /*****/
  162. printf ("nttSUBPICTUREn");
  163. for (i=0; i<32; i++) {
  164. if (*ptr & 0x80) { // avail
  165. printf ("ttt0x%02x 4:3 0x%02x wide 0x%02x letter 0x%02x pan 0x%02xn",
  166. i,
  167. *ptr&0x7f,
  168. *(ptr+1),
  169. *(ptr+2),
  170. *(ptr+3));
  171. }
  172. ptr+=4;
  173. }
  174. /*****/
  175. //UNKNOWN
  176. for (i=0; i<8; i++) {
  177. if (!(i%16))
  178. printf ("nt0x%04x: ", i);
  179. printf ("%02x  ", *ptr++);
  180. }
  181. /*****/
  182. if (ifoGetCLUT (pgc_ptr, &ptr) >= 0)
  183. ifoPrintCLUT (ptr);
  184. ifo_print_pgc_cmd (pgc_ptr);
  185. if ((num = ifoGetProgramMap (pgc_ptr, &ptr)))
  186. ifoPrintProgramMap (ptr, num);
  187. if ((num = ifoGetCellPlayInfo (pgc_ptr, &ptr)))
  188. ifoPrintCellInfo (ptr, num);
  189. if ((num = ifoGetCellPos (pgc_ptr, &ptr)))
  190. ifoPrintCellPos (ptr, num);
  191. /*****/
  192. }
  193. /**
  194.  *
  195.  */
  196. void ifoPrintCellPos (u_char *ptr, u_int num)
  197. { int i;
  198. printf ("ntCELL POSITION (num: %d)n", num);
  199. for (i=0; i<num; i++) {
  200. printf ("ttVOB ID: %02x ", get2bytes (ptr));
  201. ptr += 2;
  202. printf ("Cell ID: %02xn", get2bytes (ptr));
  203. ptr += 2;
  204. }
  205. }
  206. void _print_pgc (u_int cmd)
  207. {
  208. switch (cmd >> 8) {
  209. case 0x00:
  210. printf ("NoP ");
  211. break;
  212. case 0x20:
  213. printf ("Lnk ");
  214. break;
  215. case 0x30:
  216. printf ("Jmp ");
  217. break;
  218. }
  219. switch (cmd&0xff) {
  220. case 0x01:
  221. printf ("SIns/Exit ");
  222. break;
  223. case 0x02:
  224. printf ("VTS nn ");
  225. break;
  226. case 0x03:
  227. printf ("VTS Title nn ");
  228. break;
  229. case 0x04:
  230. printf ("PGC ");
  231. break;
  232. case 0x05:
  233. printf ("PTT ");
  234. break;
  235. case 0x06:
  236. printf ("Program nn This PGC ");
  237. break;
  238. case 0x07:
  239. printf ("Cell nn This PGC ");
  240. break;
  241. }
  242. }
  243. /**
  244.  *
  245.  */
  246. void ifo_print_pgc_cmd (u_char *pgc_ptr)
  247. {
  248. int i;
  249. u_int num_pre_cmd;
  250. u_int num_post_cmd;
  251. u_int num_cell_cmd;
  252. u_int len_cmd_tbl;
  253. u_char *ptr;
  254. if ((ptr = get2bytes (pgc_ptr + OFFSET_START_TBL_CMD) + pgc_ptr) == pgc_ptr) 
  255. return;
  256. num_pre_cmd  = get2bytes (ptr);
  257. ptr+=2;
  258. num_post_cmd  = get2bytes (ptr);
  259. ptr+=2;
  260. /*****/
  261. //cell commands
  262. num_cell_cmd = get2bytes (ptr);
  263. ptr+=2;
  264. len_cmd_tbl = get2bytes (ptr);
  265. ptr+=2;
  266. printf ("nttcell commands: (num: 0x%02x)", num_cell_cmd);
  267. /*****/
  268. //pre commands
  269. printf ("nttpre commands: (num: 0x%02x)", num_pre_cmd);
  270. for (i=0; i<num_pre_cmd*8; i++) {
  271. if (!(i%6)) {
  272. printf ("nttt0x%04x: ", i/8);
  273. _print_pgc (*ptr<<8 | *(ptr+1));
  274. ptr += 2;
  275. }
  276. printf ("%02x ", *ptr++);
  277. }
  278. /*****/
  279. //post commands
  280. printf ("nnttpost commands: (num: 0x%02x)", num_post_cmd);
  281. for (i=0; i<num_post_cmd*8; i++) {
  282. if (!(i%6)) {
  283. printf ("nttt0x%04x: ", i/8);
  284. _print_pgc (*ptr<<8 | *(ptr+1));
  285. ptr += 2;
  286. }
  287. printf ("%02x ", *ptr++);
  288. }
  289. }
  290. /**
  291.  *
  292.  */
  293. void ifoPrintCellInfo (u_char *ptr, u_int num_cell_play_info)
  294. {
  295. int i;
  296. printf ("ntCELL PLAY INFO (num: %d)n", num_cell_play_info);
  297. for (i=0; i<num_cell_play_info; i++) {
  298. ifo_pgci_cell_addr_t *cell_addr = (ifo_pgci_cell_addr_t *) ptr;
  299. printf ("ttstill_time: %02xst cell_cmd: 0x%xtlen: %02x:%02x:%02x:%02xt1st_vobu_start: 0x%xn",
  300. (ntohl (cell_addr->foo) >> 8) & 0xFF,
  301. (ntohl (cell_addr->foo)) & 0xFF,
  302. (ntohl (cell_addr->len_time) >> 24) & 0xFF,
  303. (ntohl (cell_addr->len_time) >> 16) & 0xFF,
  304. (ntohl (cell_addr->len_time) >> 8) & 0xFF,
  305. ntohl (cell_addr->len_time) & 0x7F,
  306. ntohl (cell_addr->vobu_start));
  307. printf ("%sframes/sn", ntohl (cell_addr->len_time) & 0x80 ? "30" : "25 non-drop");
  308. printf ("tt1st_ilvu_end: 0x%xtlast_vobu_start: 0x%xttlast_vobu_end  : 0x%xn",
  309. ntohl (cell_addr->ilvu_end),
  310. ntohl (cell_addr->vobu_last_start),
  311. ntohl (cell_addr->vobu_last_end));
  312. ptr += PGCI_CELL_ADDR_LEN;
  313. }
  314. }
  315. /**
  316.  *
  317.  */
  318. void ifoPrintCLUT (u_char *clut)
  319. {
  320. pgci_color_t *pgci_color = (pgci_color_t *) clut;
  321. int num = 16;
  322. printf ("nttCLUT:n");
  323. while (num--) {
  324. printf ("ttt0xY:0x%x Cr:0x%x Cb:0x%xn",
  325. pgci_color->y,
  326. pgci_color->cr,
  327. pgci_color->cb);
  328. pgci_color++;
  329. }
  330. }
  331. /**
  332.  *
  333.  */
  334. void ifoPrintProgramMap (u_char *ptr, u_int num)
  335. {
  336. int i;
  337. printf ("nnttcell links: (num: %d)n", num);
  338. for (i=0; i<num; i++) {
  339. printf ("ttt0x%02x -> 0x%02xn",
  340. i, *ptr);
  341. ptr++;
  342. }
  343. }