summaryrefslogtreecommitdiffstats
path: root/debian/patches/libdvdnav/0001-libdvdnav-PR48-enen92.patch
blob: 17ae1fa337a5e2b73931ba505ae657cfea9c9aca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
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