OSDN Git Service

import 0.9.4
[handbrake-jp/handbrake-jp.git] / contrib / libdvdnav / A07-missing-menu.patch
diff --git a/contrib/libdvdnav/A07-missing-menu.patch b/contrib/libdvdnav/A07-missing-menu.patch
new file mode 100644 (file)
index 0000000..078f474
--- /dev/null
@@ -0,0 +1,110 @@
+diff -Naur libdvdnav.orig/src/vm/vm.c libdvdnav/src/vm/vm.c
+--- libdvdnav.orig/src/vm/vm.c 2009-10-29 09:10:44.836643320 -0700
++++ libdvdnav/src/vm/vm.c      2009-11-16 11:10:07.527247268 -0800
+@@ -585,6 +585,9 @@
+     switch(menuid) {
+     case DVD_MENU_Title:
+     case DVD_MENU_Escape:
++      if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
++        goto fail;
++      }
+       (vm->state).domain = VMGM_DOMAIN;
+       break;
+     case DVD_MENU_Root:
+@@ -592,6 +595,9 @@
+     case DVD_MENU_Audio:
+     case DVD_MENU_Angle:
+     case DVD_MENU_Part:
++      if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
++        goto fail;
++      }
+       (vm->state).domain = VTSM_DOMAIN;
+       break;
+     }
+@@ -606,6 +612,7 @@
+     break;
+   }
++fail:
+   return 0;
+ }
+@@ -1488,6 +1495,10 @@
+       /* Allowed from anywhere except the VTS Title domain */
+       /* Stop SPRM9 Timer and any GPRM counters */
+       assert((vm->state).domain != VTS_DOMAIN); /* ?? */
++      if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
++        link_values.command = Exit;
++        break;
++      }
+       (vm->state).domain = VMGM_DOMAIN;
+       if(!set_MENU(vm, link_values.data1))
+       assert(0);
+@@ -1504,14 +1515,22 @@
+       if (link_values.data1 != (vm->state).vtsN) {
+         /* the normal case */
+         assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
+-        (vm->state).domain = VTSM_DOMAIN;
+         if (!ifoOpenNewVTSI(vm, vm->dvd, link_values.data1))  /* Also sets (vm->state).vtsN */
+           assert(0);
++          if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
++            link_values.command = Exit;
++            break;
++          }
++        (vm->state).domain = VTSM_DOMAIN;
+       } else {
+         /* This happens on some discs like "Captain Scarlet & the Mysterons" or
+          * the German RC2 of "Anatomie" in VTSM. */
+         assert((vm->state).domain == VTSM_DOMAIN ||
+           (vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
++          if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
++            link_values.command = Exit;
++            break;
++          }
+         (vm->state).domain = VTSM_DOMAIN;
+       }
+       } else {
+@@ -1533,6 +1552,10 @@
+       /* set_PGCN:data1 */
+       /* Stop SPRM9 Timer and any GPRM counters */
+       assert((vm->state).domain != VTS_DOMAIN); /* ?? */
++      if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
++        link_values.command = Exit;
++        break;
++      }
+       (vm->state).domain = VMGM_DOMAIN;
+       if(!set_PGCN(vm, link_values.data1))
+       assert(0);
+@@ -1552,6 +1575,10 @@
+       /* set_RSMinfo:data2 */
+       assert((vm->state).domain == VTS_DOMAIN); /* ?? */
+       /* Must be called before domain is changed */
++      if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
++        link_values.command = Exit;
++        break;
++      }
+       set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
+       (vm->state).domain = VMGM_DOMAIN;
+       if(!set_MENU(vm, link_values.data1))
+@@ -1563,6 +1590,10 @@
+       /* set_RSMinfo:data2 */
+       assert((vm->state).domain == VTS_DOMAIN); /* ?? */
+       /* Must be called before domain is changed */
++      if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
++        link_values.command = Exit;
++        break;
++      }
+       set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
+       (vm->state).domain = VTSM_DOMAIN;
+       if(!set_MENU(vm, link_values.data1))
+@@ -1574,6 +1605,10 @@
+       /* set_RSMinfo:data2 */
+       assert((vm->state).domain == VTS_DOMAIN); /* ?? */
+       /* Must be called before domain is changed */
++      if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
++        link_values.command = Exit;
++        break;
++      }
+       set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
+       (vm->state).domain = VMGM_DOMAIN;
+       if(!set_PGCN(vm, link_values.data1))