[PATCH] Replace hacky vobsub loading with a new clean one.

Clément Bœsch ubitux at gmail.com
Mon Jan 10 23:59:37 CET 2011


---
 mencoder.c      |    1 +
 mplayer.c       |   27 +--------------------------
 sub/sub.h       |    1 +
 sub/subreader.c |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 sub/subreader.h |    1 +
 5 files changed, 50 insertions(+), 26 deletions(-)

diff --git a/mencoder.c b/mencoder.c
index 6efe907..58c3848 100644
--- a/mencoder.c
+++ b/mencoder.c
@@ -182,6 +182,7 @@ char **sub_name=NULL;
 float sub_delay=0;
 float sub_fps=0;
 int   sub_auto = 0;
+char *vobsub_name = NULL;
 int   subcc_enabled=0;
 int   suboverlap_enabled = 1;
 
diff --git a/mplayer.c b/mplayer.c
index 67de2b3..1ebd517 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -3134,34 +3134,9 @@ while (player_idle_mode && !filename) {
 //==================== Open VOB-Sub ============================
 
     current_module="vobsub";
-    if (vobsub_name){
-      vo_vobsub=vobsub_open(vobsub_name,spudec_ifo,1,&vo_spudec);
-      if(vo_vobsub==NULL)
+    if (load_vob_subtitle(&vo_vobsub, filename, spudec_ifo, &vo_spudec) < 0)
         mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadSub,
 		filename_recode(vobsub_name));
-    } else if (sub_auto && filename){
-      /* try to autodetect vobsub from movie filename ::atmos */
-      char *buf = strdup(filename), *psub;
-      char *pdot = strrchr(buf, '.');
-      char *pslash = strrchr(buf, '/');
-#if defined(__MINGW32__) || defined(__CYGWIN__)
-      if (!pslash) pslash = strrchr(buf, '\\');
-#endif
-      if (pdot && (!pslash || pdot > pslash))
-        *pdot = '\0';
-      vo_vobsub=vobsub_open(buf,spudec_ifo,0,&vo_spudec);
-      /* try from ~/.mplayer/sub */
-      if(!vo_vobsub && (psub = get_path( "sub/" ))) {
-          const char *bname = mp_basename(buf);
-          int l;
-          l = strlen(psub) + strlen(bname) + 1;
-          psub = realloc(psub,l);
-          strcat(psub,bname);
-          vo_vobsub=vobsub_open(psub,spudec_ifo,0,&vo_spudec);
-          free(psub);
-      }
-      free(buf);
-    }
     if(vo_vobsub){
       initialized_flags|=INITIALIZED_VOBSUB;
       vobsub_set_from_lang(vo_vobsub, dvdsub_lang);
diff --git a/sub/sub.h b/sub/sub.h
index 744f8a5..c6021b0 100644
--- a/sub/sub.h
+++ b/sub/sub.h
@@ -86,6 +86,7 @@ extern mp_osd_obj_t *vo_osd_list;
 
 extern void* vo_spudec;
 extern void* vo_vobsub;
+extern char *vobsub_name;
 
 #define OSD_PLAY 0x01
 #define OSD_PAUSE 0x02
diff --git a/sub/subreader.c b/sub/subreader.c
index 5542002..58e98df 100644
--- a/sub/subreader.c
+++ b/sub/subreader.c
@@ -37,6 +37,7 @@
 #include "subreader.h"
 #include "subassconvert.h"
 #include "sub.h"
+#include "vobsub.h"
 #include "stream/stream.h"
 #include "libavutil/common.h"
 #include "libavutil/avstring.h"
@@ -2100,6 +2101,51 @@ void load_subtitles(const char *fname, int fps, void add_f(char *, float, int))
     free(slist.subs);
 }
 
+/**
+ * @brief Load VOB subtitle matching the subtitle filename.
+ *
+ * @vob vobsub instance.
+ * @param fname Path to subtitle filename.
+ * @param ifo Path to .ifo file.
+ * @spu SPU decoder instance.
+ */
+int load_vob_subtitle(void **vob, const char *fname, const char * const ifo, void **spu)
+{
+    char *name, *mp_subdir;
+
+    // Load subtitles specified by vobsub option
+    if (vobsub_name) {
+        *vob = vobsub_open(vobsub_name, ifo, 1, spu);
+        return *vob ? 0 : -1;
+    }
+
+    // Stop here if automatic detection disabled
+    if (!sub_auto || !fname)
+        return 0;
+
+    // Get only the name of the subtitle file and try to open it
+    name = malloc(strlen(fname) + 1);
+    if (!name)
+        return -1;
+    strcpy_strip_ext(name, fname);
+    *vob = vobsub_open(name, ifo, 0, spu);
+    if (*vob) {
+        free(name);
+        return 0;
+    }
+
+    // If still no VOB found, try loading it from ~/.mplayer/sub
+    mp_subdir = get_path("sub/");
+    if (mp_subdir) {
+        char *psub = mp_path_join(mp_subdir, mp_basename(name));
+        *vob = vobsub_open(psub, ifo, 0, spu);
+        free(psub);
+    }
+    free(mp_subdir);
+    free(name);
+    return 0;
+}
+
 void list_sub_file(sub_data* subd){
     int i,j;
     subtitle *subs = subd->subtitles;
diff --git a/sub/subreader.h b/sub/subreader.h
index dd08a22..31d4216 100644
--- a/sub/subreader.h
+++ b/sub/subreader.h
@@ -95,6 +95,7 @@ const char* guess_buffer_cp(unsigned char* buffer, int buflen, const char *prefe
 const char* guess_cp(struct stream *st, const char *preferred_language, const char *fallback);
 #endif
 void load_subtitles(const char *fname, int fps, void add_f(char *, float, int));
+int load_vob_subtitle(void **vob, const char *fname, const char * const spudec_ifo, void **spu);
 void list_sub_file(sub_data* subd);
 void dump_srt(sub_data* subd, float fps);
 void dump_mpsub(sub_data* subd, float fps);
-- 
1.7.3.5


--B4IIlcmfBL/1gGOG--


More information about the MPlayer-dev-eng mailing list