diff options
author | ulion <ulion@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-12-14 08:16:39 +0000 |
---|---|---|
committer | ulion <ulion@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-12-14 08:16:39 +0000 |
commit | df0f80508ece7dab3740840fc0eb0b4ecef3f77f (patch) | |
tree | 89ba6db1bf36a76879228ef6878973ec513e10aa /vobsub.c | |
parent | 5eaf53d925ebb63188e0fb79928326f9cc50ab62 (diff) | |
download | mpv-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.c | 39 |
1 files changed, 32 insertions, 7 deletions
@@ -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); |