changeset 32724:732cd2afae10

Replace hacky vobsub loading with a new clean one.
author cboesch
date Sun, 23 Jan 2011 13:04:15 +0000
parents 5310794ef052
children 4802a80f7a50
files mencoder.c mplayer.c sub/sub.h sub/subreader.c sub/subreader.h
diffstat 5 files changed, 68 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/mencoder.c	Fri Jan 21 15:33:12 2011 +0000
+++ b/mencoder.c	Sun Jan 23 13:04:15 2011 +0000
@@ -182,6 +182,7 @@
 float sub_delay=0;
 float sub_fps=0;
 int   sub_auto = 0;
+char *vobsub_name = NULL;
 int   subcc_enabled=0;
 int   suboverlap_enabled = 1;
 
--- a/mplayer.c	Fri Jan 21 15:33:12 2011 +0000
+++ b/mplayer.c	Sun Jan 23 13:04:15 2011 +0000
@@ -30,6 +30,7 @@
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
+#include <assert.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/types.h>
@@ -1079,6 +1080,22 @@
 	    filename_recode(filename));
 }
 
+static int add_vob_subtitle(const char *vobname, const char * const ifo, int force, void *spu)
+{
+    if (!vobname)
+        return 0;
+
+    assert(!vo_vobsub);
+
+    vo_vobsub = vobsub_open(vobname, ifo, force, spu);
+
+    if (!vo_vobsub && force)
+        mp_msg(MSGT_CPLAYER, MSGL_ERR, MSGTR_CantLoadSub,
+               filename_recode(vobname));
+
+    return !!vo_vobsub;
+}
+
 // FIXME: if/when the GUI calls this, global sub numbering gets (potentially) broken.
 void update_set_of_subtitles(void)
     // subdata was changed, set_of_sub... have to be updated.
@@ -3134,34 +3151,7 @@
 //==================== Open VOB-Sub ============================
 
     current_module="vobsub";
-    if (vobsub_name){
-      vo_vobsub=vobsub_open(vobsub_name,spudec_ifo,1,&vo_spudec);
-      if(vo_vobsub==NULL)
-        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);
-    }
+    load_vob_subtitle(filename, spudec_ifo, &vo_spudec, add_vob_subtitle);
     if(vo_vobsub){
       initialized_flags|=INITIALIZED_VOBSUB;
       vobsub_set_from_lang(vo_vobsub, dvdsub_lang);
--- a/sub/sub.h	Fri Jan 21 15:33:12 2011 +0000
+++ b/sub/sub.h	Sun Jan 23 13:04:15 2011 +0000
@@ -86,6 +86,7 @@
 
 extern void* vo_spudec;
 extern void* vo_vobsub;
+extern char *vobsub_name;
 
 #define OSD_PLAY 0x01
 #define OSD_PAUSE 0x02
--- a/sub/subreader.c	Fri Jan 21 15:33:12 2011 +0000
+++ b/sub/subreader.c	Sun Jan 23 13:04:15 2011 +0000
@@ -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,50 @@
     free(slist.subs);
 }
 
+/**
+ * @brief Load VOB subtitle matching the subtitle filename.
+ *
+ * @param fname Path to subtitle filename.
+ * @param ifo Path to .ifo file.
+ * @spu SPU decoder instance.
+ * @add_f Function called when adding a vobsub.
+ */
+void load_vob_subtitle(const char *fname, const char * const ifo, void **spu,
+                       open_vob_func add_f)
+{
+    char *name, *mp_subdir;
+
+    // Load subtitles specified by vobsub option
+    if (vobsub_name) {
+        add_f(vobsub_name, ifo, 1, spu);
+        return;
+    }
+
+    // Stop here if automatic detection disabled
+    if (!sub_auto || !fname)
+        return;
+
+    // Get only the name of the subtitle file and try to open it
+    name = malloc(strlen(fname) + 1);
+    if (!name)
+        return;
+    strcpy_strip_ext(name, fname);
+    if (add_f(name, ifo, 0, spu)) {
+        free(name);
+        return;
+    }
+
+    // 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));
+        add_f(psub, ifo, 0, spu);
+        free(psub);
+    }
+    free(mp_subdir);
+    free(name);
+}
+
 void list_sub_file(sub_data* subd){
     int i,j;
     subtitle *subs = subd->subtitles;
--- a/sub/subreader.h	Fri Jan 21 15:33:12 2011 +0000
+++ b/sub/subreader.h	Sun Jan 23 13:04:15 2011 +0000
@@ -83,6 +83,8 @@
 extern int flip_hebrew;
 extern int fribidi_flip_commas;
 
+typedef int (*open_vob_func)(const char *, const char * const, int, void *);
+
 sub_data* sub_read_file (char *filename, float pts);
 subtitle* subcp_recode (subtitle *sub);
 // enca_fd is the file enca uses to determine the codepage.
@@ -95,6 +97,7 @@
 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));
+void load_vob_subtitle(const char *fname, const char * const spudec_ifo, void **spu, open_vob_func add_f);
 void list_sub_file(sub_data* subd);
 void dump_srt(sub_data* subd, float fps);
 void dump_mpsub(sub_data* subd, float fps);