p_sys->b_dvb_meta = false;
}
+#include "dvb-text.h"
-/* FIXME same than dvbsi_to_utf8 from dvb access */
static char *EITConvertToUTF8( const unsigned char *psz_instring,
size_t i_length,
bool b_broken )
{
- const char *psz_encoding;
- char psz_encbuf[sizeof( "ISO_8859-123" )];
- size_t offset = 1;
-
- if( i_length < 1 ) return NULL;
- if( psz_instring[0] >= 0x20 )
- {
- /* According to ETSI EN 300 468 Annex A, this should be ISO6937,
- * but some broadcasters use different charset... */
- if( b_broken )
- psz_encoding = "ISO_8859-1";
- else
- psz_encoding = "ISO_6937";
-
- offset = 0;
- }
- else switch( psz_instring[0] )
- {
- case 0x01:
- psz_encoding = "ISO_8859-5";
- break;
- case 0x02:
- psz_encoding = "ISO_8859-6";
- break;
- case 0x03:
- psz_encoding = "ISO_8859-7";
- break;
- case 0x04:
- psz_encoding = "ISO_8859-8";
- break;
- case 0x05:
- psz_encoding = "ISO_8859-9";
- break;
- case 0x06:
- psz_encoding = "ISO_8859-10";
- break;
- case 0x07:
- psz_encoding = "ISO_8859-11";
- break;
- case 0x08:
- psz_encoding = "ISO_8859-12";
- break;
- case 0x09:
- psz_encoding = "ISO_8859-13";
- break;
- case 0x0a:
- psz_encoding = "ISO_8859-14";
- break;
- case 0x0b:
- psz_encoding = "ISO_8859-15";
- break;
- case 0x10:
-#warning Is Latin-10 (psz_instring[2] == 16) really illegal?
- if( i_length < 3 || psz_instring[1] != 0x00 || psz_instring[2] > 15
- || psz_instring[2] == 0 )
- {
- psz_encoding = "UTF-8";
- offset = 0;
- }
- else
- {
- sprintf( psz_encbuf, "ISO_8859-%u", psz_instring[2] );
- psz_encoding = psz_encbuf;
- offset = 3;
- }
- break;
- case 0x11:
-#warning Is there a BOM or do we use a fixed endianess?
- psz_encoding = "UTF-16";
- break;
- case 0x12:
- psz_encoding = "KSC5601-1987";
- break;
- case 0x13:
- psz_encoding = "GB2312"; /* GB-2312-1980 */
- break;
- case 0x14:
- psz_encoding = "BIG-5";
- break;
- case 0x15:
- psz_encoding = "UTF-8";
- break;
- default:
- /* invalid */
- psz_encoding = "UTF-8";
- offset = 0;
- }
-
- psz_instring += offset;
- i_length -= offset;
-
- char *psz = FromCharset( psz_encoding, psz_instring, i_length );
- if( psz == NULL )
- { /* Invalid character set (e.g. ISO_8859-12) */
- psz = strndup( (const char *)psz_instring, i_length );
- if( unlikely(psz == NULL) )
- return NULL;
- EnsureUTF8( psz );
- }
-
- /* Convert EIT-coded CR/LFs */
- for(char *p = strstr( psz, "\xc2\x8a" ); p != NULL;
- p = strstr( p, "\xc2\x8a" ))
- {
- p[0] = ' ';
- p[1] = '\n';
- }
- return psz;
+ if( b_broken )
+ return FromCharset( "ISO_8859-1", psz_instring, i_length );
+ return vlc_from_EIT( psz_instring, i_length );
}
static void SDTCallBack( demux_t *p_demux, dvbpsi_sdt_t *p_sdt )