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

DVD

开发平台:

Unix_Linux

  1. /*
  2.  * PART OF TITLE
  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.  */
  27. #ifdef PARSER
  28. #include <stdio.h>
  29. #endif
  30. #include <stdlib.h>
  31. #include <unistd.h>
  32. #include <sys/types.h>
  33. #include "ifo.h"
  34. #include "misc.h"
  35. #include "decode.h"
  36. #define PTT_LEN 4
  37. typedef struct {
  38. u_short pgc : 16; // Program Chain number
  39. u_short pg : 16; // Program number
  40. } ptt_t;
  41. /**
  42.  *
  43.  */
  44. int ifoGetVMGPTT (ifo_hdr_t *hdr, char **ptr)
  45. {
  46. *ptr = (char *) (hdr + 1);
  47. return 0;
  48. }
  49. /**
  50.  *
  51.  */
  52. int ifoGetNumberOfTitles (ifo_t *ifo)
  53. {
  54. ifo_hdr_t *hdr = (ifo_hdr_t *) ifo->data[ID_PTT];
  55. if (!ifo->data[ID_PTT])
  56. return -1;
  57. else
  58. return ntohs(hdr->num);
  59. }
  60. /**
  61.  * DENT: change this
  62.  */
  63. int ifoGetNumberOfParts (ifo_t *ifo)
  64. {
  65. ifo_hdr_t *hdr = (ifo_hdr_t *) ifo->data[ID_PTT];
  66. if (!ifo->data[ID_PTT])
  67. return -1;
  68. else
  69. return ntohs(hdr->num);
  70. }
  71. /**
  72.  *
  73.  */
  74. ifo_ptt_t *ifo_get_ptt (ifo_t *ifo)
  75. {
  76. u_char *ptr;
  77. ifo_hdr_t *hdr;
  78. ifo_ptt_t *ifo_ptt;
  79. ifo_ptt_sub_t *ifo_ptt_sub;
  80. ptt_t *ptt = (ptt_t *) ptr;
  81. int i, s;
  82. u_short prev_start = 0;
  83. u_int num;
  84. if (!ifo) {
  85. fprintf (stderr, "%s/%d:no ifo structure presentn", __FILE__, __LINE__);
  86. return NULL;
  87. }
  88. ptr = (u_char *) ifo->data[ID_PTT];
  89. hdr = (ifo_hdr_t *) ifo->data[ID_PTT];
  90. if (!ptr)
  91. return NULL;
  92. if (!(ifo_ptt = (ifo_ptt_t *) malloc (sizeof (ifo_ptt_t))))
  93. return NULL;
  94. ifo_ptt->num = ntohs (hdr->num);
  95. if (!(ifo_ptt_sub = (ifo_ptt_sub_t *) calloc (ifo_ptt->num, sizeof (ifo_ptt_sub_t))))
  96. return NULL;
  97. ifo_ptt->title = ifo_ptt_sub;
  98. ptr += IFO_HDR_LEN;
  99. prev_start = get4bytes (ptr);
  100. for (i=0; i<ntohs(hdr->num); i++) {
  101. if (i>0) {
  102. ifo_ptt_sub = ifo_ptt->title+i-1;
  103. num = (get4bytes (ptr) - prev_start)/4;
  104. ptt = (ptt_t *) ((u_char *) ifo->data[ID_PTT] + prev_start);
  105. if (!(ifo_ptt_sub->data = (ifo_ptt_data_t *) calloc (num, sizeof (ifo_ptt_data_t))))
  106. return NULL;
  107. ifo_ptt_sub->num = num;
  108. for (s=0; s<num; s++) {
  109. ifo_ptt_sub->data[s].pg = ntohs (ptt->pg);
  110. ifo_ptt_sub->data[s].pgc = ntohs (ptt->pgc);
  111. ptt++;
  112. }
  113. prev_start = get4bytes (ptr);
  114. }
  115. ptr+=4;
  116. }
  117. ifo_ptt_sub = ifo_ptt->title+i-1;
  118. num = (ntohl (hdr->len) - prev_start + 1)/4;
  119. ptt = (ptt_t *) ((u_char *) ifo->data[ID_PTT] + prev_start);
  120. // TODO: delete allocated elements when failing here
  121. if (!(ifo_ptt_sub->data = (ifo_ptt_data_t *) calloc (num, sizeof (ifo_ptt_data_t))))
  122. return NULL;
  123. ifo_ptt_sub->num = num;
  124. for (s=0; s<num; s++) {
  125. ifo_ptt_sub->data[s].pg = ntohs (ptt->pg);
  126. ifo_ptt_sub->data[s].pgc = ntohs (ptt->pgc);
  127. ptt++;
  128. }
  129. return ifo_ptt;
  130. }
  131. #ifdef PARSER
  132. /**
  133.  *
  134.  */
  135. void ifo_print_ptt (ifo_ptt_t *ptt)
  136. {
  137. int i, s;
  138. if (!ptt)
  139. return;
  140. printf ("nPART OF TITLEn");
  141. printf ("---n");
  142. printf ("number of titles: %dn", ptt->num);
  143. for (i=0; i<ptt->num; i++) {
  144. ifo_ptt_sub_t *title = ptt->title+i;
  145. printf ("ntTitle: 0x%xtnumber of chapters: %dn", i+1, title->num);
  146. for (s=0; s<title->num; s++) {
  147. printf ("tt Chapter: 0x%02x", s+1);
  148. printf ("t PGC: 0x%02x", title->data[s].pgc);
  149. printf ("t PG: 0x%02xn",title->data[s].pg);
  150. }
  151. }
  152. }
  153. #endif