From 5e8d239a6a31009112627a48622a270ed74dd61b Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Sat, 8 Sep 2012 19:32:03 +0100 Subject: [PATCH] Some updates to the use of lang codes inside TVH. --- src/lang_codes.c | 10 ++++++++-- src/lang_codes.h | 1 + src/psi.c | 40 +++++++++++++++++++++------------------- src/service.c | 2 +- src/service.h | 2 +- 5 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/lang_codes.c b/src/lang_codes.c index cbd4dac9..02ed3809 100644 --- a/src/lang_codes.c +++ b/src/lang_codes.c @@ -493,7 +493,7 @@ const lang_code_t lang_codes[] = { * Functions * *************************************************************************/ -const char *lang_code_get ( const char *code ) +const char *lang_code_get2 ( const char *code, size_t len ) { int i; char tmp[4]; @@ -502,11 +502,12 @@ const char *lang_code_get ( const char *code ) /* Extract the code (lowercase) */ i = 0; - while (i < 3 && *code) { + while (i < 3 && *code && len) { if (*code == ';' || *code == ',' || *code == '-') break; if (*code != ' ') tmp[i++] = *code | 0x20; // |0x20 = lower case code++; + len--; } tmp[i] = '\0'; @@ -524,6 +525,11 @@ const char *lang_code_get ( const char *code ) return lang_codes[0].code2b; } +const char *lang_code_get ( const char *code ) +{ + return lang_code_get2(code, strlen(code)); +} + const char **lang_code_split ( const char *codes ) { int n; diff --git a/src/lang_codes.h b/src/lang_codes.h index 695ba6a4..fccb7cc3 100644 --- a/src/lang_codes.h +++ b/src/lang_codes.h @@ -31,6 +31,7 @@ extern const lang_code_t lang_codes[]; /* Convert code to preferred internal code */ const char *lang_code_get ( const char *code ); +const char *lang_code_get2 ( const char *code, size_t len ); /* Split list of codes as per HTTP Language-Accept spec */ const char **lang_code_split ( const char *codes ); diff --git a/src/psi.c b/src/psi.c index c62d30a6..7960ae2b 100644 --- a/src/psi.c +++ b/src/psi.c @@ -27,6 +27,7 @@ #include "dvb/dvb_support.h" #include "tsdemux.h" #include "parsers.h" +#include "lang_codes.h" static int psi_section_reassemble0(psi_section_t *ps, const uint8_t *data, @@ -329,6 +330,7 @@ psi_desc_teletext(service_t *t, const uint8_t *ptr, int size, int parent_pid, int *position) { int r = 0; + const char *lang; elementary_stream_t *st; while(size >= 5) { @@ -348,10 +350,11 @@ psi_desc_teletext(service_t *t, const uint8_t *ptr, int size, } st->es_delete_me = 0; - - if(memcmp(st->es_lang, ptr, 3)) { - r |= PMT_UPDATE_LANGUAGE; - memcpy(st->es_lang, ptr, 3); + + lang = lang_code_get2((const char*)ptr, 3); + if(memcmp(st->es_lang,lang,3)) { + r |= PMT_UPDATE_LANGUAGE; + memcpy(st->es_lang, lang, 4); } if(st->es_parent_pid != parent_pid) { @@ -422,7 +425,6 @@ psi_parse_pmt(service_t *t, const uint8_t *ptr, int len, int chksvcid, uint16_t sid; streaming_component_type_t hts_stream_type; elementary_stream_t *st, *next; - char lang[4]; int update = 0; int had_components; int composition_id; @@ -430,6 +432,7 @@ psi_parse_pmt(service_t *t, const uint8_t *ptr, int len, int chksvcid, int version; int position = 0; int tt_position = 1000; + const char *lang = NULL; caid_t *c, *cn; @@ -503,7 +506,6 @@ psi_parse_pmt(service_t *t, const uint8_t *ptr, int len, int chksvcid, len -= 5; hts_stream_type = SCT_UNKNOWN; - memset(lang, 0, 4); composition_id = -1; ancillary_id = -1; @@ -558,8 +560,8 @@ psi_parse_pmt(service_t *t, const uint8_t *ptr, int len, int chksvcid, break; case DVB_DESC_LANGUAGE: - memcpy(lang, ptr, 3); - break; + lang = lang_code_get2((const char*)ptr, 3); + break; case DVB_DESC_TELETEXT: if(estype == 0x06) @@ -581,14 +583,14 @@ psi_parse_pmt(service_t *t, const uint8_t *ptr, int len, int chksvcid, break; case DVB_DESC_SUBTITLE: - if(dlen < 8) - break; + if(dlen < 8) + break; - memcpy(lang, ptr, 3); - composition_id = ptr[4] << 8 | ptr[5]; - ancillary_id = ptr[6] << 8 | ptr[7]; - hts_stream_type = SCT_DVBSUB; - break; + lang = lang_code_get2((const char*)ptr, 3); + composition_id = ptr[4] << 8 | ptr[5]; + ancillary_id = ptr[6] << 8 | ptr[7]; + hts_stream_type = SCT_DVBSUB; + break; case DVB_DESC_EAC3: if(estype == 0x06 || estype == 0x81) @@ -626,9 +628,9 @@ psi_parse_pmt(service_t *t, const uint8_t *ptr, int len, int chksvcid, st->es_position = position; } - if(memcmp(st->es_lang, lang, 4)) { - update |= PMT_UPDATE_LANGUAGE; - memcpy(st->es_lang, lang, 4); + if(lang && memcmp(st->es_lang, lang, 3)) { + update |= PMT_UPDATE_LANGUAGE; + memcpy(st->es_lang, lang, 4); } if(composition_id != -1 && st->es_composition_id != composition_id) { @@ -1108,7 +1110,7 @@ psi_load_service_settings(htsmsg_t *m, service_t *t) st = service_stream_create(t, pid, type); if((v = htsmsg_get_str(c, "language")) != NULL) - snprintf(st->es_lang, 4, "%s", v); + strncpy(st->es_lang, lang_code_get(v), 3); if(!htsmsg_get_u32(c, "position", &u32)) st->es_position = u32; diff --git a/src/service.c b/src/service.c index 2ef18c42..f86ca15a 100644 --- a/src/service.c +++ b/src/service.c @@ -891,7 +891,7 @@ service_build_stream_start(service_t *t) ssc->ssc_index = st->es_index; ssc->ssc_type = st->es_type; - memcpy(ssc->ssc_lang, lang_code_get(st->es_lang), 4); + memcpy(ssc->ssc_lang, st->es_lang, 4); ssc->ssc_composition_id = st->es_composition_id; ssc->ssc_ancillary_id = st->es_ancillary_id; ssc->ssc_pid = st->es_pid; diff --git a/src/service.h b/src/service.h index ea935fea..81af6208 100644 --- a/src/service.h +++ b/src/service.h @@ -81,7 +81,7 @@ typedef struct elementary_stream { uint16_t es_aspect_num; uint16_t es_aspect_den; - char es_lang[4]; /* ISO 639 3-letter language code */ + char es_lang[4]; /* ISO 639 2B 3-letter language code */ uint16_t es_composition_id; uint16_t es_ancillary_id;