summaryrefslogtreecommitdiffstats
path: root/subreader.c
diff options
context:
space:
mode:
authoratlka <atlka@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-10-10 13:07:42 +0000
committeratlka <atlka@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-10-10 13:07:42 +0000
commit0a5c47a028ec53413f55781b99fcc67fca764aa1 (patch)
tree5acecd782c186adf00fa28ec54c125ffcb8df60d /subreader.c
parent8137a7a4b2802bd244cf523f50f12d1154bbe89b (diff)
downloadmpv-0a5c47a028ec53413f55781b99fcc67fca764aa1.tar.bz2
mpv-0a5c47a028ec53413f55781b99fcc67fca764aa1.tar.xz
modifications to use iconv(3) function to recode text of subs (autodetect)
added option -subcp <cpname> # for example cp1250, latin2 etc. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2152 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'subreader.c')
-rw-r--r--subreader.c87
1 files changed, 86 insertions, 1 deletions
diff --git a/subreader.c b/subreader.c
index 12a7d4bebd..eefbecab90 100644
--- a/subreader.c
+++ b/subreader.c
@@ -12,10 +12,15 @@
#include <string.h>
#include <ctype.h>
+#include "config.h"
#include "subreader.h"
#define ERR (void *)-1
+#ifdef USE_ICONV
+#include <iconv.h>
+char *sub_cp=NULL;
+#endif
int sub_uses_time=0;
int sub_errs=0;
@@ -399,7 +404,73 @@ int sub_autodetect (FILE *fd) {
return -1; // too many bad lines
}
+
+extern int sub_utf8;
+#ifdef USE_ICONV
+static iconv_t icdsc;
+
+void subcp_open (void)
+{
+ char *tocp = "UTF-8";
+ icdsc = (iconv_t)(-1);
+ if (sub_cp){
+ if ((icdsc = iconv_open (tocp, sub_cp)) != (iconv_t)(-1)){
+ printf ("SUB: opened iconv descriptor.\n");
+ sub_utf8 = 2;
+ } else
+ printf ("SUB: error opening iconv descriptor.\n");
+ }
+}
+
+void subcp_close (void)
+{
+ if (icdsc != (iconv_t)(-1)){
+ (void) iconv_close (icdsc);
+ printf ("SUB: closed iconv descriptor.\n");
+ }
+}
+
+#define ICBUFFSIZE 512
+static char icbuffer[ICBUFFSIZE];
+
+subtitle* subcp_recode (subtitle *sub)
+{
+ int l=sub->lines;
+ size_t ileft, oleft, otlen;
+ char *op, *ip, *ot;
+
+ while (l){
+ op = icbuffer;
+ ip = sub->text[--l];
+ ileft = strlen(ip);
+ oleft = ICBUFFSIZE - 1;
+
+ if (iconv(icdsc, (const char **) &ip, &ileft,
+ &op, &oleft) == (size_t)(-1)) {
+ printf ("SUB: error recoding line.\n");
+ l++;
+ break;
+ }
+ if (!(ot = (char *)malloc(op - icbuffer + 1))){
+ printf ("SUB: error allocating mem.\n");
+ l++;
+ break;
+ }
+ *op='\0' ;
+ strcpy (ot, icbuffer);
+ free (sub->text[l]);
+ sub->text[l] = ot;
+ }
+ if (l){
+ for (l = sub->lines; l;)
+ free (sub->text[--l]);
+ return ERR;
+ }
+ return sub;
+}
+
+#endif
subtitle* sub_read_file (char *filename) {
FILE *fd;
@@ -425,6 +496,10 @@ subtitle* sub_read_file (char *filename) {
rewind (fd);
+#ifdef USE_ICONV
+ subcp_open();
+#endif
+
sub_num=0;n_max=32;
first=(subtitle *)malloc(n_max*sizeof(subtitle));
if(!first) return NULL;
@@ -437,11 +512,18 @@ subtitle* sub_read_file (char *filename) {
}
sub=func[sub_format](fd,&first[sub_num]);
if(!sub) break; // EOF
+#ifdef USE_ICONV
+ if ((sub!=ERR) && (sub_utf8 & 2)) sub=subcp_recode(sub);
+#endif
if(sub==ERR) ++sub_errs; else ++sub_num; // Error vs. Valid
}
fclose(fd);
+#ifdef USE_ICONV
+ subcp_close();
+#endif
+
// printf ("SUB: Subtitle format %s time.\n", sub_uses_time?"uses":"doesn't use");
printf ("SUB: Read %i subtitles", sub_num);
if (sub_errs) printf (", %i bad line(s).\n", sub_errs);
@@ -465,7 +547,6 @@ char * strreplace( char * in,char * what,char * whereof )
char * sub_filename(char* path, char * fname )
{
- extern int sub_utf8;
char * sub_name1;
char * sub_name2;
char * aviptr1, * aviptr2, * tmp;
@@ -509,7 +590,11 @@ char * sub_filename(char* path, char * fname )
for(j=0;j<=1;j++){
char* sub_name=j?sub_name1:sub_name2;
+#ifdef USE_ICONV
+ for ( i=(sub_cp?2:0);i<(sizeof(sub_exts)/sizeof(char*));i++ ) {
+#else
for ( i=0;i<(sizeof(sub_exts)/sizeof(char*));i++ ) {
+#endif
strcpy(j?aviptr1:aviptr2,sub_exts[i]);
// printf("trying: '%s'\n",sub_name);
if((f=fopen( sub_name,"rt" ))) {