character code tables 0..11 added, (ISO/IEC 8859-5..15)

This commit is contained in:
mvoelkel 2019-08-10 23:46:02 +02:00
parent 5e9b9f9689
commit 4f252ccb48
1 changed files with 306 additions and 146 deletions

View File

@ -1,18 +1,18 @@
/* /*
(C) 2015-16 Digital Devices GmbH. (C) 2015-16 Digital Devices GmbH.
Octoscan is free software: you can redistribute it and/or modify Octoscan is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
Octoscan is distributed in the hope that it will be useful, Octoscan is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with octoserve. If not, see <http://www.gnu.org/licenses/>. along with octoserve. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <stdlib.h> #include <stdlib.h>
@ -119,8 +119,8 @@ struct pid_info {
int add_ext; int add_ext;
int done; int done;
uint8_t used; uint8_t used;
uint8_t cc; uint8_t cc;
uint16_t bufp; uint16_t bufp;
uint16_t len; uint16_t len;
uint8_t *buf; uint8_t *buf;
@ -147,7 +147,7 @@ struct ts_info {
time_t timeout; time_t timeout;
int done; int done;
struct pid_info pidi[0x2000]; struct pid_info pidi[0x2000];
}; };
#define MAX_ANUM 32 #define MAX_ANUM 32
@ -589,40 +589,40 @@ void add_fd(int fd, int *mfd, fd_set *fds)
static inline uint16_t seclen(const uint8_t *buf) static inline uint16_t seclen(const uint8_t *buf)
{ {
return 3+((buf[1]&0x0f)<<8)+buf[2]; return 3+((buf[1]&0x0f)<<8)+buf[2];
} }
static inline uint16_t tspid(const uint8_t *buf) static inline uint16_t tspid(const uint8_t *buf)
{ {
return ((buf[1]&0x1f)<<8)+buf[2]; return ((buf[1]&0x1f)<<8)+buf[2];
} }
static inline int tspayload(const uint8_t *tsp) static inline int tspayload(const uint8_t *tsp)
{ {
if (!(tsp[3] & 0x10)) if (!(tsp[3] & 0x10))
return 0; return 0;
if (tsp[3] & 0x20) { if (tsp[3] & 0x20) {
if (tsp[4] > 183) if (tsp[4] > 183)
return 0; return 0;
else else
return 183 - tsp[4]; return 183 - tsp[4];
} }
return 184; return 184;
} }
static inline int static inline int
tspaystart(const uint8_t *tsp) tspaystart(const uint8_t *tsp)
{ {
if (!(tsp[3]&0x10)) if (!(tsp[3]&0x10))
return 188; return 188;
if (tsp[3]&0x20) { if (tsp[3]&0x20) {
if (tsp[4]>=184) if (tsp[4]>=184)
return 188; return 188;
else else
return tsp[4]+5; return tsp[4]+5;
} }
return 4; return 4;
} }
/****************************************************************************/ /****************************************************************************/
@ -677,7 +677,7 @@ uint32_t dvb_crc32(uint8_t *data, int len)
uint32_t crc=0xffffffff; uint32_t crc=0xffffffff;
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
crc = (crc << 8) ^ dvb_crc_table[((crc >> 24) ^ *data++) & 0xff]; crc = (crc << 8) ^ dvb_crc_table[((crc >> 24) ^ *data++) & 0xff];
return crc; return crc;
} }
@ -841,33 +841,33 @@ static uint16_t get12(uint8_t *p)
static uint16_t get_pid(uint8_t *pid) static uint16_t get_pid(uint8_t *pid)
{ {
uint16_t pp; uint16_t pp;
pp = (pid[0] & 0x1f) << 8; pp = (pid[0] & 0x1f) << 8;
pp |= pid[1] &0xff; pp |= pid[1] &0xff;
return pp; return pp;
} }
static int get_desc(struct pid_info *p, uint8_t *buf, int length) static int get_desc(struct pid_info *p, uint8_t *buf, int length)
{ {
int dlength; int dlength;
int c=0; int c=0;
uint16_t casys; uint16_t casys;
uint16_t capid; uint16_t capid;
while (c < length) { while (c < length) {
dlength = buf[c+1]; dlength = buf[c+1];
switch(buf[c]){ switch(buf[c]){
case 0x02: case 0x02:
break; break;
case 0x03: case 0x03:
break; break;
case 0x09: case 0x09:
if (!dlength) if (!dlength)
break; break;
casys =(buf[c+2]<<8)|buf[c+3]; casys =(buf[c+2]<<8)|buf[c+3];
capid = get_pid(buf+c+4); capid = get_pid(buf+c+4);
break; break;
default: default:
break; break;
@ -948,7 +948,7 @@ static int pmt_cb(struct sfilter *sf)
if ((ilen = get12(buf + 10))) if ((ilen = get12(buf + 10)))
c += get_desc(p, buf + c, ilen); c += get_desc(p, buf + c, ilen);
if (c != 12 + ilen) if (c != 12 + ilen)
return 0; return 0;
s = get_service(p->tsi->stp->tpi, pnr); s = get_service(p->tsi->stp->tpi, pnr);
s->pcr = get_pid(buf + 8); s->pcr = get_pid(buf + 8);
s->anum = 0; s->anum = 0;
@ -1124,72 +1124,233 @@ static int pat_cb(struct sfilter *sf)
return 0; return 0;
} }
#define UTF8_CC_START 0xc2 #define CHARACTER_RESERVED_80 0x80
#define SB_CC_RESERVED_80 0x80 #define CHARACTER_RESERVED_81 0x81
#define SB_CC_RESERVED_81 0x81 #define CHARACTER_RESERVED_82 0x82
#define SB_CC_RESERVED_82 0x82 #define CHARACTER_RESERVED_83 0x83
#define SB_CC_RESERVED_83 0x83 #define CHARACTER_RESERVED_84 0x84
#define SB_CC_RESERVED_84 0x84 #define CHARACTER_RESERVED_85 0x85
#define SB_CC_RESERVED_85 0x85
#define CHARACTER_EMPHASIS_ON 0x86 #define CHARACTER_EMPHASIS_ON 0x86
#define CHARACTER_EMPHASIS_OFF 0x87 #define CHARACTER_EMPHASIS_OFF 0x87
#define SB_CC_RESERVED_88 0x88 #define CHARACTER_RESERVED_88 0x88
#define SB_CC_RESERVED_89 0x89 #define CHARACTER_RESERVED_89 0x89
#define CHARACTER_CR_LF 0x8a #define CHARACTER_CR_LF 0x8A
#define SB_CC_USER_8B 0x8b #define CHARACTER_USER_8B 0x8B
#define SB_CC_USER_9F 0x9f #define CHARACTER_USER_9F 0x9F
void en300468_parse_string_to_utf8(char *dest, uint8_t *src, uint16_t codetable_00[96] = {
const unsigned int len) 0x00A0,0x00A1,0x00A2,0x00A3, 0x20AC,0x00A5,0x0000,0x00A7, 0x00A4,0x2018,0x201C,0x00AB, 0x2190,0x2191,0x2192,0x2193,
0x00B0,0x00B1,0x00B2,0x00B3, 0x00B4,0x00B5,0x00B6,0x00B7, 0x00F7,0x2019,0x201D,0x00BB, 0x00BC,0x00BD,0x00BE,0x00BF,
0x0000,0x0300,0x0301,0x0302, 0x0303,0x0304,0x0306,0x0307, 0x0308,0x0000,0x030A,0x0327, 0x0000,0x030B,0x0328,0x030C,
0x2015,0x00B9,0x00AE,0x00A9, 0x2122,0x266A,0x00AC,0x00A6, 0x0000,0x0000,0x0000,0x0000, 0x215B,0x215C,0x215D,0x215E,
0x2126,0x00C6,0x0110,0x00AA, 0x0126,0x0000,0x0132,0x013F, 0x0141,0x00D8,0x0152,0x00BA, 0x00DE,0x0166,0x014A,0x0149,
0x0138,0x00E6,0x0111,0x00F0, 0x0127,0x0131,0x0133,0x0140, 0x0142,0x00F8,0x0153,0x00DF, 0x00FE,0x0167,0x014B,0x00AD,
};
uint16_t codetable_01[96] = {
0x00A0,0x0401,0x0402,0x0403, 0x0404,0x0405,0x0406,0x0407, 0x0408,0x0409,0x040A,0x040B, 0x040C,0x00AD,0x040E,0x040F,
0x0410,0x0411,0x0412,0x0413, 0x0414,0x0415,0x0416,0x0417, 0x0418,0x0419,0x041A,0x041B, 0x041C,0x041D,0x041E,0x041F,
0x0420,0x0421,0x0422,0x0423, 0x0424,0x0425,0x0426,0x0427, 0x0428,0x0429,0x042A,0x042B, 0x042C,0x042D,0x042E,0x042F,
0x0430,0x0431,0x0432,0x0433, 0x0434,0x0435,0x0436,0x0437, 0x0438,0x0439,0x043A,0x043B, 0x043C,0x043D,0x043E,0x043F,
0x0440,0x0441,0x0442,0x0443, 0x0444,0x0445,0x0446,0x0447, 0x0448,0x0449,0x044A,0x044B, 0x044C,0x044D,0x044E,0x044F,
0x2116,0x0451,0x0452,0x0453, 0x0454,0x0455,0x0456,0x0457, 0x0458,0x0459,0x045A,0x045B, 0x045C,0x00A7,0x045E,0x045F,
};
uint16_t codetable_02[96] = {
0x00A0,0x0000,0x0000,0x0000, 0x00A4,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, 0x060C,0x00AD,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x061B, 0x0000,0x0000,0x0000,0x061F,
0x0000,0x0621,0x0622,0x0623, 0x0624,0x0625,0x0626,0x0627, 0x0628,0x0629,0x062A,0x062B, 0x062C,0x062D,0x062E,0x062F,
0x0630,0x0631,0x0632,0x0633, 0x0634,0x0635,0x0636,0x0637, 0x0638,0x0639,0x063A,0x0000, 0x0000,0x0000,0x0000,0x0000,
0x0640,0x0641,0x0642,0x0643, 0x0644,0x0645,0x0646,0x0647, 0x0648,0x0649,0x064A,0x064B, 0x064C,0x064D,0x064E, 0x064F,
0x0650,0x0651,0x0652,0x0000, 0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,
};
uint16_t codetable_03[96] = {
0x00A0,0x2018,0x2019,0x00A3, 0x20AC,0x20AF,0x00A6,0x00A7, 0x00A8,0x00A9,0x037A,0x00AB, 0x00AC,0x00AD,0x0000,0x2015,
0x00B0,0x00B1,0x00B2,0x00B3, 0x0384,0x0385,0x0386,0x00B7, 0x0388,0x0389,0x038A,0x00BB, 0x038C,0x00BD,0x038E,0x038F,
0x0390,0x0391,0x0392,0x0393, 0x0394,0x0395,0x0396,0x0397, 0x0398,0x0399,0x039A,0x039B, 0x039C,0x039D,0x039E,0x039F,
0x03A0,0x03A1,0x0000,0x03A3, 0x03A4,0x03A5,0x03A6,0x03A7, 0x03A8,0x03A9,0x03AA,0x03AB, 0x03AC,0x03AD,0x03AE,0x03AF,
0x03B0,0x03B1,0x03B2,0x03B3, 0x03B4,0x03B5,0x03B6,0x03B7, 0x03B8,0x03B9,0x03BA,0x03BB, 0x03BC,0x03BD,0x03BE,0x03BF,
0x03C0,0x03C1,0x03C2,0x03C3, 0x03C4,0x03C5,0x03C6,0x03C7, 0x03C8,0x03C9,0x03CA,0x03CB, 0x03CC,0x03CD,0x03CE,0x0000,
};
uint16_t codetable_04[96] = {
0x00A0,0x0000,0x00A2,0x00A3, 0x00A4,0x00A5,0x00A6,0x00A7, 0x00A8,0x00A9,0x00D7,0x00AB, 0x00AC,0x00AD,0x00AE,0x00AF,
0x00B0,0x00B1,0x00B2,0x00B3, 0x00B4,0x00B5,0x00B6,0x00B7, 0x00B8,0x00B9,0x00F7,0x00BB, 0x00BC,0x00BD,0x00BE,0x0000,
0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x2017,
0x05D0,0x05D1,0x05D2,0x05D3, 0x05D4,0x05D5,0x05D6,0x05D7, 0x05D8,0x05D9,0x05DA,0x05DB, 0x05DC,0x05DD,0x05DE,0x05DF,
0x05E0,0x05E1,0x05E2,0x05E3, 0x05E4,0x05E5,0x05E6,0x05E7, 0x05E8,0x05E9,0x05EA,0x0000, 0x0000,0x200E,0x200F,0x0000,
};
uint16_t codetable_05[96] = {
0x00A0,0x00A1,0x00A2,0x00A3, 0x00A4,0x00A5,0x00A6,0x00A7, 0x00A8,0x00A9,0x00AA,0x00AB, 0x00AC,0x00AD,0x00AE,0x00AF,
0x00B0,0x00B1,0x00B2,0x00B3, 0x00B4,0x00B5,0x00B6,0x00B7, 0x00B8,0x00B9,0x00BA,0x00BB, 0x00BC,0x00BD,0x00BE,0x00BF,
0x00C0,0x00C1,0x00C2,0x00C3, 0x00C4,0x00C5,0x00C6,0x00C7, 0x00C8,0x00C9,0x00CA,0x00CB, 0x00CC,0x00CD,0x00CE,0x00CF,
0x011E,0x00D1,0x00D2,0x00D3, 0x00D4,0x00D5,0x00D6,0x00D7, 0x00D8,0x00D9,0x00DA,0x00DB, 0x00DC,0x0130,0x015E,0x00DF,
0x00E0,0x00E1,0x00E2,0x00E3, 0x00E4,0x00E5,0x00E6,0x00E7, 0x00E8,0x00E9,0x00EA,0x00EB, 0x00EC,0x00ED,0x00EE,0x00EF,
0x011F,0x00F1,0x00F2,0x00F3, 0x00F4,0x00F5,0x00F6,0x00F7, 0x00F8,0x00F9,0x00FA,0x00FB, 0x00FC,0x0131,0x015F,0x00FF,
};
uint16_t codetable_06[96] = {
0x00A0,0x0104,0x0112,0x0122, 0x012A,0x0128,0x0136,0x00A7, 0x013B,0x0110,0x0160,0x0166, 0x017D,0x00AD,0x016A,0x014A,
0x00B0,0x0105,0x0113,0x0123, 0x012B,0x0129,0x0137,0x00B7, 0x013C,0x0111,0x0161,0x0167, 0x017E,0x2015,0x016B,0x014B,
0x0100,0x00C1,0x00C2,0x00C3, 0x00C4,0x00C5,0x00C6,0x012E, 0x010C,0x00C9,0x0118,0x00CB, 0x0116,0x00CD,0x00CE,0x00CF,
0x00D0,0x0145,0x014C,0x00D3, 0x00D4,0x00D5,0x00D6,0x0168, 0x00D8,0x0172,0x00DA,0x00DB, 0x00DC,0x00DD,0x00DE,0x00DF,
0x0101,0x00E1,0x00E2,0x00E3, 0x00E4,0x00E5,0x00E6,0x012F, 0x010D,0x00E9,0x0119,0x00EB, 0x0117,0x00ED,0x00EE,0x00EF,
0x00F0,0x0146,0x014D,0x00F3, 0x00F4,0x00F5,0x00F6,0x0169, 0x00F8,0x0173,0x00FA,0x00FB, 0x00FC,0x00FD,0x00FE,0x0138,
};
uint16_t codetable_07[96] = {
0x00A0,0x0E01,0x0E02,0x0E03, 0x0E04,0x0E05,0x0E06,0x0E07, 0x0E08,0x0E09,0x0E0A,0x0E0B, 0x0E0C,0x0E0D,0x0E0E,0x0E0F,
0x0E10,0x0E11,0x0E12,0x0E13, 0x0E14,0x0E15,0x0E16,0x0E17, 0x0E18,0x0E19,0x0E1A,0x0E1B, 0x0E1C,0x0E1D,0x0E1E,0x0E1F,
0x0E20,0x0E21,0x0E22,0x0E23, 0x0E24,0x0E25,0x0E26,0x0E27, 0x0E28,0x0E29,0x0E2A,0x0E2B, 0x0E2C,0x0E2D,0x0E2E,0x0E2F,
0x0E30,0x0E31,0x0E32,0x0E33, 0x0E34,0x0E35,0x0E36,0x0E37, 0x0E38,0x0E39,0x0E3A,0x0000, 0x0000,0x0000,0x0000,0x0E3F,
0x0E40,0x0E41,0x0E42,0x0E43, 0x0E44,0x0E45,0x0E46,0x0E47, 0x0E48,0x0E49,0x0E4A,0x0E4B, 0x0E4C,0x0E4D,0x0E4E,0x0E4F,
0x0E50,0x0E51,0x0E52,0x0E53, 0x0E54,0x0E55,0x0E56,0x0E57, 0x0E58,0x0E59,0x0E5A,0x0E5B, 0x0000,0x0000,0x0000,0x0000,
};
uint16_t codetable_09[96] = {
0x00A0,0x201D,0x00A2,0x00A3, 0x00A4,0x201E,0x00A6,0x00A7, 0x00D8,0x00A9,0x0156,0x00AB, 0x00AC,0x00AD,0x00AE,0x00C6,
0x00B0,0x00B1,0x00B2,0x00B3, 0x201C,0x00B5,0x00B6,0x00B7, 0x00F8,0x00B9,0x0157,0x00BB, 0x00BC,0x00BD,0x00BE,0x00E6,
0x0104,0x012E,0x0100,0x0106, 0x00C4,0x00C5,0x0118,0x0112, 0x010C,0x00C9,0x0179,0x0116, 0x0122,0x0136,0x012A,0x013B,
0x0160,0x0143,0x0145,0x00D3, 0x014C,0x00D5,0x00D6,0x00D7, 0x0172,0x0141,0x015A,0x016A, 0x00DC,0x017B,0x017D,0x00DF,
0x0105,0x012F,0x0101,0x0107, 0x00E4,0x00E5,0x0119,0x0113, 0x010D,0x00E9,0x017A,0x0117, 0x0123,0x0137,0x012B,0x013C,
0x0161,0x0144,0x0146,0x00F3, 0x014D,0x00F5,0x00F6,0x00F7, 0x0173,0x0142,0x015B,0x016B, 0x00FC,0x017C,0x017E,0x2019,
};
uint16_t codetable_0A[96] = {
0x00A0,0x1E02,0x1E03,0x00A3, 0x010A,0x010B,0x1E0A,0x00A7, 0x1E80,0x00A9,0x1E82,0x1E0B, 0x1EF2,0x00AD,0x00AE,0x0178,
0x1E1E,0x1E1F,0x0120,0x0121, 0x1E40,0x1E41,0x00B6,0x1E56, 0x1E81,0x1E57,0x1E83,0x1E60, 0x1EF3,0x1E84,0x1E85,0x1E61,
0x00C0,0x00C1,0x00C2,0x00C3, 0x00C4,0x00C5,0x00C6,0x00C7, 0x00C8,0x00C9,0x00CA,0x00CB, 0x00CC,0x00CD,0x00CE,0x00CF,
0x0174,0x00D1,0x00D2,0x00D3, 0x00D4,0x00D5,0x00D6,0x1E6A, 0x00D8,0x00D9,0x00DA,0x00DB, 0x00DC,0x00DD,0x0176,0x00DF,
0x00E0,0x00E1,0x00E2,0x00E3, 0x00E4,0x00E5,0x00E6,0x00E7, 0x00E8,0x00E9,0x00EA,0x00EB, 0x00EC,0x00ED,0x00EE,0x00EF,
0x0175,0x00F1,0x00F2,0x00F3, 0x00F4,0x00F5,0x00F6,0x1E6B, 0x00F8,0x00F9,0x00FA,0x00FB, 0x00FC,0x00FD,0x0177,0x00FF,
};
uint16_t codetable_0B[96] = {
0x00A0,0x00A1,0x00A2,0x00A3, 0x20AC,0x00A5,0x0160,0x00A7, 0x0161,0x00A9,0x00AA,0x00AB, 0x00AC,0x00AD,0x00AE,0x00AF,
0x00B0,0x00B1,0x00B2,0x00B3, 0x017D,0x00B5,0x00B6,0x00B7, 0x017E,0x00B9,0x00BA,0x00BB, 0x0152,0x0153,0x0178,0x00BF,
0x00C0,0x00C1,0x00C2,0x00C3, 0x00C4,0x00C5,0x00C6,0x00C7, 0x00C8,0x00C9,0x00CA,0x00CB, 0x00CC,0x00CD,0x00CE,0x00CF,
0x00D0,0x00D1,0x00D2,0x00D3, 0x00D4,0x00D5,0x00D6,0x00D7, 0x00D8,0x00D9,0x00DA,0x00DB, 0x00DC,0x00DD,0x00DE,0x00DF,
0x00E0,0x00E1,0x00E2,0x00E3, 0x00E4,0x00E5,0x00E6,0x00E7, 0x00E8,0x00E9,0x00EA,0x00EB, 0x00EC,0x00ED,0x00EE,0x00EF,
0x00F0,0x00F1,0x00F2,0x00F3, 0x00F4,0x00F5,0x00F6,0x00F7, 0x00F8,0x00F9,0x00FA,0x00FB, 0x00FC,0x00FD,0x00FE,0x00FF,
};
uint16_t *codetable_LUT[12] = {
codetable_00,
codetable_01,
codetable_02,
codetable_03,
codetable_04,
codetable_05,
codetable_06,
codetable_07,
codetable_00,
codetable_09,
codetable_0A,
codetable_0B,
};
void en300468_parse_string_to_utf8(char *dest, const unsigned int destlen,
uint8_t *src, const unsigned int len)
{ {
int utf8 = (src[0] == 0x15) ? 1 : 0; uint16_t *codetable = codetable_00;
int skip = (src[0] < 0x20) ? 1 : 0; int encoding = 0;
if( src[0] == 0x10 ) skip += 2; int skip = 0; // (src[0] < 0x20) ? 1 : 0;
uint16_t utf8_cc; if( src[0] < 0x20 ) {
encoding = src[0];
if( encoding < 12 )
codetable = codetable_LUT[encoding];
skip = 1;
}
if( encoding == 0x1F ) {
skip = 2;
}
if( encoding == 0x10 ) {
if( src[1] == 0 ) {
codetable = codetable_0B;
if( src[1] == 0 && src[2] >= 5 && src[2] <= 15 ) {
codetable = codetable_LUT[src[2] - 4];
}
}
skip = 3;
}
uint32_t utf8_cc;
int dest_pos = 0; int dest_pos = 0;
int emphasis = 0; int emphasis = 0;
int i; int i;
for (i = skip; i < len; i++) { for (i = skip; i < len && dest_pos < destlen - 1; i++) {
switch(*(src + i)) { utf8_cc = *(src + i);
case SB_CC_RESERVED_80 ... SB_CC_RESERVED_85: if (utf8_cc >= 128 && encoding == 0x15 ) {
case SB_CC_RESERVED_88 ... SB_CC_RESERVED_89: if( (utf8_cc & 0xC0) == 0xC0 )
case SB_CC_USER_8B ... SB_CC_USER_9F: {
case CHARACTER_CR_LF: i++;
dest[dest_pos++] = '\n'; utf8_cc &= 0x3F;
continue; if( utf8_cc & 0x20 ) utf8_cc &= 0x1F;
case CHARACTER_EMPHASIS_ON: if( utf8_cc & 0x10 ) utf8_cc &= 0x0F;
emphasis = 1; if( utf8_cc & 0x08 ) utf8_cc &= 0x07;
continue; while( i < len && (*(src + i) & 0xC0) == 0x80 ) {
case CHARACTER_EMPHASIS_OFF: utf8_cc = (utf8_cc << 6) | (*(src + i) & 0x3F);
emphasis = 0; i++;
continue; }
case UTF8_CC_START: if( utf8_cc > 0x10FFFF )
if (utf8 == 1) { break; // UTF-8 error
utf8_cc = *(src + i) << 8; }
utf8_cc += *(src + i + 1); else
break; // UTF-8 error
} else {
if( encoding <= 0x10 && utf8_cc >= 0x80 && utf8_cc < 0xA0 )
utf8_cc |= 0x0100;
else if( utf8_cc >= 0xA0 ) {
utf8_cc = codetable[utf8_cc-0xA0];
}
}
switch(utf8_cc) { if( utf8_cc < 0xA0 ) {
case ((UTF8_CC_START << 8) | CHARACTER_EMPHASIS_ON): switch(utf8_cc) {
emphasis = 1; case 0x01 ... 0x7F:
i++; dest[dest_pos++] = utf8_cc;
continue; break;
case ((UTF8_CC_START << 8) | CHARACTER_EMPHASIS_OFF): case CHARACTER_CR_LF:
emphasis = 0; dest[dest_pos++] = '\n';
i++; break;
continue; case CHARACTER_EMPHASIS_ON:
default: emphasis = 1;
break; break;
case CHARACTER_EMPHASIS_OFF:
emphasis = 0;
break;
default: {
if( dest_pos < destlen - 2 ) {
dest[dest_pos++] = 0xC2;
dest[dest_pos++] = (utf8_cc & 0x3F) | 0x80;
} }
break;
} }
default: { }
if (*(src + i) < 128) } else {
dest[dest_pos++] = *(src + i); if( utf8_cc < 0x800 ) {
else { if( dest_pos >= destlen - 2 )
dest[dest_pos++] = 0xc2 + (*(src + i) > 0xbf); break;
dest[dest_pos++] = (*(src + i) & 0x3f) | 0x80; dest[dest_pos++] = 0xC0 | ((utf8_cc >> 6) & 0x1F);
} dest[dest_pos++] = (utf8_cc & 0x3F) | 0x80;
break; } else if( utf8_cc < 0x10000 ) {
if( dest_pos >= destlen - 3 )
break;
dest[dest_pos++] = 0xE0 | ((utf8_cc >> 12) & 0x0F);
dest[dest_pos++] = ((utf8_cc >> 6) & 0x3F) | 0x80;
dest[dest_pos++] = (utf8_cc & 0x3F) | 0x80;
} else if( utf8_cc < 0x110000 ) {
if( dest_pos >= destlen - 4 )
break;
dest[dest_pos++] = 0xF0 | ((utf8_cc >> 18) & 0x07);
dest[dest_pos++] = ((utf8_cc >> 12) & 0x3F) | 0x80;
dest[dest_pos++] = ((utf8_cc >> 6) & 0x3F) | 0x80;
dest[dest_pos++] = (utf8_cc & 0x3F) | 0x80;
} }
} }
} }
@ -1250,19 +1411,18 @@ static int sdt_cb(struct sfilter *sf)
if (tag == 0x48) { if (tag == 0x48) {
spnl = buf[doff + 3]; spnl = buf[doff + 3];
snl = buf[doff + 4 + spnl]; snl = buf[doff + 4 + spnl];
s->pname[79] = 0x00; s->pname[79] = 0x00;
s->name[79] = 0x00; s->name[79] = 0x00;
en300468_parse_string_to_utf8(s->pname, buf + doff + 4, spnl); en300468_parse_string_to_utf8(s->pname, sizeof(s->pname), buf + doff + 4, spnl);
if( s->pname[79] != 0 ) if( s->pname[79] != 0 )
fprintf(stderr, "********************************************* PNAME OVERFLOW %d spnl = %d",spnl); fprintf(stderr, "********************************************* PNAME OVERFLOW %d spnl = %d",spnl);
en300468_parse_string_to_utf8(s->name, buf + doff + 5 + spnl, snl); en300468_parse_string_to_utf8(s->name, sizeof(s->name), buf + doff + 5 + spnl, snl);
if( s->name[79] != 0 ) if( s->name[79] != 0 )
fprintf(stderr, "********************************************* SNAME OVERFLOW %d snl = %d",snl); fprintf(stderr, "********************************************* SNAME OVERFLOW %d snl = %d",snl);
s->got_sdt = 1; s->got_sdt = 1;
} }
} }
} }
return 0; return 0;
} }
@ -1592,10 +1752,10 @@ static inline int validcc(struct pid_info *p, uint8_t *tsp)
int valid; int valid;
newcc = tsp[3] & 0x0f; newcc = tsp[3] & 0x0f;
valid = (((p->cc + 1) & 0x0f) == newcc) ? 1 : 0; valid = (((p->cc + 1) & 0x0f) == newcc) ? 1 : 0;
if (p->cc == 0xff) if (p->cc == 0xff)
valid=1; valid=1;
p->cc = newcc; p->cc = newcc;
if (!valid) { if (!valid) {
fprintf(stderr, "CC error PID %04x!\n", p->pid); fprintf(stderr, "CC error PID %04x!\n", p->pid);
pid_info_reset(p); pid_info_reset(p);
@ -1605,15 +1765,15 @@ static inline int validcc(struct pid_info *p, uint8_t *tsp)
static inline int pid_info_build_section(struct pid_info *p, uint8_t *tsp) static inline int pid_info_build_section(struct pid_info *p, uint8_t *tsp)
{ {
int pusoff, todo = tspayload(tsp), i = 188 - todo; int pusoff, todo = tspayload(tsp), i = 188 - todo;
if (!todo) if (!todo)
return -1; return -1;
pusoff = (tsp[1] & 0x40) ? tsp[i++] : todo; pusoff = (tsp[1] & 0x40) ? tsp[i++] : todo;
if (pusoff + i > 188) if (pusoff + i > 188)
goto error; goto error;
if (validcc(p, tsp) && pusoff && p->bufp) { if (validcc(p, tsp) && pusoff && p->bufp) {
int rlen = pusoff; int rlen = pusoff;
if (p->len) { if (p->len) {
if (p->bufp + rlen > p->len) if (p->bufp + rlen > p->len)
rlen = p->len - p->bufp; rlen = p->len - p->bufp;
@ -1628,7 +1788,7 @@ static inline int pid_info_build_section(struct pid_info *p, uint8_t *tsp)
} }
i += pusoff; i += pusoff;
while ((todo = 188 - i) > 0 && tsp[i] != 0xff) { while ((todo = 188 - i) > 0 && tsp[i] != 0xff) {
pid_info_reset(p); pid_info_reset(p);
if (todo < 3) if (todo < 3)
fprintf(stderr, "sec start <3 \n"); fprintf(stderr, "sec start <3 \n");
if (todo < 3 || (p->len = seclen(tsp+i)) > todo) { if (todo < 3 || (p->len = seclen(tsp+i)) > todo) {
@ -1654,7 +1814,7 @@ error:
void proc_tsp(struct ts_info *tsi, uint8_t *tsp) void proc_tsp(struct ts_info *tsi, uint8_t *tsp)
{ {
uint16_t pid = 0x1fff & ((tsp[1] << 8) | tsp[2]); uint16_t pid = 0x1fff & ((tsp[1] << 8) | tsp[2]);
struct pid_info *pidi = &tsi->pidi[pid]; struct pid_info *pidi = &tsi->pidi[pid];
if (!pidi->used) if (!pidi->used)
@ -1734,7 +1894,7 @@ static void print_events(struct tp_info *tpi)
{ {
struct service *s; struct service *s;
struct event *e; struct event *e;
char t[512]; char t[768];
int i; int i;
uint16_t y; uint16_t y;
uint8_t m,d; uint8_t m,d;
@ -1753,11 +1913,11 @@ static void print_events(struct tp_info *tpi)
} }
printf(" LANG:%c%c%c\n", e->s_lang[0], e->s_lang[1], e->s_lang[2]); printf(" LANG:%c%c%c\n", e->s_lang[0], e->s_lang[1], e->s_lang[2]);
if( e->s_name ) { if( e->s_name ) {
en300468_parse_string_to_utf8(t,&e->s_name[1],e->s_name[0]); en300468_parse_string_to_utf8(t,sizeof(t),&e->s_name[1],e->s_name[0]);
printf(" NAME:%s\n",t); printf(" NAME:%s\n",t);
} }
if( e->s_text ) { if( e->s_text ) {
en300468_parse_string_to_utf8(t,&e->s_text[1],e->s_text[0]); en300468_parse_string_to_utf8(t,sizeof(t),&e->s_text[1],e->s_text[0]);
printf(" TEXT:%s\n",t); printf(" TEXT:%s\n",t);
} }
printf("END\n"); printf("END\n");
@ -1912,25 +2072,25 @@ void tpstring(struct tp_info *tpi, char *s, int slen)
{ {
int len; int len;
switch (tpi->msys) { switch (tpi->msys) {
case 1: case 1:
if( tpi->freq_frac ) if( tpi->freq_frac )
len = snprintf(s, slen, len = snprintf(s, slen,
"freq=%u.%04u&msys=dvbc&sr=%u&mtype=%s", "freq=%u.%04u&msys=dvbc&sr=%u&mtype=%s",
tpi->freq, tpi->freq_frac, tpi->sr, mtype2str[tpi->mod]); tpi->freq, tpi->freq_frac, tpi->sr, mtype2str[tpi->mod]);
else else
len = snprintf(s, slen, len = snprintf(s, slen,
"freq=%u&msys=dvbc&sr=%u&mtype=%s", "freq=%u&msys=dvbc&sr=%u&mtype=%s",
tpi->freq, tpi->sr, mtype2str[tpi->mod]); pi->freq, tpi->sr, mtype2str[tpi->mod]);
break; break;
case 5: case 5:
case 6: case 6:
len = snprintf(s, slen, len = snprintf(s, slen,
"src=%u&freq=%u&pol=%s&msys=%s&sr=%u", "src=%u&freq=%u&pol=%s&msys=%s&sr=%u",
tpi->src,tpi->freq, pol2str[tpi->pol&3], tpi->src,tpi->freq, pol2str[tpi->pol&3],
msys2str[tpi->msys], tpi->sr); msys2str[tpi->msys], tpi->sr);
break; break;
} }
} }
@ -2190,7 +2350,7 @@ int main(int argc, char **argv)
} }
break; break;
case 't': case 't':
i = 0; i = 0;
while( mtype2str[i] ) { while( mtype2str[i] ) {
if( strcmp(optarg,mtype2str[i]) == 0 ) { if( strcmp(optarg,mtype2str[i]) == 0 ) {