From a0a102acdcea8f031884bde12db604746a4072b1 Mon Sep 17 00:00:00 2001 From: sangood Date: Mon, 21 Jul 2014 13:16:37 +0800 Subject: [PATCH] add dvb_support gb2312 and ucs2. --- src/input/mpegts/dvb_support.c | 81 ++++++++++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 4 deletions(-) mode change 100644 => 100755 src/input/mpegts/dvb_support.c diff --git a/src/input/mpegts/dvb_support.c b/src/input/mpegts/dvb_support.c old mode 100644 new mode 100755 index eabfae2e..c611c271 --- a/src/input/mpegts/dvb_support.c +++ b/src/input/mpegts/dvb_support.c @@ -25,7 +25,7 @@ #include #include #include - +#include #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 } }