]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Store DVB trasports in settings.
authorAndreas Öman <andreas@lonelycoder.com>
Mon, 25 Aug 2008 17:46:44 +0000 (17:46 +0000)
committerAndreas Öman <andreas@lonelycoder.com>
Mon, 25 Aug 2008 17:46:44 +0000 (17:46 +0000)
dvb/dvb.h
dvb/dvb_multiplex.c
dvb/dvb_tables.c
dvb/dvb_transport.c
psi.c
psi.h

index 122ddd93838a21088719efee363f36fbc1979c42..7b35c18826798c7bd72eded70b3c24142991b3da 100644 (file)
--- a/dvb/dvb.h
+++ b/dvb/dvb.h
@@ -73,6 +73,9 @@ void dvb_tune_tdmi(th_dvb_mux_instance_t *tdmi, int maylog,
 /**
  * DVB Transport (aka DVB service)
  */
+
+void dvb_transport_load(th_dvb_mux_instance_t *tdmi);
+
 th_transport_t *dvb_transport_find(th_dvb_mux_instance_t *tdmi,
                                   uint16_t sid, int pmt_pid, int *created);
 
index a652f84aa6759fd19cb26a4d69e955c92d6897d5..cb81d1f79308cae211259e1a4663b1348ec9f799 100644 (file)
@@ -149,6 +149,8 @@ dvb_mux_create(th_dvb_adapter_t *tda, struct dvb_frontend_parameters *fe_param,
     dvb_adapter_notify_reload(tda);
   }
 
+  dvb_transport_load(tdmi);
+
   return tdmi;
 }
 
index 4b3e9440c23899f622e506e87fee7f022bce14d5..8887fa5494f0ac874ebcd708866a69c274f53e6e 100644 (file)
@@ -343,7 +343,6 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
   char chname0[256], *chname;
   uint8_t stype;
   int l;
-  int change = 0;
 
   if(len < 8)
     return;
@@ -412,23 +411,26 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
          if(t == NULL)
            break;
 
-         change |=
-           t->tht_servicetype != stype ||
-           t->tht_scrambled != free_ca_mode ||
-           strcmp(t->tht_provider    ?: "", provider) ||
-           strcmp(t->tht_svcname     ?: "", chname  );
-
-         t->tht_servicetype = stype;
-         t->tht_scrambled = free_ca_mode;
-
-         free((void *)t->tht_provider);
-         t->tht_provider = strdup(provider);
-
-         free((void *)t->tht_svcname);
-         t->tht_svcname = strdup(chname);
-
+         if(t->tht_servicetype != stype ||
+            t->tht_scrambled != free_ca_mode ||
+            strcmp(t->tht_provider    ?: "", provider) ||
+            strcmp(t->tht_svcname     ?: "", chname  )) {
+           
+           t->tht_servicetype = stype;
+           t->tht_scrambled = free_ca_mode;
+           
+           free((void *)t->tht_provider);
+           t->tht_provider = strdup(provider);
+           
+           free((void *)t->tht_svcname);
+           t->tht_svcname = strdup(chname);
+           
+           t->tht_config_change(t);
+         }
+         
          if(t->tht_chname == NULL)
            t->tht_chname = strdup(chname);
+         
        }
        break;
       }
@@ -436,10 +438,6 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
       len -= dlen; ptr += dlen; dllen -= dlen;
     }
   }
-  if(change) {
-    dvb_mux_save(tdmi);
-    //    notify_tdmi_services_change(tdmi);
-  }
 }
 
 
@@ -707,15 +705,7 @@ dvb_pmt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
                 uint8_t tableid, void *opaque)
 {
   th_transport_t *t = opaque;
-  int v = t->tht_pmt_seen;
-
   psi_parse_pmt(t, ptr, len, 1);
-  v ^= t->tht_pmt_seen;
-  if(v) {
-    dvb_mux_save(tdmi);
-    //notify_tdmi_services_change(tdmi);
-  }
-  return;
 }
 
 
index 0b8da781939159439bc51e974b5401e047210955..d9da18a0135926797e882c58fa5655e544b8f2bc 100644 (file)
 #include "notify.h"
 
 
+
+/**
+ * Load config for the given mux
+ */
+void
+dvb_transport_load(th_dvb_mux_instance_t *tdmi)
+{
+  htsmsg_t *l, *c;
+  htsmsg_field_t *f;
+  uint32_t sid, pmt;
+  const char *s;
+  unsigned int u32;
+  th_transport_t *t;
+
+  if((l = hts_settings_load("dvbtransports/%s", tdmi->tdmi_identifier)) == NULL)
+    return;
+  
+  HTSMSG_FOREACH(f, l) {
+    if((c = htsmsg_get_msg_by_field(f)) == NULL)
+      continue;
+
+    if(htsmsg_get_u32(c, "service_id", &sid))
+      continue;
+
+    if(htsmsg_get_u32(c, "pmt", &pmt))
+      continue;
+    
+    t = dvb_transport_find(tdmi, sid, pmt, NULL);
+
+    htsmsg_get_u32(c, "stype", &t->tht_servicetype);
+    if(htsmsg_get_u32(c, "scrambled", &u32))
+      u32 = 0;
+    t->tht_scrambled = u32;
+
+    s = htsmsg_get_str(c, "provider") ?: "unknown";
+    t->tht_provider = strdup(s);
+
+    s = htsmsg_get_str(c, "servicename") ?: "unknown";
+    t->tht_svcname = strdup(s);
+
+    s = htsmsg_get_str(c, "channelname");
+    if(s != NULL) {
+      t->tht_chname = strdup(s);
+    } else {
+      t->tht_chname = strdup(t->tht_svcname);
+    }
+
+    psi_load_transport_settings(c, t);
+
+    if(!htsmsg_get_u32(c, "mapped", &u32) && u32)
+      transport_map_channel(t, NULL);
+  }
+  htsmsg_destroy(l);
+}
+
 /**
  *
  */
