]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
tsdebug: redesign
authorJaroslav Kysela <perex@perex.cz>
Fri, 23 Mar 2018 09:07:05 +0000 (10:07 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 23 Mar 2018 17:05:29 +0000 (18:05 +0100)
12 files changed:
Makefile
configure
src/descrambler/descrambler.c
src/input/mpegts.h
src/input/mpegts/iptv/iptv_http.c
src/input/mpegts/iptv/iptv_udp.c
src/input/mpegts/linuxdvb/linuxdvb_frontend.c
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_tsdebug.c
src/input/mpegts/satip/satip_frontend.c
src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c

index c92cf9a3eaf00e2a4441700f6fc49dd3c7a43706..ac15d94234cc5f7ae260b2bb76ab6d68b9574111 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -387,7 +387,9 @@ SRCS-MPEGTS = \
        src/input/mpegts/dvb_psi.c \
        src/input/mpegts/fastscan.c \
        src/input/mpegts/mpegts_mux_sched.c \
-        src/input/mpegts/mpegts_network_scan.c
+        src/input/mpegts/mpegts_network_scan.c \
+        src/input/mpegts/mpegts_tsdebug.c \
+        src/descrambler/tsdebugcw.c
 SRCS-$(CONFIG_MPEGTS) += $(SRCS-MPEGTS)
 I18N-C += $(SRCS-MPEGTS)
 
@@ -599,13 +601,6 @@ SRCS-DDCI = \
 SRCS-${CONFIG_DDCI} += $(SRCS-DDCI)
 I18N-C += $(SRCS-DDCI)
 
-# TSDEBUGCW
-SRCS-TSDEBUG = \
-       src/input/mpegts/mpegts_tsdebug.c \
-       src/descrambler/tsdebugcw.c
-SRCS-${CONFIG_TSDEBUG} += $(SRCS-TSDEBUG)
-I18N-C += $(SRCS-TSDEBUG)
-
 # crypto algorithms
 SRCS-${CONFIG_SSL} += src/descrambler/algo/libaesdec.c
 SRCS-${CONFIG_SSL} += src/descrambler/algo/libaes128dec.c
index 8f430ea049ace053b0dd6df3b518dee9a0cf17d2..4a660b864fc0c9337114fb42f9be5e6d8179d746 100755 (executable)
--- a/configure
+++ b/configure
@@ -69,7 +69,6 @@ OPTIONS=(
   "kqueue:no"
   "dbus_1:auto"
   "android:no"
-  "tsdebug:no"
   "gtimer_check:no"
   "slow_memoryinfo:no"
   "libsystemd_daemon:no"
@@ -724,13 +723,6 @@ if enabled_or_auto dbus_1; then
   fi
 fi
 
-#
-# TSDebug
-#
-if enabled_or_auto tsdebug; then
-  enable mpegts_dvb
-fi
-
 #
 # systemd
 #
index 853a6327942c224f89f093a177da5f120e1478fd..99238f77759f193c3f48d7d9ec64ff7ac12220d6 100644 (file)
@@ -677,7 +677,7 @@ descrambler_keys ( th_descrambler_t *td, int type, uint16_t pid,
 
   if (j >= DESCRAMBLER_MAX_KEYS) {
     tvherror(LS_DESCRAMBLER, "too many keys");
-    goto fin;
+    goto end;
   }
 
   if (pid == 0)
@@ -688,7 +688,7 @@ descrambler_keys ( th_descrambler_t *td, int type, uint16_t pid,
 
   if (tvhcsa_set_type(&tk->key_csa, type) < 0) {
     if (tk->key_type_overwritten)
-      goto fin;
+      goto end;
     if (type == DESCRAMBLER_CSA_CBC && tk->key_csa.csa_type == DESCRAMBLER_DES_NCB) {
       tvhwarn(LS_DESCRAMBLER,
               "Keep key%s type %s (requested %s) for service \"%s\", check your caclient",
@@ -704,7 +704,7 @@ descrambler_keys ( th_descrambler_t *td, int type, uint16_t pid,
     tvhcsa_destroy(&tk->key_csa);
     tvhcsa_init(&tk->key_csa);
     if (tvhcsa_set_type(&tk->key_csa, type) < 0)
-      goto fin;
+      goto end;
     tk->key_valid = 0;
   }
 
@@ -724,7 +724,7 @@ cont:
         td->td_ecm_idle(td);
         pthread_mutex_lock(&t->s_stream_mutex);
       }
-      goto fin;
+      goto end;
     }
 
   if (even && memcmp(empty, even, tk->key_csa.csa_keylen)) {
@@ -803,50 +803,6 @@ cont:
              dr->dr_key_const ? " (const)" : "");
   }
 
-fin:
-#if ENABLE_TSDEBUG
-  if (j) {
-    tsdebug_packet_t *tp = malloc(sizeof(*tp));
-    uint16_t keylen = tk->key_csa.csa_keylen;
-    mpegts_service_t *ms = (mpegts_service_t *)t;
-    uint16_t sid = ms->s_dvb_service_id;
-    uint32_t pos = 0, crc;
-    mpegts_mux_t *mm = ms->s_dvb_mux;
-    mpegts_mux_instance_t *mmi = mm ? mm->mm_active : NULL;
-    mpegts_input_t *mi = mmi ? mmi->mmi_input : NULL;
-    if (mi == NULL || (mm->mm_tsdebug_fd < 0 && mm->mm_tsdebug_fd2 < 0)) {
-      free(tp);
-      goto end;
-    }
-    pthread_mutex_unlock(&t->s_stream_mutex);
-    memset(tp->pkt, 0xff, sizeof(tp->pkt));
-    tp->pkt[pos++] = 0x47; /* sync byte */
-    tp->pkt[pos++] = 0x1f; /* PID MSB */
-    tp->pkt[pos++] = 0xff; /* PID LSB */
-    tp->pkt[pos++] = 0x00; /* CC */
-    memcpy(tp->pkt + pos, "TVHeadendDescramblerKeys", 24);
-    pos += 24;
-    tp->pkt[pos++] = type & 0xff;
-    tp->pkt[pos++] = keylen & 0xff;
-    tp->pkt[pos++] = (sid >> 8) & 0xff;
-    tp->pkt[pos++] = sid & 0xff;
-    tp->pkt[pos++] = (pid >> 8) & 0xff;
-    tp->pkt[pos++] = pid & 0xff;
-    memcpy(tp->pkt + pos, even ?: empty, keylen);
-    memcpy(tp->pkt + pos + keylen, odd ?: empty, keylen);
-    pos += 2 * keylen;
-    crc = tvh_crc32(tp->pkt, pos, 0x859aa5ba);
-    tp->pkt[pos++] = (crc >> 24) & 0xff;
-    tp->pkt[pos++] = (crc >> 16) & 0xff;
-    tp->pkt[pos++] = (crc >> 8) & 0xff;
-    tp->pkt[pos++] = crc & 0xff;
-    pthread_mutex_lock(&mm->mm_tsdebug_lock);
-    tp->pos = mm->mm_tsdebug_pos;
-    TAILQ_INSERT_HEAD(&mm->mm_tsdebug_packets, tp, link);
-    pthread_mutex_unlock(&mm->mm_tsdebug_lock);
-    return;
-  }
-#endif
 end:
   pthread_mutex_unlock(&t->s_stream_mutex);
 }
index 42cdd46811cd9bc8bad3de664872e92ca354ab95..10c3913041847ed70f0127bcd8e6993736e3e108 100644 (file)
@@ -426,12 +426,6 @@ enum mpegts_mux_ac3_flag
   MM_AC3_PMT_N05,
 };
 
-typedef struct tsdebug_packet {
-  TAILQ_ENTRY(tsdebug_packet) link;
-  uint8_t pkt[188];
-  off_t pos;
-} tsdebug_packet_t;
-
 /* Multiplex */
 struct mpegts_mux
 {
@@ -544,17 +538,6 @@ struct mpegts_mux
   int      mm_pmt_ac3;
   int      mm_eit_tsid_nocheck;
   uint16_t mm_sid_filter;
-
-  /*
-   * TSDEBUG
-   */
-#if ENABLE_TSDEBUG
-  pthread_mutex_t mm_tsdebug_lock;
-  int             mm_tsdebug_fd;
-  int             mm_tsdebug_fd2;
-  off_t           mm_tsdebug_pos;
-  TAILQ_HEAD(, tsdebug_packet) mm_tsdebug_packets;
-#endif
 };
 
 #define PREFCAPID_OFF      0
@@ -1033,36 +1016,11 @@ elementary_stream_t *mpegts_input_open_service_pid
 
 void mpegts_input_open_cat_monitor ( mpegts_mux_t *mm, mpegts_service_t *s );
 
-#if ENABLE_TSDEBUG
-
-void tsdebug_started_mux(mpegts_input_t *mi, mpegts_mux_t *mm);
-void tsdebug_stopped_mux(mpegts_input_t *mi, mpegts_mux_t *mm);
-void tsdebug_check_tspkt(mpegts_mux_t *mm, uint8_t *pkt, int len);
-
-static inline void
-tsdebug_write(mpegts_mux_t *mm, uint8_t *buf, size_t len)
-{
-  if (mm && mm->mm_tsdebug_fd2 >= 0)
-    if (write(mm->mm_tsdebug_fd2, buf, len) != len)
-      tvherror(LS_TSDEBUG, "unable to write input data (%i)", errno);
-}
-
-static inline ssize_t
-sbuf_tsdebug_read(mpegts_mux_t *mm, sbuf_t *sb, int fd)
-{
-  ssize_t r = sbuf_read(sb, fd);
-  tsdebug_write(mm, sb->sb_data + sb->sb_ptr - r, r);
-  return r;
-}
-
-#else
-
-static inline void tsdebug_started_mux(mpegts_input_t *mi, mpegts_mux_t *mm) { return; }
-static inline void tsdebug_stopped_mux(mpegts_input_t *mi, mpegts_mux_t *mm) { return; }
-static inline void tsdebug_write(mpegts_mux_t *mm, uint8_t *buf, size_t len) { return; }
-static inline ssize_t sbuf_tsdebug_read(mpegts_mux_t *mm, sbuf_t *sb, int fd) { return sbuf_read(sb, fd); }
+void tsdebug_encode_keys
+  ( uint8_t *dst, uint16_t sid, uint16_t pid,
+    uint8_t keytype, uint8_t keylen, uint8_t *even, uint8_t *odd );
 
-#endif
+void tsdebug_check_tspkt( mpegts_mux_t *mm, uint8_t *pkt, int len );
 
 void mpegts_table_dispatch(const uint8_t *sec, size_t r, void *mt);
 static inline void mpegts_table_grab(mpegts_table_t *mt)
@@ -1212,4 +1170,3 @@ void eit_nit_callback(mpegts_table_t *mt, uint16_t nbid, const char *name, uint3
  *
  * vim:sts=2:ts=2:sw=2:et
  *****************************************************************************/
-
index 8461ec5d861a12c94a036ad562cfbb7dcf1b6c6f..db4746cd37b56430133c12b31427e0a93e7ad215 100644 (file)
@@ -318,7 +318,6 @@ iptv_http_data
   } else {
     sbuf_append(&im->mm_iptv_buffer, buf, len);
   }
-  tsdebug_write((mpegts_mux_t *)im, buf, len);
   hp->off += len;
 
   if (hp->hls_url && hp->off == 0 && len >= 2*188) {
index cde65b6ed693822d6d1233b11044949a6680e77b..28ce8ad407e1fa638a6983e4866cff83baad0a89 100644 (file)
@@ -166,7 +166,6 @@ iptv_rtp_read ( iptv_mux_t *im, udp_multirecv_t *um,
     seq = nseq;
 
     /* Move data */
-    tsdebug_write((mpegts_mux_t *)im, rtp + hlen, len);
     sbuf_append(&im->mm_iptv_buffer, rtp + hlen, len);
     res += len;
   }
index 612628d994fcec194d5c360c785a1e9e3e052336..eb9143e1d7c31de2e3d3a132285c3e12b2cee039 100644 (file)
@@ -1437,7 +1437,7 @@ linuxdvb_frontend_input_thread ( void *aux )
     lfe->lfe_nodata = 0;
     
     /* Read */
-    if ((n = sbuf_tsdebug_read(mmi->mmi_mux, &sb, dvr)) < 0) {
+    if ((n = sbuf_read(&sb, dvr)) < 0) {
       if (ERRNO_AGAIN(errno))
         continue;
       if (errno == EOVERFLOW) {
index 501baef0a8ca327a9a4b68ffa862b5a3196e0113..56c6cbe467421f7a9a51bd17520d3402a7e14474 100644 (file)
@@ -969,8 +969,6 @@ mpegts_input_started_mux
 {
   mpegts_mux_t *mm = mmi->mmi_mux;
 
-  tsdebug_started_mux(mi, mm);
-
   /* Deliver first TS packets as fast as possible */
   atomic_set_s64(&mi->mi_last_dispatch, 0);
 
@@ -1023,8 +1021,6 @@ mpegts_input_stopped_mux
   }
   notify_reload("input_status");
   mpegts_input_dbus_notify(mi, 0);
-
-  tsdebug_stopped_mux(mi, mm);
 }
 
 static int
@@ -1371,19 +1367,12 @@ mpegts_input_process
   int table_wakeup = 0;
   mpegts_mux_t *mm = mpkt->mp_mux;
   mpegts_mux_instance_t *mmi;
-#if ENABLE_TSDEBUG
-  off_t tsdebug_pos;
-#endif
 
   if (mm == NULL || (mmi = mm->mm_active) == NULL)
     return 0;
 
   assert(mm == mmi->mmi_mux);
 
-#if ENABLE_TSDEBUG
-  tsdebug_pos = mm->mm_tsdebug_pos;
-#endif
-
   /* Process */
   assert((len % 188) == 0);
   while (len > 0) {
@@ -1411,9 +1400,8 @@ mpegts_input_process
 
     /* Ignore NULL packets */
     if (pid == 0x1FFF) {
-#if ENABLE_TSDEBUG
-      tsdebug_check_tspkt(mm, tsb, llen);
-#endif
+      if (tsb[4] == 'T' && tsb[5] == 'V')
+        tsdebug_check_tspkt(mm, tsb, llen);
       goto done;
     }
 
@@ -1524,9 +1512,6 @@ mpegts_input_process
 done:
     tsb += llen;
     len -= llen;
-#if ENABLE_TSDEBUG
-    mm->mm_tsdebug_pos += llen;
-#endif
   }
 
   /* Raw stream */
@@ -1541,29 +1526,6 @@ done:
     streaming_pad_deliver(&mmi->mmi_streaming_pad, streaming_msg_clone(&sm));
     pktbuf_ref_dec(pb);
   }
-#if ENABLE_TSDEBUG
-  if (mm->mm_tsdebug_fd >= 0 || mm->mm_tsdebug_fd2 >= 0) {
-    tsdebug_packet_t *tp, *tp_next;
-    off_t pos = 0;
-    size_t used = tsb - mpkt->mp_data;
-    pthread_mutex_lock(&mm->mm_tsdebug_lock);
-    for (tp = TAILQ_FIRST(&mm->mm_tsdebug_packets); tp; tp = tp_next) {
-      tp_next = TAILQ_NEXT(tp, link);
-      assert((tp->pos % 188) == 0);
-      assert(tp->pos >= tsdebug_pos && tp->pos < tsdebug_pos + used);
-      if (mm->mm_tsdebug_fd >= 0) {
-        tvh_write(mm->mm_tsdebug_fd, mpkt->mp_data + pos, tp->pos - tsdebug_pos - pos);
-        tvh_write(mm->mm_tsdebug_fd, tp->pkt, 188);
-      }
-      pos = tp->pos - tsdebug_pos;
-      TAILQ_REMOVE(&mm->mm_tsdebug_packets, tp, link);
-      free(tp);
-    }
-    if (pos < used && mm->mm_tsdebug_fd >= 0)
-      tvh_write(mm->mm_tsdebug_fd, mpkt->mp_data + pos, used - pos);
-    pthread_mutex_unlock(&mm->mm_tsdebug_lock);
-  }
-#endif
 
   if (mpkt->mp_cc_restart) {
     LIST_FOREACH(s, &mm->mm_transports, s_active_link)
index a4a5bd61bcf09c37f84d687c2678127c2ba04f86..83b0b64212ed2aed2d875ea036210ec8c14c5a9e 100644 (file)
@@ -1248,11 +1248,6 @@ mpegts_mux_create0
   mm->mm_last_pid            = -1;
   mm->mm_created             = gclk();
 
-#if ENABLE_TSDEBUG
-  pthread_mutex_init(&mm->mm_tsdebug_lock, NULL);
-  mm->mm_tsdebug_fd = mm->mm_tsdebug_fd2 = -1;
-#endif
-
   /* Configuration */
   if (conf)
     idnode_load(&mm->mm_id, conf);
index 599dcfb62a94b6c8a7de0aeb62c3526e5e6988cc..b44bd98ad9e767d85f5c5a7f2e09f984e8b1eb2f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Tvheadend - MPEGTS debug output
- *  Copyright (C) 2015,2016,2017 Jaroslav Kysela
+ *  Copyright (C) 2015,2016,2017,2018 Jaroslav Kysela
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 
 #include "input.h"
 
-#include <fcntl.h>
-#include <sys/stat.h>
-
 void
-tsdebug_started_mux
-  ( mpegts_input_t *mi, mpegts_mux_t *mm )
+tsdebug_encode_keys
+  ( uint8_t *dst, uint16_t sid, uint16_t pid,
+    uint8_t keytype, uint8_t keylen, uint8_t *even, uint8_t *odd )
 {
-  extern char *tvheadend_tsdebug;
-  static const char *tmpdir = "/tmp/tvheadend.tsdebug/";
-  char path[PATH_MAX];
-  struct stat st;
-  if (!tvheadend_tsdebug && !stat(tmpdir, &st) && (st.st_mode & S_IFDIR) != 0)
-    tvheadend_tsdebug = (char *)tmpdir;
-  if (tvheadend_tsdebug && !strcmp(tvheadend_tsdebug, tmpdir) && stat(tmpdir, &st))
-    tvheadend_tsdebug = NULL;
-  if (tvheadend_tsdebug) {
-    snprintf(path, sizeof(path), "%s/%s-%li-%p-mux.ts", tvheadend_tsdebug,
-             mm->mm_nicename, (long)mono2sec(mclk()), mi);
-    mm->mm_tsdebug_fd = tvh_open(path, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
-    if (mm->mm_tsdebug_fd < 0)
-      tvherror(LS_TSDEBUG, "unable to create file '%s' (%i)", path, errno);
-    snprintf(path, sizeof(path), "%s/%s-%li-%p-input.ts", tvheadend_tsdebug,
-             mm->mm_nicename, (long)mono2sec(mclk()), mi);
-    mm->mm_tsdebug_fd2 = tvh_open(path, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
-    if (mm->mm_tsdebug_fd2 < 0)
-      tvherror(LS_TSDEBUG, "unable to create file '%s' (%i)", path, errno);
-  } else {
-    mm->mm_tsdebug_fd = -1;
-    mm->mm_tsdebug_fd2 = -1;
-  }
-}
+  uint32_t pos = 0, crc;
 
-void
-tsdebug_stopped_mux
-  ( mpegts_input_t *mi, mpegts_mux_t *mm )
-{
-  tsdebug_packet_t *tp;
-  if (mm->mm_tsdebug_fd >= 0)
-    close(mm->mm_tsdebug_fd);
-  if (mm->mm_tsdebug_fd2 >= 0)
-    close(mm->mm_tsdebug_fd2);
-  mm->mm_tsdebug_fd = -1;
-  mm->mm_tsdebug_fd2 = -1;
-  mm->mm_tsdebug_pos = 0;
-  while ((tp = TAILQ_FIRST(&mm->mm_tsdebug_packets)) != NULL) {
-    TAILQ_REMOVE(&mm->mm_tsdebug_packets, tp, link);
-    free(tp);
-  }
+  memset(dst, 0xff, 188);
+  dst[pos++] = 0x47; /* sync byte */
+  dst[pos++] = 0x1f; /* PID MSB */
+  dst[pos++] = 0xff; /* PID LSB */
+  dst[pos++] = 0x00; /* CC */
+  memcpy(dst + pos, "TVHeadendDescramblerKeys", 24);
+  dst += 24;
+  dst[pos++] = keytype;
+  dst[pos++] = keylen;
+  dst[pos++] = (sid >> 8) & 0xff;
+  dst[pos++] = sid & 0xff;
+  dst[pos++] = (pid >> 8) & 0xff;
+  dst[pos++] = pid & 0xff;
+  memcpy(dst + pos, even, keylen);
+  memcpy(dst + pos + keylen, odd, keylen);
+  pos += 2 * keylen;
+  crc = tvh_crc32(dst, pos, 0x859aa5ba);
+  dst[pos++] = (crc >> 24) & 0xff;
+  dst[pos++] = (crc >> 16) & 0xff;
+  dst[pos++] = (crc >> 8) & 0xff;
+  dst[pos++] = crc & 0xff;
 }
 
 void
@@ -93,7 +73,7 @@ tsdebug_check_tspkt( mpegts_mux_t *mm, uint8_t *pkt, int len )
     if (crc != tvh_crc32(pkt, pos, 0x859aa5ba))
       return;
     LIST_FOREACH(t, &mm->mm_services, s_dvb_mux_link)
-      if (t->s_dvb_service_id == sid) break;
+      if (t->s_components.set_service_id == sid) break;
     if (!t)
       return;
     pos = 4 + 24 + 4;
index 9ab15ffebff377700ec156b2fea60ec633d584bd..69e9f51b1a245df3b934ec2033559d0ebf39d00d 100644 (file)
@@ -1456,7 +1456,6 @@ satip_frontend_rtp_decode
     }
   } else {
 wrdata:
-    tsdebug_write((mpegts_mux_t *)lfe->sf_curmux, p + pos, len);
     sbuf_append(&lfe->sf_sbuf, p + pos, len);
   }
 next:
index 6ed2dacc56c829f1fd78bd564f9b70a2579c5c29..e9e4ba3f6b0b6f4f1b6eeee85480df85c150c285 100644 (file)
@@ -183,7 +183,7 @@ tvhdhomerun_frontend_input_thread ( void *aux )
     if (nfds < 1) continue;
     if (ev[0].ptr != hfe) break;
 
-    if((r = sbuf_tsdebug_read(mmi->mmi_mux, &sb, sockfd)) < 0) {
+    if((r = sbuf_read(&sb, sockfd)) < 0) {
       /* whoopsy */
       if(ERRNO_AGAIN(errno))
         continue;