]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb_support: start implementing ATSC multiple string structure
authorLauri Myllari <lauri.myllari@gmail.com>
Sun, 11 Jan 2015 08:25:37 +0000 (00:25 -0800)
committerJaroslav Kysela <perex@perex.cz>
Thu, 22 Oct 2015 15:33:59 +0000 (17:33 +0200)
src/input/mpegts/dvb.h
src/input/mpegts/dvb_support.c

index 60d1184d98f41ba79dd03fec9c488f83e7f1487f..b08c9ad1d6ecad843af1f7cd93e2dee775072a7d 100644 (file)
@@ -200,6 +200,10 @@ 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);
+
 /* Conversion */
 
 #define bcdtoint(i) ((((i & 0xf0) >> 4) * 10) + (i & 0x0f))
index 6566da8aa6cad5868359286cc83176f5e20c17f0..2160e5df8de43928c7aad16769788dfa6c8c30ff 100644 (file)
@@ -392,6 +392,60 @@ atsc_utf16_to_utf8(const uint8_t *src, int len, char *buf, int buflen)
   *buf = 0;
 }
 
+int
+atsc_get_string
+  (char *dst, size_t dstlen, const uint8_t *src, size_t srclen,
+   const char *lang)
+{
+  int stringcount;
+  int i, j;
+
+  stringcount = src[0];
+  tvhdebug("mss", "%d strings", stringcount);
+
+  src++;
+  srclen--;
+
+  for (i = 0; i < stringcount && srclen >= 4; i++) {
+    char langcode[3];
+    int segmentcount;
+
+    langcode[0] = src[0];
+    langcode[1] = src[1];
+    langcode[2] = src[2];
+    segmentcount = src[3];
+
+    tvhdebug("mss", "  %d: lang '%c%c%c', segments %d",
+              i, langcode[0], langcode[1], langcode[2], segmentcount);
+
+    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];
+
+      src += 3;
+      srclen -= 3;
+
+      if (mode == 0 && compressiontype == 0) {
+        tvhdebug("mss", "    %d: comptype 0x%02x, mode 0x%02x, %d bytes: '%.*s'",
+            j, compressiontype, mode, bytecount, bytecount, src);
+      } else {
+        tvhdebug("mss", "    %d: comptype 0x%02x, mode 0x%02x, %d bytes",
+            j, compressiontype, mode, bytecount);
+      }
+
+      /* FIXME: read compressed bytes */
+      src += bytecount; srclen -= bytecount; // skip for now
+    }
+  }
+  return 0;
+}
+
 /*
  * DVB time and date functions
  */