]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Add support for NIT-other tables. In particular useful for Ziggo DVB-C networks in .nl
authorAndreas Öman <andreas@lonelycoder.com>
Thu, 14 Jan 2010 22:56:05 +0000 (22:56 +0000)
committerAndreas Öman <andreas@lonelycoder.com>
Thu, 14 Jan 2010 22:56:05 +0000 (22:56 +0000)
Patch by Rigolo

src/dvb/dvb.h
src/dvb/dvb_adapter.c
src/dvb/dvb_tables.c
src/webui/extjs.c
src/webui/static/app/dvb.js

index e1f691cb71423bab49883544c641b073184a3516..556ab8d07db8490d97f0f917f068ee72dbe426e1 100644 (file)
@@ -168,6 +168,7 @@ typedef struct th_dvb_adapter {
   uint32_t tda_autodiscovery;
   uint32_t tda_idlescan;
   uint32_t tda_qmon;
+  uint32_t tda_nitoid;
   uint32_t tda_diseqc_version;
   char *tda_displayname;
 
@@ -222,6 +223,8 @@ void dvb_adapter_set_idlescan(th_dvb_adapter_t *tda, int on);
 
 void dvb_adapter_set_qmon(th_dvb_adapter_t *tda, int on);
 
+void dvb_adapter_set_nitoid(th_dvb_adapter_t *tda, int nitoid);
+
 void dvb_adapter_set_diseqc_version(th_dvb_adapter_t *tda, unsigned int v);
 
 void dvb_adapter_clone(th_dvb_adapter_t *dst, th_dvb_adapter_t *src);
index 55954d0bb0f9544efe6bae7c04fbffb978c6075d..b894d637313d84c80184b24918c0e1797416f2cb 100644 (file)
@@ -79,6 +79,7 @@ tda_save(th_dvb_adapter_t *tda)
   htsmsg_add_u32(m, "autodiscovery", tda->tda_autodiscovery);
   htsmsg_add_u32(m, "idlescan", tda->tda_idlescan);
   htsmsg_add_u32(m, "qmon", tda->tda_qmon);
+  htsmsg_add_u32(m, "nitoid", tda->tda_nitoid);
   htsmsg_add_u32(m, "diseqc_version", tda->tda_diseqc_version);
   hts_settings_save(m, "dvbadapters/%s", tda->tda_identifier);
   htsmsg_destroy(m);
@@ -165,6 +166,27 @@ dvb_adapter_set_qmon(th_dvb_adapter_t *tda, int on)
 }
 
 
+/**
+ *
+ */
+void
+dvb_adapter_set_nitoid(th_dvb_adapter_t *tda, int nitoid)
+{
+  lock_assert(&global_lock);
+
+  if(tda->tda_nitoid == nitoid)
+    return;
+
+  tvhlog(LOG_NOTICE, "dvb", "NIT-o network id \"%d\" changed to \"%d\"",
+        tda->tda_nitoid, nitoid);
+
+  tda->tda_nitoid = nitoid;
+  
+  tda_save(tda);
+
+}
+
+
 /**
  *
  */
@@ -334,6 +356,7 @@ dvb_adapter_init(uint32_t adapter_mask)
       htsmsg_get_u32(c, "autodiscovery", &tda->tda_autodiscovery);
       htsmsg_get_u32(c, "idlescan", &tda->tda_idlescan);
       htsmsg_get_u32(c, "qmon", &tda->tda_qmon);
+      htsmsg_get_u32(c, "nitoid", &tda->tda_nitoid);
       htsmsg_get_u32(c, "diseqc_version", &tda->tda_diseqc_version);
     }
     htsmsg_destroy(l);
index 6822f9ec99743a4d8c382f52a484369e4730dcb9..ed5ce90efb55c491a9882ccbe7c9eac8cb6d99ea 100644 (file)
@@ -977,9 +977,19 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
   int ntl;
   char networkname[256];
   uint16_t tsid;
+  uint16_t network_id = (ptr[0] << 8) | ptr[1];
 
-  if(tableid != 0x40)
-    return -1;
+  if(tdmi->tdmi_adapter->tda_nitoid) {
+    if(tableid != 0x41)
+      return -1;
+    
+    if(network_id != tdmi->tdmi_adapter->tda_nitoid)
+      return -1;
+
+  } else {
+    if(tableid != 0x40)
+      return -1;
+  }
 
   if((ptr[2] & 1) == 0) {
     /* current_next_indicator == next, skip this */
@@ -1169,7 +1179,12 @@ dvb_table_add_default_dvb(th_dvb_mux_instance_t *tdmi)
   /* Network Information Table */
 
   fp = dvb_fparams_alloc();
-  fp->filter.filter[0] = 0x40;
+
+  if(tdmi->tdmi_adapter->tda_nitoid) {
+    fp->filter.filter[0] = 0x41;
+  } else {
+    fp->filter.filter[0] = 0x40;
+  }
   fp->filter.mask[0] = 0xff;
   tdt_add(tdmi, fp, dvb_nit_callback, NULL, "nit", 
          TDT_QUICKREQ | TDT_CRC, 0x10, NULL);
index 0defcf83969aff00b95539a33b1cb92e4be4efd4..06867e6b118e8bdf1c05fb1e77a015726980ca5b 100644 (file)
@@ -1049,6 +1049,7 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque)
     htsmsg_add_u32(r, "automux", tda->tda_autodiscovery);
     htsmsg_add_u32(r, "idlescan", tda->tda_idlescan);
     htsmsg_add_u32(r, "qmon", tda->tda_qmon);
+    htsmsg_add_u32(r, "nitoid", tda->tda_nitoid);
     htsmsg_add_str(r, "diseqcversion", 
                   ((const char *[]){"DiSEqC 1.0 / 2.0",
                                       "DiSEqC 1.1 / 2.1"})
@@ -1069,6 +1070,9 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque)
     s = http_arg_get(&hc->hc_req_args, "qmon");
     dvb_adapter_set_qmon(tda, !!s);
 
+    if((s = http_arg_get(&hc->hc_req_args, "nitoid")) != NULL)
+      dvb_adapter_set_nitoid(tda, atoi(s));
+
     if((s = http_arg_get(&hc->hc_req_args, "diseqcversion")) != NULL) {
       if(!strcmp(s, "DiSEqC 1.0 / 2.0"))
        dvb_adapter_set_diseqc_version(tda, 0);
index 3b1a478c7a046d8121c731516b4dc343b80e064b..e0eae5b87e198bd87a77af82909051b63cb55176 100644 (file)
@@ -1008,7 +1008,7 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) {
 
     var confreader = new Ext.data.JsonReader({
        root: 'dvbadapters'
-    }, ['name', 'automux', 'idlescan', 'diseqcversion', 'qmon']);
+    }, ['name', 'automux', 'idlescan', 'diseqcversion', 'qmon', 'nitoid']);
 
     
     function saveConfForm () {
@@ -1036,7 +1036,13 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) {
        new Ext.form.Checkbox({
            fieldLabel: 'Monitor signal quality',
            name: 'qmon'
-       })
+       }),
+       {
+           fieldLabel: 'NIT-o Network ID',
+           name: 'nitoid',
+           width: 50
+       },
+
     ];
 
     if(satConfStore) {