[vlc-devel] [PATCH] Detecting language of subtitles using its filename
Walter Cacau
waltercacau at gmail.com
Sat Feb 2 14:33:59 CET 2013
Well, I took some more time looking around the VLC source and then changed
a little bit the code which uses the input to do reference counting and
locking (actually I am relying on the access functions for doing the
latter). Bellow is the modified version.
---
modules/demux/subtitle.c | 68
++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
diff --git a/modules/demux/subtitle.c b/modules/demux/subtitle.c
index aa1c7e6..464f4e8 100644
--- a/modules/demux/subtitle.c
+++ b/modules/demux/subtitle.c
@@ -35,6 +35,7 @@
#include <vlc_plugin.h>
#include <vlc_input.h>
#include <vlc_memory.h>
+#include <vlc_url.h>
#include <ctype.h>
@@ -223,6 +224,7 @@ static int Demux( demux_t * );
static int Control( demux_t *, int, va_list );
static void Fix( demux_t * );
+static char * get_language_from_filename( const char *, const char * );
/*****************************************************************************
* Module initializer
@@ -529,6 +531,30 @@ static int Open ( vlc_object_t *p_this )
}
else
es_format_Init( &fmt, SPU_ES, VLC_CODEC_SUBT );
+
+ /* Detecting subtitle language using its filename */
+ {
+ input_thread_t * p_input = demux_GetParentInput(p_demux);
+ char * psz_video_url = input_item_GetURI(input_GetItem(p_input));
+ vlc_object_release(p_input);
+
+ if ( psz_video_url )
+ {
+ char * psz_language = get_language_from_filename(
+ p_demux->psz_location,
+ psz_video_url
+
+ );
+ if( psz_language )
+ {
+ fmt.psz_language = psz_language;
+ msg_Dbg( p_demux, "detected language %s of subtitle: %s",
+ psz_language, p_demux->psz_location );
+ }
+ free(psz_video_url);
+ }
+ }
+
if( unicode )
fmt.subs.psz_encoding = strdup( "UTF-8" );
char *psz_description = var_InheritString( p_demux, "sub-description"
);
@@ -2079,3 +2105,45 @@ static int ParseSubViewer1( demux_t *p_demux,
subtitle_t *p_subtitle, int i_idx
return VLC_SUCCESS;
}
+static char * get_language_from_filename( const char * psz_sub_location,
+ const char * psz_video_url )
+{
+ char * psz_ret = NULL;
+ char * psz_video_file = NULL;
+ char * psz_sub_file = NULL;
+ char * psz_tmp;
+ char * psz_sub_suffix;
+ char * ps_language_end;
+
+ psz_video_file = strrchr( psz_video_url, '/' );
+ if( !psz_video_file ) goto end;
+ psz_video_file++;
+ psz_video_file = decode_URI_duplicate(psz_video_file);
+ if( !psz_video_file ) goto end;
+
+ psz_sub_file = strrchr( psz_sub_location, '/' );
+ if( !psz_sub_file ) goto end;
+ psz_sub_file++;
+ psz_sub_file = decode_URI_duplicate(psz_sub_file);
+ if( !psz_video_file ) goto end;
+
+ /* Removing extension, but leaving the dot */
+ psz_tmp = strrchr( psz_video_file, '.' );
+ if( !psz_tmp ) goto end;
+ psz_tmp[1] = '\0';
+
+ /* Extracting sub file prefix */
+ if( strstr(psz_sub_file, psz_video_file) != psz_sub_file ) goto end;
+ psz_sub_suffix = psz_sub_file + strlen(psz_video_file);
+
+ ps_language_end = strrchr( psz_sub_suffix, '.' );
+ if( !ps_language_end ) goto end;
+ *ps_language_end = '\0';
+
+ psz_ret = strdup(psz_sub_suffix);
+
+end:
+ FREENULL(psz_video_file);
+ FREENULL(psz_sub_file);
+ return psz_ret;
+}
--
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20130202/c83a7158/attachment.html>
More information about the vlc-devel
mailing list