OSDN Git Service

fix another MTR feature title extraction issue
[handbrake-jp/handbrake-jp-git.git] / contrib / libdvdnav / A07-missing-menu.patch
1 diff -Naur libdvdnav.orig/src/vm/vm.c libdvdnav/src/vm/vm.c
2 --- libdvdnav.orig/src/vm/vm.c  2009-10-29 09:10:44.836643320 -0700
3 +++ libdvdnav/src/vm/vm.c       2009-11-27 11:32:47.475322754 -0800
4 @@ -585,6 +585,9 @@
5      switch(menuid) {
6      case DVD_MENU_Title:
7      case DVD_MENU_Escape:
8 +      if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
9 +        goto fail;
10 +      }
11        (vm->state).domain = VMGM_DOMAIN;
12        break;
13      case DVD_MENU_Root:
14 @@ -592,6 +595,9 @@
15      case DVD_MENU_Audio:
16      case DVD_MENU_Angle:
17      case DVD_MENU_Part:
18 +      if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
19 +        goto fail;
20 +      }
21        (vm->state).domain = VTSM_DOMAIN;
22        break;
23      }
24 @@ -606,6 +612,7 @@
25      break;
26    }
27  
28 +fail:
29    return 0;
30  }
31  
32 @@ -1412,8 +1419,9 @@
33        if(link_values.data2 != 0)
34         (vm->state).HL_BTNN_REG = link_values.data2 << 10;
35        if(!set_VTS_PTT(vm, (vm->state).vtsN, (vm->state).VTS_TTN_REG, link_values.data1))
36 -       assert(0);
37 -      link_values = play_PG(vm);
38 +        link_values.command = Exit;
39 +      else
40 +        link_values = play_PG(vm);
41        break;
42      case LinkPGN:
43        /* Link to Program Number:data1 */
44 @@ -1458,8 +1466,9 @@
45        /* Set SPRM1 and SPRM2 */
46        assert((vm->state).domain == VTSM_DOMAIN || (vm->state).domain == VTS_DOMAIN); /* ?? */
47        if(!set_VTS_TT(vm, (vm->state).vtsN, link_values.data1))
48 -       assert(0);
49 -      link_values = play_PGC(vm);
50 +        link_values.command = Exit;
51 +      else
52 +        link_values = play_PGC(vm);
53        break;
54      case JumpVTS_PTT:
55        /* Jump to Part:data2 of Title:data1 in same VTS Title Domain */
56 @@ -1469,8 +1478,9 @@
57        /* Set SPRM1 and SPRM2 */
58        assert((vm->state).domain == VTSM_DOMAIN || (vm->state).domain == VTS_DOMAIN); /* ?? */
59        if(!set_VTS_PTT(vm, (vm->state).vtsN, link_values.data1, link_values.data2))
60 -       assert(0);
61 -      link_values = play_PGC_PG(vm, (vm->state).pgN);
62 +        link_values.command = Exit;
63 +      else
64 +        link_values = play_PGC_PG(vm, (vm->state).pgN);
65        break;
66  
67      case JumpSS_FP:
68 @@ -1488,6 +1498,10 @@
69        /* Allowed from anywhere except the VTS Title domain */
70        /* Stop SPRM9 Timer and any GPRM counters */
71        assert((vm->state).domain != VTS_DOMAIN); /* ?? */
72 +      if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
73 +        link_values.command = Exit;
74 +        break;
75 +      }
76        (vm->state).domain = VMGM_DOMAIN;
77        if(!set_MENU(vm, link_values.data1))
78         assert(0);
79 @@ -1504,14 +1518,22 @@
80         if (link_values.data1 != (vm->state).vtsN) {
81           /* the normal case */
82           assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
83 -         (vm->state).domain = VTSM_DOMAIN;
84           if (!ifoOpenNewVTSI(vm, vm->dvd, link_values.data1))  /* Also sets (vm->state).vtsN */
85             assert(0);
86 +          if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
87 +            link_values.command = Exit;
88 +            break;
89 +          }
90 +         (vm->state).domain = VTSM_DOMAIN;
91         } else {
92           /* This happens on some discs like "Captain Scarlet & the Mysterons" or
93            * the German RC2 of "Anatomie" in VTSM. */
94           assert((vm->state).domain == VTSM_DOMAIN ||
95             (vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
96 +          if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
97 +            link_values.command = Exit;
98 +            break;
99 +          }
100           (vm->state).domain = VTSM_DOMAIN;
101         }
102        } else {
103 @@ -1533,6 +1555,10 @@
104        /* set_PGCN:data1 */
105        /* Stop SPRM9 Timer and any GPRM counters */
106        assert((vm->state).domain != VTS_DOMAIN); /* ?? */
107 +      if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
108 +        link_values.command = Exit;
109 +        break;
110 +      }
111        (vm->state).domain = VMGM_DOMAIN;
112        if(!set_PGCN(vm, link_values.data1))
113         assert(0);
114 @@ -1552,6 +1578,10 @@
115        /* set_RSMinfo:data2 */
116        assert((vm->state).domain == VTS_DOMAIN); /* ?? */
117        /* Must be called before domain is changed */
118 +      if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
119 +        link_values.command = Exit;
120 +        break;
121 +      }
122        set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
123        (vm->state).domain = VMGM_DOMAIN;
124        if(!set_MENU(vm, link_values.data1))
125 @@ -1563,6 +1593,10 @@
126        /* set_RSMinfo:data2 */
127        assert((vm->state).domain == VTS_DOMAIN); /* ?? */
128        /* Must be called before domain is changed */
129 +      if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
130 +        link_values.command = Exit;
131 +        break;
132 +      }
133        set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
134        (vm->state).domain = VTSM_DOMAIN;
135        if(!set_MENU(vm, link_values.data1))
136 @@ -1574,6 +1608,10 @@
137        /* set_RSMinfo:data2 */
138        assert((vm->state).domain == VTS_DOMAIN); /* ?? */
139        /* Must be called before domain is changed */
140 +      if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
141 +        link_values.command = Exit;
142 +        break;
143 +      }
144        set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
145        (vm->state).domain = VMGM_DOMAIN;
146        if(!set_PGCN(vm, link_values.data1))
147 @@ -1634,7 +1672,9 @@
148    (vm->state).TT_PGCN_REG = pgcN;
149    (vm->state).PTTN_REG    = part;
150    (vm->state).TTN_REG     = get_TT(vm, vtsN, vts_ttn);
151 -  assert( (vm->state.TTN_REG) != 0 );
152 +  if( (vm->state.TTN_REG) == 0 )
153 +    return 0;
154 +
155    (vm->state).VTS_TTN_REG = vts_ttn;
156    (vm->state).vtsN        = vtsN;  /* Not sure about this one. We can get to it easily from TTN_REG */
157    /* Any other registers? */