]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
add dvb_support gb2312 and ucs2.
authorsangood <sangood@macmini.lan>
Mon, 21 Jul 2014 05:16:37 +0000 (13:16 +0800)
committerJaroslav Kysela <perex@perex.cz>
Mon, 4 Aug 2014 17:03:57 +0000 (19:03 +0200)
src/input/mpegts/dvb_support.c [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index eabfae2..c611c27
@@ -25,7 +25,7 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
-
+#include <iconv.h>
 #include "tvheadend.h"
 #include "dvb.h"
 #include "dvb_charset_tables.h"
@@ -36,6 +36,37 @@ static int convert_iso_8859[16] = {
 };
 #define convert_utf8   14
 #define convert_iso6937 15
+//-------------begin---add
+#define convert_ucs2 16
+#define convert_gb   17
+static inline int code_convert(const char *from_charset,const char *to_charset,char *inbuf,size_t inlen,char *outbuf,size_t *outlen)
+{
+    iconv_t cd;
+    
+    char **pin = &inbuf;
+    char **pout = &outbuf;
+    
+    cd = iconv_open(to_charset,from_charset);
+    if (cd==0) return -1;
+    memset(outbuf,0,*outlen);
+    if (iconv(cd,pin,&inlen,pout,outlen)==-1) return -1;
+    iconv_close(cd);
+    return 0;
+}
+static inline int gb2u(char *inbuf,int inlen,char *outbuf,size_t *outlen)
+{
+    return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
+}
+//GB2312-->utf-8
+static inline size_t conv_gb(const uint8_t *src, size_t srclen,
+                             char *dst, size_t *dstlen)
+{
+    size_t len=*dstlen;
+    gb2u((char *)src,srclen,dst,dstlen);
+    dst+=len-*dstlen;
+    return 0;
+}
+//----------end----add
 
 static inline int encode_utf8(unsigned int c, char *outb, int outleft)
 {
@@ -61,6 +92,32 @@ static inline int encode_utf8(unsigned int c, char *outb, int outleft)
     return -1;
   }
 }
+//begin--add
+static inline size_t conv_UCS2(const uint8_t *src, size_t srclen,
+                               char *dst, size_t *dstlen)
+{
+       
+       while (srclen>0 && (*dstlen)>0)
+       {
+               uint16_t uc = *src<<8|*(src+1);
+               int len = encode_utf8(uc, dst, *dstlen);
+               if (len == -1) {
+            errno = E2BIG;
+            return -1;
+               } else {
+            (*dstlen) -= len;
+            dst += len;
+               }
+               srclen-=2;
+        src+=2;
+    }
+    if (srclen>0) {
+           errno = E2BIG;
+           return -1;
+    }
+    return 0;
+}
+//end-add
 
 static inline size_t conv_utf8(const uint8_t *src, size_t srclen,
                               char *dst, size_t *dstlen)
@@ -182,6 +239,8 @@ static inline size_t dvb_convert(int conv,
   switch (conv) {
     case convert_utf8: return conv_utf8(src, srclen, dst, dstlen);
     case convert_iso6937: return conv_6937(src, srclen, dst, dstlen);
+    case convert_gb: return conv_gb(src,srclen,dst,dstlen);    //add gb2312-->utf8 convert
+    case convert_ucs2:return conv_UCS2(src,srclen,dst,dstlen); //add usc2-->utf8 convert
     default: return conv_8859(conv, src, srclen, dst, dstlen);
   }
 }
@@ -242,9 +301,20 @@ dvb_get_string
     src+=3; srclen-=3;
     break;
     
-  case 0x11 ... 0x14:
+          //add being
+  case 0x11:
+    ic =convert_ucs2;
+    src++; srclen--;
+    break;
+  case 0x13:
+    ic =convert_gb;
+    src++; srclen--;
+    break;
+  case 0x12:
+  case 0x14:
     return -1;
-
+          //add end
+          
   case 0x15:
     ic = convert_utf8;
     break;
@@ -255,7 +325,8 @@ dvb_get_string
     if (auto_pl_charset)
       ic = convert_iso_8859[2];
     else
-      ic = convert_iso6937;
+      ic=convert_gb;//add
+      //ic = convert_iso6937;
     break;
   }
 
@@ -269,6 +340,8 @@ dvb_get_string
       ic = convert_iso6937;
     } else if (!strcmp(dvb_charset, "UTF-8")) {
       ic = convert_utf8;
+    }else{
+        ic= convert_gb;//add
     }
   }