diff options
Diffstat (limited to 'debian/patches/libdvdnav/0001-libdvdnav-PR48-enen92.patch')
-rw-r--r-- | debian/patches/libdvdnav/0001-libdvdnav-PR48-enen92.patch | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/debian/patches/libdvdnav/0001-libdvdnav-PR48-enen92.patch b/debian/patches/libdvdnav/0001-libdvdnav-PR48-enen92.patch new file mode 100644 index 0000000..17ae1fa --- /dev/null +++ b/debian/patches/libdvdnav/0001-libdvdnav-PR48-enen92.patch @@ -0,0 +1,184 @@ +From 3984a232ae432fc9aca028a980139d12b087b32e Mon Sep 17 00:00:00 2001 +From: Miguel Borges de Freitas <enen92@kodi.tv> +Date: Tue, 26 Jul 2022 18:20:50 +0100 +Subject: [PATCH] dvdnav_open_files implementation + +Attempts to open files given that the calling application provides the dvd_reader_filesystem implementation +and the path to the file. Supports logging callbacks similarly to other dvdnav_open methods. +Useful for opening files located on a virtual file system (vfs) such as smb, nfs, etc +--- + libdvdnav-embedded/src/dvdnav.c | 21 ++++++++++++++------- + libdvdnav-embedded/src/dvdnav/dvdnav.h | 12 ++++++++++++ + libdvdnav-embedded/src/vm/vm.c | 9 ++++++--- + libdvdnav-embedded/src/vm/vm.h | 3 ++- + 4 files changed, 34 insertions(+), 11 deletions(-) + +diff --git a/libdvdnav-embedded/src/dvdnav.c b/libdvdnav-embedded/src/dvdnav.c +index 4ef7d1a..b180b18 100644 +--- a/libdvdnav-embedded/src/dvdnav.c ++++ b/libdvdnav-embedded/src/dvdnav.c +@@ -151,7 +151,8 @@ dvdnav_status_t dvdnav_free_dup(dvdnav_t *this) { + static dvdnav_status_t dvdnav_open_common(dvdnav_t** dest, + void *priv, const dvdnav_logger_cb *logcb, + const char *path, +- dvdnav_stream_cb *stream_cb) { ++ dvdnav_stream_cb *stream_cb, ++ dvdnav_filesystem_h *fs) { + dvdnav_t *this; + struct timeval time; + +@@ -174,7 +175,7 @@ static dvdnav_status_t dvdnav_open_common(dvdnav_t** dest, + if(!this->vm) { + goto fail; + } +- if(!vm_reset(this->vm, path, priv, stream_cb)) { ++ if(!vm_reset(this->vm, path, priv, stream_cb, fs)) { + goto fail; + } + +@@ -213,24 +214,30 @@ fail: + } + + dvdnav_status_t dvdnav_open(dvdnav_t** dest, const char *path) { +- return dvdnav_open_common(dest, NULL, NULL, path, NULL); ++ return dvdnav_open_common(dest, NULL, NULL, path, NULL, NULL); + } + + dvdnav_status_t dvdnav_open2(dvdnav_t** dest, + void *priv,const dvdnav_logger_cb *logcb, + const char *path) { +- return dvdnav_open_common(dest, priv, logcb, path, NULL); ++ return dvdnav_open_common(dest, priv, logcb, path, NULL, NULL); + } + + dvdnav_status_t dvdnav_open_stream(dvdnav_t** dest, + void *priv, dvdnav_stream_cb *stream_cb) { +- return dvdnav_open_common(dest, priv, NULL, NULL, stream_cb); ++ return dvdnav_open_common(dest, priv, NULL, NULL, stream_cb, NULL); + } + + dvdnav_status_t dvdnav_open_stream2(dvdnav_t** dest, + void *priv,const dvdnav_logger_cb *logcb, + dvdnav_stream_cb *stream_cb) { +- return dvdnav_open_common(dest, priv, logcb, NULL, stream_cb); ++ return dvdnav_open_common(dest, priv, logcb, NULL, stream_cb, NULL); ++} ++ ++dvdnav_status_t dvdnav_open_files(dvdnav_t** dest, ++ void *priv, const dvdnav_logger_cb *logcb, ++ const char *path, dvdnav_filesystem_h *fs) { ++ return dvdnav_open_common(dest, priv, logcb, path, NULL, fs); + } + + dvdnav_status_t dvdnav_close(dvdnav_t *this) { +@@ -280,7 +287,7 @@ dvdnav_status_t dvdnav_reset(dvdnav_t *this) { + #ifdef LOG_DEBUG + Log3(this, "resetting vm"); + #endif +- if(!vm_reset(this->vm, NULL, NULL, NULL)) { ++ if(!vm_reset(this->vm, NULL, NULL, NULL, NULL)) { + printerr("Error restarting the VM."); + pthread_mutex_unlock(&this->vm_lock); + return DVDNAV_STATUS_ERR; +diff --git a/libdvdnav-embedded/src/dvdnav/dvdnav.h b/libdvdnav-embedded/src/dvdnav/dvdnav.h +index 85136a4..ebb3751 100644 +--- a/libdvdnav-embedded/src/dvdnav/dvdnav.h ++++ b/libdvdnav-embedded/src/dvdnav/dvdnav.h +@@ -32,6 +32,7 @@ extern "C" { + + #include "version.h" + #include <dvdnav/dvd_types.h> ++#include <dvdread/dvd_filesystem.h> + #include <dvdread/dvd_reader.h> + #include <dvdread/nav_types.h> + #include <dvdnav/dvdnav_events.h> +@@ -55,6 +56,8 @@ typedef int32_t dvdnav_status_t; + + typedef dvd_reader_stream_cb dvdnav_stream_cb; + ++typedef dvd_reader_filesystem_h dvdnav_filesystem_h; ++ + /* + * Unless otherwise stated, all functions return DVDNAV_STATUS_OK if + * they succeeded, otherwise DVDNAV_STATUS_ERR is returned and the error may +@@ -110,6 +113,15 @@ dvdnav_status_t dvdnav_open_stream2(dvdnav_t **dest, + void *priv, const dvdnav_logger_cb *, + dvdnav_stream_cb *stream_cb); + ++/* ++ * Attempts to open files given that the calling application provides the dvd_reader_filesystem implementation ++ * and the path to the file. Supports logging callbacks similarly to other dvdnav_open methods. ++ * Useful for opening files located on a virtual file system (vfs) such as smb, nfs, etc ++ */ ++dvdnav_status_t dvdnav_open_files(dvdnav_t **dest, ++ void *priv, const dvdnav_logger_cb *, ++ const char *path, dvdnav_filesystem_h *fs); ++ + dvdnav_status_t dvdnav_dup(dvdnav_t **dest, dvdnav_t *src); + dvdnav_status_t dvdnav_free_dup(dvdnav_t * _this); + +diff --git a/libdvdnav-embedded/src/vm/vm.c b/libdvdnav-embedded/src/vm/vm.c +index 9276c91..23c187b 100644 +--- a/libdvdnav-embedded/src/vm/vm.c ++++ b/libdvdnav-embedded/src/vm/vm.c +@@ -334,7 +334,7 @@ dvd_reader_t *vm_get_dvd_reader(vm_t *vm) { + + int vm_start(vm_t *vm) { + if (vm->stopped) { +- if (!vm_reset(vm, NULL, NULL, NULL)) ++ if (!vm_reset(vm, NULL, NULL, NULL, NULL)) + return 0; + + vm->stopped = 0; +@@ -368,7 +368,7 @@ static void vm_close(vm_t *vm) { + } + + int vm_reset(vm_t *vm, const char *dvdroot, +- void *priv, dvdnav_stream_cb *stream_cb) { ++ void *priv, dvdnav_stream_cb *stream_cb, dvdnav_filesystem_h *fs) { + /* Setup State */ + memset(vm->state.registers.SPRM, 0, sizeof(vm->state.registers.SPRM)); + memset(vm->state.registers.GPRM, 0, sizeof(vm->state.registers.GPRM)); +@@ -410,6 +410,7 @@ int vm_reset(vm_t *vm, const char *dvdroot, + vm->streamcb = *stream_cb; + else + vm->streamcb = (dvdnav_stream_cb) { NULL, NULL, NULL }; ++ vm->dvdreaderfs = fs; + + /* bind local callbacks */ + vm->dvdstreamcb.pf_seek = vm->streamcb.pf_seek ? dvd_reader_seek_handler : NULL; +@@ -426,7 +427,9 @@ int vm_reset(vm_t *vm, const char *dvdroot, + dvd_logger_cb dvdread_logcb = { .pf_log = dvd_reader_logger_handler }; + /* Only install log handler if we have one ourself */ + dvd_logger_cb *p_dvdread_logcb = vm->logcb.pf_log ? &dvdread_logcb : NULL; +- if(dvdroot) ++ if(dvdroot && fs) ++ vm->dvd = DVDOpenFiles(vm, p_dvdread_logcb, dvdroot, vm->dvdreaderfs); ++ else if(dvdroot) + vm->dvd = DVDOpen2(vm, p_dvdread_logcb, dvdroot); + else if(vm->priv && vm->dvdstreamcb.pf_read) + vm->dvd = DVDOpenStream2(vm, p_dvdread_logcb, &vm->dvdstreamcb); +diff --git a/libdvdnav-embedded/src/vm/vm.h b/libdvdnav-embedded/src/vm/vm.h +index bada9f0..e97c6c0 100644 +--- a/libdvdnav-embedded/src/vm/vm.h ++++ b/libdvdnav-embedded/src/vm/vm.h +@@ -72,6 +72,7 @@ typedef struct { + dvdnav_stream_cb streamcb; + dvd_reader_t *dvd; + dvd_reader_stream_cb dvdstreamcb; ++ dvdnav_filesystem_h *dvdreaderfs; + ifo_handle_t *vmgi; + ifo_handle_t *vtsi; + dvd_state_t state; +@@ -119,7 +120,7 @@ dvd_reader_t *vm_get_dvd_reader(vm_t *vm); + int vm_start(vm_t *vm); + void vm_stop(vm_t *vm); + int vm_reset(vm_t *vm, const char *dvdroot, void *priv, +- dvdnav_stream_cb *stream_cb); ++ dvdnav_stream_cb *stream_cb, dvdnav_filesystem_h *fs); + + /* copying and merging - useful for try-running an operation */ + vm_t *vm_new_copy(vm_t *vm); +-- +2.35.1 + |