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

DVD

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * Copyright (C) 1998,1999  Thomas Mirlacher
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  * 
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  * 
  19.  * The author may be reached as dent@cosy.sbg.ac.at, or
  20.  * Thomas Mirlacher, Jakob-Haringerstr. 2, A-5020 Salzburg,
  21.  * Austria
  22.  *
  23.  *------------------------------------------------------------
  24.  *
  25.  */
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <string.h>
  29. #include <unistd.h>
  30. #include <errno.h>
  31. #include <unistd.h>
  32. #include <sys/types.h>
  33. #include <sys/mman.h>
  34. #include "ifo.h"
  35. #include "misc.h"
  36. /**
  37.  *
  38.  */
  39. int ifoIsVTS (ifo_t *ifo)
  40. {
  41.         if (!strncmp (ifo->data[ID_MAT], "DVDVIDEO-VTS", 12)) 
  42. return 0;
  43. return -1;
  44. }
  45. /**
  46.  *
  47.  */
  48. int ifoIsVMG (ifo_t *ifo)
  49. {
  50.         if (!strncmp (ifo->data[ID_MAT], "DVDVIDEO-VMG", 12))
  51. return 0;
  52. return -1;
  53. }
  54. /**
  55.  *
  56.  */
  57. int ifoGetVOBStart (ifo_t *ifo)
  58. {
  59. return ifo->vob_start;
  60. }
  61. #define OFF_PTT get4bytes (ifo->data[ID_MAT] + 0xC8)
  62. #define OFF_TITLE_PGCI get4bytes (ifo->data[ID_MAT] + 0xCC)
  63. #define OFF_MENU_PGCI get4bytes (ifo->data[ID_MAT] + 0xD0)
  64. #define OFF_TMT get4bytes (ifo->data[ID_MAT] + 0xD4)
  65. #define OFF_MENU_CELL_ADDR get4bytes (ifo->data[ID_MAT] + 0xD8)
  66. #define OFF_MENU_VOBU_ADDR_MAP get4bytes (ifo->data[ID_MAT] + 0xDC)
  67. #define OFF_TITLE_CELL_ADDR get4bytes (ifo->data[ID_MAT] + 0xE0)
  68. #define OFF_TITLE_VOBU_ADDR_MAP get4bytes (ifo->data[ID_MAT] + 0xE4)
  69. #define OFF_VMG_PTT get4bytes (ifo->data[ID_MAT] + 0xC4)
  70. #define OFF_VMG_MENU_PGCI get4bytes (ifo->data[ID_MAT] + 0xC8)
  71. #define OFF_VMG_TMT get4bytes (ifo->data[ID_MAT] + 0xD0)
  72. /**
  73.  *
  74.  */
  75. ifo_t *ifoOpen (int fd, __off64_t pos)
  76. {
  77. ifo_t *ifo;
  78. if (!(ifo = (ifo_t *) calloc (sizeof (ifo_t), 1))) {
  79. fprintf (stderr, "%s/%d: memory squeeze (ifo)n", __FILE__, __LINE__);
  80. return NULL;
  81. }
  82. if (!(ifo->data[ID_MAT] = (char *) calloc (DVD_VIDEO_LB_LEN, 1))) {
  83. fprintf (stderr, "%s/%d: memory squeeze (data)n", __FILE__, __LINE__);
  84. return NULL;
  85. }
  86. ifo->pos = pos; 
  87. ifo->fd = fd;
  88. if (ifoReadLB (ifo->fd, ifo->pos, DVD_VIDEO_LB_LEN, ifo->data[ID_MAT]) < 0) {
  89. fprintf (stderr, "%s/%d: something went wrong when reading file.n", __FILE__, __LINE__);
  90. return NULL;
  91. }
  92. ifo->num_menu_vobs = get4bytes (ifo->data[ID_MAT] + 0xC0);
  93. ifo->vob_start = get4bytes (ifo->data[ID_MAT] + 0xC4);
  94. if (!ifoIsVTS (ifo)) {
  95. ifoReadTBL (ifo, OFF_PTT, ID_PTT);
  96. ifoReadTBL (ifo, OFF_TITLE_PGCI, ID_TITLE_PGCI);
  97. ifoReadTBL (ifo, OFF_MENU_PGCI, ID_MENU_PGCI);
  98. ifoReadTBL (ifo, OFF_TMT, ID_TMT);
  99. ifoReadTBL (ifo, OFF_MENU_CELL_ADDR, ID_MENU_CELL_ADDR);
  100. ifoReadTBL (ifo, OFF_MENU_VOBU_ADDR_MAP, ID_MENU_VOBU_ADDR_MAP);
  101. ifoReadTBL (ifo, OFF_TITLE_CELL_ADDR, ID_TITLE_CELL_ADDR);
  102. ifoReadTBL (ifo, OFF_TITLE_VOBU_ADDR_MAP, ID_TITLE_VOBU_ADDR_MAP);
  103. } else if (!ifoIsVMG (ifo)) {
  104. ifoReadTBL (ifo, OFF_VMG_PTT, ID_PTT);
  105. // ifoReadTBL (ifo, OFF_TITLE_PGCI, ID_TITLE_PGCI);
  106. ifoReadTBL (ifo, OFF_VMG_MENU_PGCI, ID_MENU_PGCI);
  107. ifoReadTBL (ifo, OFF_VMG_TMT, ID_TMT);
  108. // ifoReadTBL (ifo, OFF_MENU_CELL_ADDR, ID_MENU_CELL_ADDR);
  109. // ifoReadTBL (ifo, OFF_MENU_VOBU_ADDR_MAP, ID_MENU_VOBU_ADDR_MAP);
  110. ifoReadTBL (ifo, OFF_TITLE_CELL_ADDR, ID_TITLE_CELL_ADDR);
  111. ifoReadTBL (ifo, OFF_TITLE_VOBU_ADDR_MAP, ID_TITLE_VOBU_ADDR_MAP);
  112. // ifo->title_pgci = get4bytes (ifo->data[ID_MAT] + 0xCC);
  113. // ifo->menu_cell_addr = get4bytes (ifo->data[ID_MAT] + 0xD8);
  114. // ifo->menu_vobu_addr_map = get4bytes (ifo->data[ID_MAT] + 0xDC);
  115. }
  116. return ifo;
  117. }
  118. /**
  119.  *
  120.  */
  121. int ifoClose (ifo_t *ifo)
  122. {
  123. // close (ifo->fd);
  124. free (ifo->data[ID_MAT]);
  125. free (ifo->data[ID_PTT]);
  126. free (ifo->data[ID_TITLE_PGCI]);
  127. free (ifo->data[ID_MENU_PGCI]);
  128. free (ifo->data[ID_TMT]);
  129. free (ifo->data[ID_MENU_CELL_ADDR]);
  130. free (ifo->data[ID_MENU_VOBU_ADDR_MAP]);
  131. free (ifo->data[ID_TITLE_CELL_ADDR]);
  132. free (ifo->data[ID_TITLE_VOBU_ADDR_MAP]);
  133. free (ifo);
  134. return 0;
  135. }