summaryrefslogtreecommitdiffstats
path: root/vobsub.c
diff options
context:
space:
mode:
authorulion <ulion@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-12-14 08:16:39 +0000
committerulion <ulion@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-12-14 08:16:39 +0000
commitdf0f80508ece7dab3740840fc0eb0b4ecef3f77f (patch)
tree89ba6db1bf36a76879228ef6878973ec513e10aa /vobsub.c
parent5eaf53d925ebb63188e0fb79928326f9cc50ab62 (diff)
downloadmpv-df0f80508ece7dab3740840fc0eb0b4ecef3f77f.tar.bz2
mpv-df0f80508ece7dab3740840fc0eb0b4ecef3f77f.tar.xz
Support using unrar executable to access rar-compressed vobsub files.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25389 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'vobsub.c')
-rw-r--r--vobsub.c39
1 files changed, 32 insertions, 7 deletions
diff --git a/vobsub.c b/vobsub.c
index ce804c3b77..3a075bb021 100644
--- a/vobsub.c
+++ b/vobsub.c
@@ -20,7 +20,9 @@
#include "vobsub.h"
#include "spudec.h"
#include "mp_msg.h"
-#ifdef USE_UNRARLIB
+#ifdef USE_UNRAR_EXEC
+#include "unrar_exec.h"
+#elif defined(USE_UNRARLIB)
#include "unrarlib.h"
#endif
#include "libavutil/common.h"
@@ -35,7 +37,7 @@ static int vobsubid = -2;
* The RAR file must have the same basename as the file to open
* See <URL:http://www.unrarlib.org/>
**********************************************************************/
-#ifdef USE_UNRARLIB
+#if defined(USE_UNRARLIB) || defined(USE_UNRAR_EXEC)
typedef struct {
FILE *file;
unsigned char *data;
@@ -59,7 +61,7 @@ rar_open(const char *const filename, const char *const mode)
if (stream->file == NULL) {
char *rar_filename;
const char *p;
- int rc;
+ int rc = 0;
/* Guess the RAR archive filename */
rar_filename = NULL;
p = strrchr(filename, '.');
@@ -88,15 +90,27 @@ rar_open(const char *const filename, const char *const mode)
} else {
p++;
}
+#ifdef USE_UNRAR_EXEC
+ rc = unrar_exec_get(&stream->data, &stream->size, p, rar_filename);
+#endif
+#ifdef USE_UNRARLIB
+ if (!rc)
rc = urarlib_get(&stream->data, &stream->size, (char*) p, rar_filename, "");
+#endif
if (!rc) {
/* There is no matching filename in the archive. However, sometimes
* the files we are looking for have been given arbitrary names in the archive.
* Let's look for a file with an exact match in the extension only. */
- int i, num_files, name_len;
+ int i, num_files = -1, name_len;
ArchiveList_struct *list, *lp;
+#ifdef USE_UNRARLIB
/* the cast in the next line is a hack to overcome a design flaw (IMHO) in unrarlib */
num_files = urarlib_list (rar_filename, (ArchiveList_struct *)&list);
+#endif
+#ifdef USE_UNRAR_EXEC
+ if (num_files <= 0)
+ num_files = unrar_exec_list(rar_filename, &list);
+#endif
if (num_files > 0) {
char *demanded_ext;
demanded_ext = strrchr (p, '.');
@@ -105,13 +119,24 @@ rar_open(const char *const filename, const char *const mode)
for (i=0, lp=list; i<num_files; i++, lp=lp->next) {
name_len = strlen (lp->item.Name);
if (name_len >= demanded_ext_len && !strcasecmp (lp->item.Name + name_len - demanded_ext_len, demanded_ext)) {
- if ((rc = urarlib_get(&stream->data, &stream->size, lp->item.Name, rar_filename, ""))) {
- break;
- }
+#ifdef USE_UNRAR_EXEC
+ rc = unrar_exec_get(&stream->data, &stream->size,
+ lp->item.Name, rar_filename);
+ if (rc) break;
+#endif
+#ifdef USE_UNRARLIB
+ rc = urarlib_get(&stream->data, &stream->size,
+ lp->item.Name, rar_filename, "");
+ if (rc) break;
+#endif
}
}
}
+#ifdef USE_UNRARLIB
urarlib_freelist (list);
+#else
+ unrar_exec_freelist(list);
+#endif
}
if (!rc) {
free(rar_filename);