add dvb_support gb2312 and ucs2.
This commit is contained in:
parent
ec4e2cff14
commit
a0a102acdc
1 changed files with 77 additions and 4 deletions
81
src/input/mpegts/dvb_support.c
Normal file → Executable file
81
src/input/mpegts/dvb_support.c
Normal file → Executable 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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue