]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Some updates to the use of lang codes inside TVH.
authorAdam Sutton <dev@adamsutton.me.uk>
Sat, 8 Sep 2012 18:32:03 +0000 (19:32 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Tue, 11 Sep 2012 13:44:41 +0000 (14:44 +0100)
src/lang_codes.c
src/lang_codes.h
src/psi.c
src/service.c
src/service.h

index cbd4dac9b1037d1cf5ed4f4288d52020650e696f..02ed3809d2f88f3fd465c499ab024c877d51cfb0 100644 (file)
@@ -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;
index 695ba6a4afc45fe5783828879575eab227d6385e..fccb7cc341897a1761a4679ba16af2c6bfd057e2 100644 (file)
@@ -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 );
index c62d30a61cd7bdd56b4ad4d28b5f01b918cd0388..7960ae2b29f11c80a6608ed8b020d3f4a2731b18 100644 (file)
--- 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;
index 2ef18c42378b7d86dfb113ea06b35074d967f513..f86ca15ab0de856a169497d1c6f74ebe1d956c58 100644 (file)
@@ -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;
index ea935feaa505ee3811ce3d5340e794058b4724cc..81af62086fa7262a4f58a0421e8eb2e0e0956645 100644 (file)
@@ -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;