summaryrefslogtreecommitdiffstats
path: root/contrib/libdvdnav/A07-missing-menu.patch
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2009-11-16 19:32:49 +0000
committerjstebbins <[email protected]>2009-11-16 19:32:49 +0000
commitfc45fb323ef56083c6a8753b6332b84b5faaf0fe (patch)
tree02bbbccb8916a3f40376b5461fd277e4f9a89b94 /contrib/libdvdnav/A07-missing-menu.patch
parent234471f57b92b167f15a6cd99e81465337302d56 (diff)
a better patch for handling MTR missing menu scenario
The previous method was not very robust and we found corner cases that broke. This new method explicitly checks for the existance of a menu whenever the vm attempts to transition to a menu. If there is no menu, it enters the Exit state. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@2940 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'contrib/libdvdnav/A07-missing-menu.patch')
-rw-r--r--contrib/libdvdnav/A07-missing-menu.patch110
1 files changed, 110 insertions, 0 deletions
diff --git a/contrib/libdvdnav/A07-missing-menu.patch b/contrib/libdvdnav/A07-missing-menu.patch
new file mode 100644
index 000000000..078f4748e
--- /dev/null
+++ b/contrib/libdvdnav/A07-missing-menu.patch
@@ -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))