]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
psip: recode atsc_get_string to return all language strings
authorJaroslav Kysela <perex@perex.cz>
Fri, 6 Nov 2015 09:08:16 +0000 (10:08 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 6 Nov 2015 09:08:16 +0000 (10:08 +0100)
src/epggrab/module/psip.c
src/input/mpegts/dvb.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/dvb_support.c

index df3a7f6dbf452fbf09203af803877d88c732d1ef..99372286eb6b4324c2d307cc5bc6f1366c6dbbbd 100644 (file)
@@ -149,7 +149,6 @@ _psip_eit_callback_channel
   int save = 0, save2, i, size;
   uint8_t titlelen;
   unsigned int dlen;
-  char buf[512];
   epg_broadcast_t *ebc;
   epg_episode_t *ee;
   lang_str_t *title, *description;
@@ -169,10 +168,11 @@ _psip_eit_callback_channel
 
     if (size > len) break;
 
-    atsc_get_string(buf, sizeof(buf), ptr+10, titlelen, "eng");
+    title = atsc_get_string(ptr+10, titlelen);
+    if (title == NULL) continue;
 
     tvhtrace("psip", "  %03d: 0x%04x at %"PRItime_t", duration %d, title: '%s' (%d bytes)",
-      i, eventid, start, length, buf, titlelen);
+      i, eventid, start, length, lang_str_get(title, NULL), titlelen);
 
     ebc = epg_broadcast_find_by_time(ch, start, stop, eventid, 1, &save2);
     tvhtrace("psip", "  ch='%s', eid=%5d, start=%"PRItime_t","
@@ -182,16 +182,13 @@ _psip_eit_callback_channel
     if (!ebc) continue;
     save |= save2;
 
-    title = lang_str_create();
-    lang_str_add(title, buf, "eng", 0);
-
     pd = psip_find_desc(ps, eventid);
     if (pd) {
-      description = lang_str_create();
-      atsc_get_string(buf, sizeof(buf), pd->pd_data, pd->pd_datalen, "eng");
-      lang_str_add(description, buf, "eng", 0);
-      save |= epg_broadcast_set_description2(ebc, description, mod);
-      lang_str_destroy(description);
+      description = atsc_get_string(pd->pd_data, pd->pd_datalen);
+      if (description) {
+        save |= epg_broadcast_set_description2(ebc, description, mod);
+        lang_str_destroy(description);
+      }
     }
 
     ee = epg_broadcast_get_episode(ebc, 1, &save2);
@@ -326,7 +323,7 @@ _psip_ett_callback
   mpegts_service_t     *svc;
   mpegts_psi_table_state_t *st;
   th_subscription_t    *ths;
-  char buf[4096];
+  lang_str_t *description;
 
   /* Validate */
   if (tableid != 0xcc) return -1;
@@ -372,10 +369,7 @@ _psip_ett_callback
     epg_broadcast_t *ebc;
     ebc = epg_broadcast_find_by_eid(ch, eventid);
     if (ebc) {
-      lang_str_t *description;
-      description = lang_str_create();
-      atsc_get_string(buf, sizeof(buf), ptr+10, len-10, "eng");
-      lang_str_add(description, buf, "eng", 0);
+      description = atsc_get_string(ptr+10, len-10);
       save |= epg_broadcast_set_description2(ebc, description, mod);
       lang_str_destroy(description);
       tvhtrace("psip", "0x%04x: ETT tableid 0x%04X [%s], eventid 0x%04X (%d) ['%s'], ver %d", mt->mt_pid, tsid, svc->s_dvb_svcname, eventid, eventid, lang_str_get(ebc->episode->title, "eng"), ver);
index 1e1084991550c17a4bbd3efaf931e324a1b6e843..a00a8ef43e7bb039aabe9486b9bd62aac59dbbfc 100644 (file)
@@ -29,6 +29,7 @@
 struct mpegts_table;
 struct mpegts_table_state;
 struct mpegts_mux;
+struct lang_str;
 
 /* PIDs */
 
@@ -204,9 +205,8 @@ int dvb_get_string_with_len
   (char *dst, size_t dstlen, const uint8_t *buf, size_t buflen,
    const char *dvb_charset, dvb_string_conv_t *conv);
 
-int atsc_get_string
-  (char *dst, size_t dstlen, const uint8_t *src, size_t srclen,
-   const char *lang);
+struct lang_str *atsc_get_string
+  (const uint8_t *src, size_t srclen);
 
 /* Conversion */
 
index 43d42f975fd0a7abb47db01d80fadc22fd562408..3b34de3819dc17816aa2f01188850499ab8b09a5 100644 (file)
@@ -1627,10 +1627,12 @@ atsc_vct_callback
   uint16_t tsid, sid, type;
   uint16_t srcid;
   char chname[256];
+  const char *x;
   mpegts_mux_t     *mm = mt->mt_mux, *mm_orig = mm;
   mpegts_network_t *mn = mm->mm_network;
   mpegts_service_t *s;
   mpegts_psi_table_state_t *st  = NULL;
+  lang_str_t *ls;
 
   /* Validate */
   if (tableid != 0xc8 && tableid != 0xc9) return -1;
@@ -1681,6 +1683,27 @@ atsc_vct_callback
         if (!(s = mpegts_service_find(mm, sid, 0, 1, &save)))
           continue;
 
+        for (j=0; j < dlen; ) {
+          unsigned int len, tag;
+          tag = ptr[32+j];
+          len = ptr[33+j];
+          if (tag == ATSC_DESC_EXT_CHANNEL_NAME) {
+            ls = atsc_get_string(ptr + 34 + j, len);
+            if (ls) {
+              x = lang_str_get(ls, NULL);
+              if (x == NULL)
+                x = lang_str_get(ls, "eng");
+              if (x)
+                snprintf(chname, sizeof(chname), "%s", x);
+              tvhdebug("vct", "  extended channel name: '%s' (%d bytes)", x, len);
+              lang_str_destroy(ls);
+            }
+          } else {
+            tvhdebug("vct", "  tag 0x%02x, len %d", tag, len);
+          }
+          j += len + 2;
+        }
+
         /* Update */
         if (strcmp(s->s_dvb_svcname ?: "", chname)) {
           tvh_str_set(&s->s_dvb_svcname, chname);
@@ -1695,20 +1718,6 @@ atsc_vct_callback
           s->s_atsc_source_id = srcid;
           save = 1;
         }
-        
-        for (j=0; j < dlen; ) {
-          unsigned int len, tag;
-          tag = ptr[32+j];
-          len = ptr[33+j];
-          if (tag == ATSC_DESC_EXT_CHANNEL_NAME) {
-            char extname[512];
-            atsc_get_string(extname, sizeof(extname), &ptr[34+j], len, "eng");
-            tvhdebug("vct", "  extended channel name: '%s' (%d bytes)", extname, len);
-          } else {
-            tvhdebug("vct", "  tag 0x%02x, len %d", tag, len);
-          }
-          j += len + 2;
-        }
 
         /* Save */
         if (save)
index b13e54f20d47aa645b9f827c215d3d09350fb1ad..7b4ba62218f87e36407365749b795f097267aab4 100644 (file)
@@ -31,6 +31,7 @@
 #include "dvb_charset_tables.h"
 #include "input.h"
 #include "intlconv.h"
+#include "lang_str.h"
 #include "settings.h"
 
 static int convert_iso_8859[16] = {
@@ -392,14 +393,15 @@ atsc_utf16_to_utf8(const uint8_t *src, int len, char *buf, int buflen)
   *buf = 0;
 }
 
-int
+lang_str_t *
 atsc_get_string
-  (char *dst, size_t dstlen, const uint8_t *src, size_t srclen,
-   const char *lang)
+  (const uint8_t *src, size_t srclen)
 {
-  int stringcount;
-  int i, j;
-  int outputbytes = 0;
+  lang_str_t *ls = NULL;
+  int i, j, stringcount, segmentcount;
+  int compressiontype, mode, bytecount;
+  char langcode[4];
+  char buf[256];
 
   stringcount = src[0];
   tvhtrace("atsc-str", "%d strings", stringcount);
@@ -407,47 +409,35 @@ atsc_get_string
   src++;
   srclen--;
 
-  for (i = 0; i < stringcount && srclen >= 4; i++) {
-    char langcode[3];
-    int segmentcount;
-    int langok;
+  langcode[3] = '\0';
 
-    langcode[0] = src[0];
-    langcode[1] = src[1];
-    langcode[2] = src[2];
+  for (i = 0; i < stringcount && srclen >= 4; i++) {
+    langcode[0]  = src[0];
+    langcode[1]  = src[1];
+    langcode[2]  = src[2];
     segmentcount = src[3];
 
-    tvhtrace("atsc-str", "  %d: lang '%c%c%c', segments %d",
-              i, langcode[0], langcode[1], langcode[2], segmentcount);
-
-    langok = (lang == NULL || memcmp(langcode, lang, 3) == 0);
+    tvhtrace("atsc-str", "  %d: lang '%s', segments %d", i, langcode, segmentcount);
 
-    src += 4;
+    src    += 4;
     srclen -= 4;
 
     for (j = 0; j < segmentcount && srclen >= 3; j++) {
-      int compressiontype, mode, bytecount;
-
       compressiontype = src[0];
-      mode = src[1];
-      bytecount = src[2];
+      mode            = src[1];
+      bytecount       = src[2];
 
-      src += 3;
+      src    += 3;
       srclen -= 3;
 
       if (mode == 0 && compressiontype == 0) {
         tvhtrace("atsc-str", "    %d: comptype 0x%02x, mode 0x%02x, %d bytes: '%.*s'",
-            j, compressiontype, mode, bytecount, bytecount, src);
-        if (langok) {
-          if (dstlen > bytecount) {
-            memcpy(dst, src, bytecount);
-            dst += bytecount;
-            dstlen -= bytecount;
-            outputbytes += bytecount;
-          } else {
-            tvhwarn("atsc-str", "destination buffer too small, %d bytes needed", bytecount);
-          }
-        }
+                 j, compressiontype, mode, bytecount, bytecount, src);
+        memcpy(buf, src, bytecount);
+        buf[bytecount] = '\0';
+        if (ls == NULL)
+          ls = lang_str_create();
+        lang_str_append(ls, buf, langcode);
       } else {
         tvhtrace("atsc-str", "    %d: comptype 0x%02x, mode 0x%02x, %d bytes",
                  j, compressiontype, mode, bytecount);
@@ -457,9 +447,8 @@ atsc_get_string
       src += bytecount; srclen -= bytecount; // skip for now
     }
   }
-  if (dstlen > 0)
-    dst[0] = 0;
-  return outputbytes;
+
+  return ls;
 }
 
 /*