vlc | branch: master | Francois Cartegnie <[email protected]> | Mon Apr 25 15:53:19 2016 +0200| [d680ada88ae3405d89102dd750fab2d9cd0895aa] | committer: Francois Cartegnie
mux: ts: fix service strings encoding > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d680ada88ae3405d89102dd750fab2d9cd0895aa --- modules/mux/mpeg/tables.c | 48 +++++++++++++++++++++++++++++++++------------ modules/mux/mpeg/tables.h | 4 ++-- modules/mux/mpeg/ts.c | 5 +++-- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/modules/mux/mpeg/tables.c b/modules/mux/mpeg/tables.c index 8ade82c..3813f75 100644 --- a/modules/mux/mpeg/tables.c +++ b/modules/mux/mpeg/tables.c @@ -323,6 +323,36 @@ static void UpdateServiceType( uint8_t *pi_service_cat, uint8_t *pi_service_type } } +static inline size_t Write_AnnexA_String( uint8_t *p_dest, const char *p_src ) +{ + size_t i_src; + if( p_src == NULL || !(i_src = strlen( p_src )) ) + { + p_dest[0] = 0; + return 1; + } + + bool b_latin = (p_src[0] > 0x20); + for ( size_t i=0; i< i_src && b_latin; i++ ) + b_latin &= !( p_src[i] & 0x80 ); + + if( b_latin ) + { + i_src = __MIN( i_src, UINT8_MAX ); + p_dest[0] = i_src; /* Total size */ + memcpy( &p_dest[1], p_src, i_src ); + return 1 + i_src; + } + else + { + i_src = __MIN( i_src, UINT8_MAX - 1 ); + p_dest[0] = 1 + i_src; /* Total size */ + p_dest[1] = 0x15; /* UTF8 Encoding */ + memcpy( &p_dest[2], p_src, i_src ); + return 2 + i_src; + } +} + void BuildPMT( dvbpsi_t *p_dvbpsi, vlc_object_t *p_object, void *p_opaque, PEStoTSCallback pf_callback, int i_tsid, int i_pmt_version_number, @@ -535,25 +565,19 @@ void BuildPMT( dvbpsi_t *p_dvbpsi, vlc_object_t *p_object, const char *psz_sdtprov = p_sdt->desc[i].psz_provider; const char *psz_sdtserv = p_sdt->desc[i].psz_service_name; - size_t i_prov = (psz_sdtprov) ? __MIN(255, strlen(psz_sdtprov)) : 0; - size_t i_serv = (psz_sdtserv) ? __MIN(255, strlen(psz_sdtserv)) : 0; - - uint8_t psz_sdt_desc[4 + i_prov + i_serv]; + uint8_t p_sdt_desc[4 + 255 * 2]; + size_t i_sdt_desc = 0; /* mapped service type according to es types */ - psz_sdt_desc[0] = pi_service_types[i]; + p_sdt_desc[i_sdt_desc++] = pi_service_types[i]; /* service provider name length */ - psz_sdt_desc[1] = i_prov; - memcpy( &psz_sdt_desc[2], psz_sdtprov, i_prov ); + i_sdt_desc += Write_AnnexA_String( &p_sdt_desc[i_sdt_desc], psz_sdtprov ); /* service name length */ - psz_sdt_desc[ 2 + i_prov ] = i_serv; - memcpy( &psz_sdt_desc[3+i_prov], psz_sdtserv, i_serv ); + i_sdt_desc += Write_AnnexA_String( &p_sdt_desc[i_sdt_desc], psz_sdtserv ); - dvbpsi_sdt_service_descriptor_add( p_service, 0x48, - (3 + i_prov + i_serv), - psz_sdt_desc ); + dvbpsi_sdt_service_descriptor_add( p_service, 0x48, i_sdt_desc, p_sdt_desc ); } free( pi_service_types ); diff --git a/modules/mux/mpeg/tables.h b/modules/mux/mpeg/tables.h index b302558..061ca5d 100644 --- a/modules/mux/mpeg/tables.h +++ b/modules/mux/mpeg/tables.h @@ -28,8 +28,8 @@ typedef struct int i_netid; struct { - char *psz_provider; - char *psz_service_name; /* name of program */ + char *psz_provider; /* provider in UTF8 */ + char *psz_service_name; /* program in UTF8 */ } desc[MAX_SDT_DESC]; } sdt_psi_t; diff --git a/modules/mux/mpeg/ts.c b/modules/mux/mpeg/ts.c index f8e8447..00f769a 100644 --- a/modules/mux/mpeg/ts.c +++ b/modules/mux/mpeg/ts.c @@ -39,6 +39,7 @@ #include <vlc_sout.h> #include <vlc_block.h> #include <vlc_rand.h> +#include <vlc_charset.h> #include <vlc_iso_lang.h> @@ -614,9 +615,9 @@ static int Open( vlc_object_t *p_this ) *psz_end++ = '\0'; if (i % 2) - p_sys->sdt.desc[i/2].psz_service_name = strdup(psz_sdttoken); + p_sys->sdt.desc[i/2].psz_service_name = FromLocaleDup( psz_sdttoken ); else - p_sys->sdt.desc[i/2].psz_provider = strdup(psz_sdttoken); + p_sys->sdt.desc[i/2].psz_provider = FromLocaleDup( psz_sdttoken ); psz_sdttoken = psz_end; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