@@ -73,9 +128,12 @@ dvb_transport_save(th_transport_t *t)
 
   htsmsg_add_u32(m, "mapped", !!t->tht_ch);
   
-  psi_get_transport_settings(m, t);
+  psi_save_transport_settings(m, t);
   
-  hts_settings_save(m, "dvbtransports/%s", t->tht_identifier);
+  hts_settings_save(m, "dvbtransports/%s/%s",
+                   t->tht_dvb_mux_instance->tdmi_identifier,
+                   t->tht_identifier);
+
   htsmsg_destroy(m);
 }
 
diff --git a/psi.c b/psi.c
index ebd49e687ae87b5b56387cc49ad4b6f35c558379..790ae90c6a453c9a2f236fc5f188dfc1e852338a 100644 (file)
--- a/psi.c
+++ b/psi.c
@@ -288,6 +288,9 @@ psi_parse_pmt(th_transport_t *t, uint8_t *ptr, int len, int chksvcid)
     }
   }
 
+  if(t->tht_pmt_seen == 0)
+    t->tht_config_change(t);
+
   t->tht_pmt_seen = 1;
   return 0;
 }
@@ -546,7 +549,7 @@ htstvstreamtype2txt(tv_streamtype_t s)
  * Store transport settings into message
  */
 void
-psi_get_transport_settings(htsmsg_t *m, th_transport_t *t)
+psi_save_transport_settings(htsmsg_t *m, th_transport_t *t)
 {
   th_stream_t *st;
   htsmsg_t *sub;
@@ -575,51 +578,55 @@ psi_get_transport_settings(htsmsg_t *m, th_transport_t *t)
 }
 
 
-#if 0
 /**
- * Load transport info
+ * Load transport info from htsmsg
  */
 void
-psi_load_transport(struct config_head *cl, th_transport_t *t)
+psi_load_transport_settings(htsmsg_t *m, th_transport_t *t)
 {
+  htsmsg_t *c;
+  htsmsg_field_t *f;
+  uint32_t u32;
   th_stream_t *st;
-  config_entry_t *ce;
   tv_streamtype_t type;
   const char *v;
-  int pid, i;
+  uint32_t pid, i;
 
-  t->tht_pcr_pid = atoi(config_get_str_sub(cl, "pcr", "0"));
-  
-  t->tht_disabled = atoi(config_get_str_sub(cl, "disabled", "0"));
+  if(!htsmsg_get_u32(m, "pcr", &u32))
+    t->tht_pcr_pid = u32;
+
+  if(!htsmsg_get_u32(m, "disabled", &u32))
+    t->tht_disabled = u32;
+
+  HTSMSG_FOREACH(f, m) {
+    if(strcmp(f->hmf_name, "stream"))
+      continue;
+
+    if((c = htsmsg_get_msg_by_field(f)) == NULL)
+      continue;
 
-  TAILQ_FOREACH(ce, cl, ce_link) {
-    if(ce->ce_type != CFG_SUB || strcasecmp("stream", ce->ce_key))
+    if((v = htsmsg_get_str(c, "type")) == NULL)
       continue;
 
-    type = str2val(config_get_str_sub(&ce->ce_sub, "type", ""), streamtypetab);
+    type = str2val(v, streamtypetab);
     if(type == -1)
       continue;
 
-    pid = atoi(config_get_str_sub(&ce->ce_sub, "pid", "0"));
-    if(pid < 1)
+    if(htsmsg_get_u32(c, "pid", &pid))
       continue;
 
     st = transport_add_stream(t, pid, type);
     st->st_tb = (AVRational){1, 90000};
     
-    v = config_get_str_sub(&ce->ce_sub, "lang", NULL);
-    if(v != NULL)
+    if((v = htsmsg_get_str(c, "lang")) != NULL)
       av_strlcpy(st->st_lang, v, 4);
 
-    st->st_frame_duration =
-      atoi(config_get_str_sub(&ce->ce_sub, "frameduration", "0"));
+    if(!htsmsg_get_u32(c, "frameduration", &u32))
+      st->st_frame_duration = u32;
      
-    v = config_get_str_sub(&ce->ce_sub, "caid", NULL);
-    if(v != NULL) {
+    if((v = htsmsg_get_str(c, "caid")) != NULL) {
       i = str2val(v, caidnametab);
       st->st_caid = i < 0 ? strtol(v, NULL, 0) : i;
     }
   }
 }
-
-#endif
diff --git a/psi.h b/psi.h
index 95051fcda6d79025f05d5f3357733f0697a9183c..519a4c8e0c8f4689f6206a44a0c8fb9fcfd498a6 100644 (file)
--- a/psi.h
+++ b/psi.h
@@ -45,6 +45,7 @@ int psi_build_pmt(th_muxer_t *tm, uint8_t *buf0, int maxlen, int pcrpid);
 
 const char *psi_caid2name(uint16_t caid);
 
-void psi_get_transport_settings(htsmsg_t *m, th_transport_t *t);
+void psi_load_transport_settings(htsmsg_t *m, th_transport_t *t);
+void psi_save_transport_settings(htsmsg_t *m, th_transport_t *t);
 
 #endif /* PSI_H_ */