changeset 2151:a9d91476085a

modifications to use iconv(3) function to recode text of subs (autodetect) added option -subcp <cpname> # for example cp1250, latin2 etc.
author atlka
date Wed, 10 Oct 2001 13:07:42 +0000
parents 93e0ed86705e
children 5c80d1b16523
files cfg-mplayer.h configure subreader.c
diffstat 3 files changed, 145 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/cfg-mplayer.h	Wed Oct 10 01:49:41 2001 +0000
+++ b/cfg-mplayer.h	Wed Oct 10 13:07:42 2001 +0000
@@ -37,6 +37,9 @@
 #ifdef USE_SUB
 extern int sub_unicode;
 extern int sub_utf8;
+#ifdef USE_ICONV
+extern char *sub_cp;
+#endif
 #endif
 
 #ifdef USE_OSD
@@ -119,6 +122,9 @@
 	{"encode", &encode_name, CONF_TYPE_STRING, 0, 0, 0},
 #ifdef USE_SUB
 	{"sub", &sub_name, CONF_TYPE_STRING, 0, 0, 0},
+#ifdef USE_ICONV
+	{"subcp", &sub_cp, CONF_TYPE_STRING, 0, 0, 0},
+#endif	
 	{"subdelay", &sub_delay, CONF_TYPE_FLOAT, 0, 0.0, 10.0},
 	{"subfps", &sub_fps, CONF_TYPE_FLOAT, 0, 0.0, 10.0},
         {"noautosub", &sub_auto, CONF_TYPE_FLAG, 0, 1, 0},
--- a/configure	Wed Oct 10 01:49:41 2001 +0000
+++ b/configure	Wed Oct 10 13:07:42 2001 +0000
@@ -160,6 +160,7 @@
 	--enable-xmmp	        use XMMP audio drivers
 	--enable-lirc	        enable LIRC (remote control) support
 
+	--disable-iconv		do not use iconv(3) function [autodetect]	
         --disable-ossaudio      disable OSS sound support [autodetect]
         --disable-alsa          disable alsa sound support [autodetect]
 	--disable-esd           disable esd sound support [autodetect]
@@ -903,6 +904,42 @@
 fi
 
 cat > $TMPC << EOF
+#include <stdio.h>
+#include <unistd.h>
+#include <iconv.h>
+
+#define INBUFSIZE 1024
+#define OUTBUFSIZE 4096
+
+char inbuffer[INBUFSIZE];
+char outbuffer[OUTBUFSIZE];
+
+main()
+{       ssize_t numread;
+        iconv_t icdsc;
+        char *tocode="UTF-8";
+        char *fromcode="cp1250";
+        if ((icdsc = iconv_open (tocode, fromcode)) != (iconv_t)(-1)){
+                while ((numread = read (0, inbuffer, INBUFSIZE))){
+                        char *iptr=inbuffer;
+                        char *optr=outbuffer;
+                        size_t inleft=numread;
+                        size_t outleft=OUTBUFSIZE;
+                        if (iconv (icdsc, 
+		(const char **)&iptr, &inleft, &optr, &outleft)
+                            !=(size_t)(-1)){
+                                write (1, outbuffer, OUTBUFSIZE - outleft);
+                        }
+                }
+                if (iconv_close (icdsc) == -1) ;
+        }
+}
+
+EOF
+_iconv=yes
+$_cc $TMPC -o $TMPO -lm > /dev/null 2>&1 || \
+ { _iconv=no ; echo "iconv(3) function not detected!" ;}
+cat > $TMPC << EOF
 #include <GL/gl.h>
 int main( void ) { return 0; }
 EOF
@@ -1216,6 +1253,9 @@
   --enable-fbdev)
   	_fbdev=yes
 	;;
+  --enable-iconv)
+  	_iconv=yes
+	;;
   --enable-mlib)
 	_mlib=yes
 	;;
@@ -1326,6 +1366,9 @@
   --disable-fbdev)
   	_fbdev=no
 	;;
+  --disable-iconv)
+  	_iconv=no
+	;;
   --disable-termcap)
 	_termcap=no
 	;;
@@ -1585,6 +1628,7 @@
 echo "Checking for OggVorbis support ... $_vorbis"
 echo "Checking for Win32 DLL support ... $_win32dll"
 echo "Checking for DirectShow ... $_dshow"
+echo "Checking for iconv function ... $_iconv"
 
 # check if compiler supports C++ and C++-libs are installed correctly
 if [ $_win32dll = yes -a $_dshow = yes ] ; then
@@ -1844,6 +1888,12 @@
  _xmmpaudio='#undef USE_XMMP_AUDIO'
 fi
 
+if [ "$_iconv" = "yes" ]; then
+_iconv='#define USE_ICONV'
+else
+_iconv='#undef USE_ICONV'
+fi
+
 if [ "$_lirc" = "yes" ]; then
  _lircdefs='#define HAVE_LIRC'
  _lirclibs='-llirc_client'
@@ -2279,6 +2329,9 @@
    try to recompile MPlayer with this option disabled! */
 $_select
 
+/* define this to use iconv(3) function to codepage conversions */
+$_iconv
+
 /* XMMP support: (test code) */
 $_xmmpaudio
 #define LIBDIR "/usr/local/lib"
--- a/subreader.c	Wed Oct 10 01:49:41 2001 +0000
+++ b/subreader.c	Wed Oct 10 13:07:42 2001 +0000
@@ -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 @@
 
     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 @@
     
     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 @@
         }
         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 * sub_filename(char* path,  char * fname )
 {
- extern int sub_utf8;
  char * sub_name1;
  char * sub_name2;
  char * aviptr1, * aviptr2, * tmp;
@@ -509,7 +590,11 @@
  
  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" ))) {