From a9e7d13cbf7d32b712d8b8bb8370b45c9ffbf6ad Mon Sep 17 00:00:00 2001
From: Adam Sutton <dev@adamsutton.me.uk>
Date: Mon, 21 Apr 2014 21:22:50 +0100
Subject: [PATCH] mpegts cwc: re-add configuration for prefcapid (fixes #2001)

---
 src/descrambler/cwc.c             | 24 ++++++++++++------------
 src/input/mpegts.h                |  1 +
 src/input/mpegts/mpegts_service.c |  7 +++++++
 src/service.c                     | 20 --------------------
 src/service.h                     | 13 -------------
 5 files changed, 20 insertions(+), 45 deletions(-)

diff --git a/src/descrambler/cwc.c b/src/descrambler/cwc.c
index 72ef301f..2d838f3b 100755
--- a/src/descrambler/cwc.c
+++ b/src/descrambler/cwc.c
@@ -771,9 +771,9 @@ forbid:
     ct->cs_channel = es->es_channel;
     ct->ecm_state = ECM_VALID;
 
-    if(t->s_prefcapid == 0 || t->s_prefcapid != ct->cs_channel) {
-      t->s_prefcapid = ct->cs_channel;
-      tvhlog(LOG_DEBUG, "cwc", "Saving prefered PID %d", t->s_prefcapid);
+    if(t->s_dvb_prefcapid == 0 || t->s_dvb_prefcapid != ct->cs_channel) {
+      t->s_dvb_prefcapid = ct->cs_channel;
+      tvhlog(LOG_DEBUG, "cwc", "Saving prefered PID %d", t->s_dvb_prefcapid);
       service_request_save((service_t*)t, 0);
     }
 
@@ -1638,28 +1638,28 @@ cwc_table_input(struct th_descrambler *td, service_t *s,
     if (ct->ecm_state == ECM_RESET) {
       ct->ecm_state = ECM_INIT;
       ct->cs_channel = -1;
-      t->s_prefcapid = 0;
+      t->s_dvb_prefcapid = 0;
       tvhlog(LOG_DEBUG, "cwc", "Reset after unexpected or no reply for service \"%s\"", t->s_dvb_svcname);
     }
 
     if (ct->ecm_state == ECM_INIT) {
       // Validate prefered ECM PID
-      if(t->s_prefcapid != 0) {
+      if(t->s_dvb_prefcapid != 0) {
         struct elementary_stream *prefca
-          = service_stream_find((service_t*)t, t->s_prefcapid);
+          = service_stream_find((service_t*)t, t->s_dvb_prefcapid);
         if (!prefca || prefca->es_type != SCT_CA) {
-          tvhlog(LOG_DEBUG, "cwc", "Invalid prefered ECM (PID %d) found for service \"%s\"", t->s_prefcapid, t->s_dvb_svcname);
-          t->s_prefcapid = 0;
+          tvhlog(LOG_DEBUG, "cwc", "Invalid prefered ECM (PID %d) found for service \"%s\"", t->s_dvb_prefcapid, t->s_dvb_svcname);
+          t->s_dvb_prefcapid = 0;
         }
       }
 
-      if(t->s_prefcapid == st->es_pid) {
+      if(t->s_dvb_prefcapid == st->es_pid) {
         ep = calloc(1, sizeof(ecm_pid_t));
-        ep->ep_pid = t->s_prefcapid;
+        ep->ep_pid = t->s_dvb_prefcapid;
         LIST_INSERT_HEAD(&ct->cs_pids, ep, ep_link);
-        tvhlog(LOG_DEBUG, "cwc", "Insert prefered ECM (PID %d) for service \"%s\"", t->s_prefcapid, t->s_dvb_svcname);
+        tvhlog(LOG_DEBUG, "cwc", "Insert prefered ECM (PID %d) for service \"%s\"", t->s_dvb_prefcapid, t->s_dvb_svcname);
       }
-      else if(t->s_prefcapid == 0) {
+      else if(t->s_dvb_prefcapid == 0) {
           ep = calloc(1, sizeof(ecm_pid_t));
           ep->ep_pid = st->es_pid;
           LIST_INSERT_HEAD(&ct->cs_pids, ep, ep_link);
diff --git a/src/input/mpegts.h b/src/input/mpegts.h
index 26d7cecb..3ac69db9 100644
--- a/src/input/mpegts.h
+++ b/src/input/mpegts.h
@@ -360,6 +360,7 @@ struct mpegts_service
   char    *s_dvb_cridauth;
   uint16_t s_dvb_servicetype;
   char    *s_dvb_charset;
+  uint16_t s_dvb_prefcapid;
 
   /*
    * EIT/EPG control
diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c
index da851305..7a7dd880 100644
--- a/src/input/mpegts/mpegts_service.c
+++ b/src/input/mpegts/mpegts_service.c
@@ -126,6 +126,13 @@ const idclass_t mpegts_service_class =
       .list   = dvb_charset_enum,
       .opts   = PO_ADVANCED,
     },
+    {
+      .type     = PT_U16,
+      .id       = "prefcapid",
+      .name     = "Pref. CA PID",
+      .off      = offsetof(mpegts_service_t, s_dvb_prefcapid),
+      .opts     = PO_ADVANCED,
+    },
     {},
   }
 };
diff --git a/src/service.c b/src/service.c
index abbfddb8..fd765e79 100644
--- a/src/service.c
+++ b/src/service.c
@@ -911,26 +911,6 @@ service_build_stream_start(service_t *t)
 /**
  *
  */
-void
-service_set_enable(service_t *t, int enabled)
-{
-  if(t->s_enabled == enabled)
-    return;
-
-  t->s_enabled = enabled;
-  t->s_config_save(t);
-  subscription_reschedule();
-}
-
-void
-service_set_prefcapid(service_t *t, uint32_t prefcapid)
-{
-  if(t->s_prefcapid == prefcapid)
-    return;
-
-  t->s_prefcapid = prefcapid;
-  t->s_config_save(t);
-}
 
 static pthread_mutex_t pending_save_mutex;
 static pthread_cond_t pending_save_cond;
diff --git a/src/service.h b/src/service.h
index 2caab0a1..ab53082b 100644
--- a/src/service.h
+++ b/src/service.h
@@ -398,7 +398,6 @@ typedef struct service {
   struct th_descrambler_list s_descramblers;
   int s_scrambled_seen;
   int s_caid;
-  uint16_t s_prefcapid;
 
   /**
    * List of all components.
@@ -462,8 +461,6 @@ service_stream_find(service_t *t, int pid)
 elementary_stream_t *service_stream_create(service_t *t, int pid,
 				     streaming_component_type_t type);
 
-void service_set_priority(service_t *t, int prio);
-
 void service_settings_write(service_t *t);
 
 const char *service_servicetype_txt(service_t *t);
@@ -493,8 +490,6 @@ service_set_streaming_status_flags(service_t *t, int flag)
 struct streaming_start;
 struct streaming_start *service_build_stream_start(service_t *t);
 
-void service_set_enable(service_t *t, int enabled);
-
 void service_restart(service_t *t, int had_components);
 
 void service_stream_destroy(service_t *t, elementary_stream_t *st);
@@ -526,14 +521,6 @@ int tss2errcode(int tss);
 
 uint16_t service_get_encryption(service_t *t);
 
-void service_set_dvb_charset(service_t *t, const char *dvb_charset);
-
-void service_set_dvb_eit_enable(service_t *t, int dvb_eit_enable);
-
-void service_set_prefcapid(service_t *t, uint32_t prefcapid);
-
-int service_is_primary_epg (service_t *t);
-
 htsmsg_t *servicetype_list (void);
 
 void service_load ( service_t *s, htsmsg_t *c );