summaryrefslogtreecommitdiffstats
path: root/contrib/libdvdnav
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2010-04-20 02:19:16 +0000
committerjstebbins <[email protected]>2010-04-20 02:19:16 +0000
commitc550723257a62601b8a9331140b9eecfbdca1b79 (patch)
tree0bc7faefe6f94a5b513ee978b3fb6e8d11a7f66a /contrib/libdvdnav
parent78aaa0da6e4f331d0c9d97a67a15f5eb1aafb5fe (diff)
add dvd main feature title detection
scans the dvd menus and presses buttons to see where they might lead. when a button press leads to a title, i check to see if it is the longest seen thus far and save it's index. this only applies when dvdnav is enabled. when dvdread is in use, the longest title of all the titles is flagged as the "main feature" git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3245 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'contrib/libdvdnav')
-rw-r--r--contrib/libdvdnav/A08-dvdnav-dup.patch137
1 files changed, 137 insertions, 0 deletions
diff --git a/contrib/libdvdnav/A08-dvdnav-dup.patch b/contrib/libdvdnav/A08-dvdnav-dup.patch
new file mode 100644
index 000000000..ce6072a4c
--- /dev/null
+++ b/contrib/libdvdnav/A08-dvdnav-dup.patch
@@ -0,0 +1,137 @@
+Index: src/dvdnav.c
+===================================================================
+--- libdvdnav.orig/src/dvdnav.c (revision 1168)
++++ libdvdnav/src/dvdnav.c (working copy)
+@@ -71,6 +71,67 @@
+ return DVDNAV_STATUS_OK;
+ }
+
++dvdnav_status_t dvdnav_dup(dvdnav_t **dest, dvdnav_t *src) {
++ dvdnav_t *this;
++
++ (*dest) = NULL;
++ this = (dvdnav_t*)malloc(sizeof(dvdnav_t));
++ if(!this)
++ return DVDNAV_STATUS_ERR;
++
++ memcpy(this, src, sizeof(dvdnav_t));
++ this->file = NULL;
++
++ pthread_mutex_init(&this->vm_lock, NULL);
++
++ this->vm = vm_new_copy(src->vm);
++ if(!this->vm) {
++ printerr("Error initialising the DVD VM.");
++ pthread_mutex_destroy(&this->vm_lock);
++ free(this);
++ return DVDNAV_STATUS_ERR;
++ }
++
++ /* Start the read-ahead cache. */
++ this->cache = dvdnav_read_cache_new(this);
++
++ (*dest) = this;
++ return DVDNAV_STATUS_OK;
++}
++
++dvdnav_status_t dvdnav_free_dup(dvdnav_t *this) {
++
++#ifdef LOG_DEBUG
++ fprintf(MSG_OUT, "libdvdnav: free_dup:called\n");
++#endif
++
++ if (this->file) {
++ pthread_mutex_lock(&this->vm_lock);
++ DVDCloseFile(this->file);
++#ifdef LOG_DEBUG
++ fprintf(MSG_OUT, "libdvdnav: close:file closing\n");
++#endif
++ this->file = NULL;
++ pthread_mutex_unlock(&this->vm_lock);
++ }
++
++ /* Free the VM */
++ if(this->vm)
++ vm_free_copy(this->vm);
++
++ pthread_mutex_destroy(&this->vm_lock);
++
++ /* We leave the final freeing of the entire structure to the cache,
++ * because we don't know, if there are still buffers out in the wild,
++ * that must return first. */
++ if(this->cache)
++ dvdnav_read_cache_free(this->cache);
++ else
++ free(this);
++
++ return DVDNAV_STATUS_OK;
++}
++
+ dvdnav_status_t dvdnav_open(dvdnav_t** dest, const char *path) {
+ dvdnav_t *this;
+ struct timeval time;
+Index: src/dvdnav/dvdnav.h
+===================================================================
+--- libdvdnav.orig/src/dvdnav/dvdnav.h (revision 1168)
++++ libdvdnav/src/dvdnav/dvdnav.h (working copy)
+@@ -89,6 +89,9 @@
+ */
+ dvdnav_status_t dvdnav_open(dvdnav_t **dest, const char *path);
+
++dvdnav_status_t dvdnav_dup(dvdnav_t **dest, dvdnav_t *src);
++dvdnav_status_t dvdnav_free_dup(dvdnav_t *this);
++
+ /*
+ * Closes a dvdnav_t previously opened with dvdnav_open(), freeing any
+ * memory associated with it.
+Index: src/vm/vm.c
+===================================================================
+--- libdvdnav.orig/src/vm/vm.c (revision 1168)
++++ libdvdnav/src/vm/vm.c (working copy)
+@@ -96,6 +98,7 @@
+
+ static pgcit_t* get_MENU_PGCIT(vm_t *vm, ifo_handle_t *h, uint16_t lang);
+ static pgcit_t* get_PGCIT(vm_t *vm);
++static void vm_close(vm_t *vm);
+
+
+ /* Helper functions */
+@@ -262,7 +265,7 @@
+ }
+
+ void vm_free_vm(vm_t *vm) {
+- vm_stop(vm);
++ vm_close(vm);
+ free(vm);
+ }
+
+@@ -289,12 +292,20 @@
+
+ int vm_start(vm_t *vm) {
+ /* Set pgc to FP (First Play) pgc */
++ if (vm->stopped) {
++ vm_reset(vm, NULL);
++ vm->stopped = 0;
++ }
+ set_FP_PGC(vm);
+ process_command(vm, play_PGC(vm));
+ return !vm->stopped;
+ }
+
+ void vm_stop(vm_t *vm) {
++ vm->stopped = 1;
++}
++
++static void vm_close(vm_t *vm) {
+ if(vm->vmgi) {
+ ifoClose(vm->vmgi);
+ vm->vmgi=NULL;
+@@ -346,7 +357,7 @@
+
+ if (vm->dvd && dvdroot) {
+ /* a new dvd device has been requested */
+- vm_stop(vm);
++ vm_close(vm);
+ }
+ if (!vm->dvd) {
+ vm->dvd = DVDOpen(dvdroot);