add dvb_support gb2312 and ucs2.

This commit is contained in:
sangood 2014-07-21 13:16:37 +08:00 committed by Jaroslav Kysela
parent ec4e2cff14
commit a0a102acdc

81
src/input/mpegts/dvb_support.c Normal file → Executable file
View file

@ -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
}
}