]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb: re-instate some of the form scanning code.
authorAdam Sutton <dev@adamsutton.me.uk>
Fri, 1 Feb 2013 20:53:36 +0000 (20:53 +0000)
committerAdam Sutton <dev@adamsutton.me.uk>
Fri, 1 Feb 2013 21:02:03 +0000 (21:02 +0000)
Mux TSID and ONID can now be updated from other tables if, and only if,
they values are not yet set. Values from the NIT will ALWAYS override
existing values, as they're hopefully more reliable.

src/dvb/dvb.h
src/dvb/dvb_multiplex.c
src/dvb/dvb_tables.c

index 28a9587d72e1b59f16c0ae85b2fad2fb8d693add..50ce547a75204465834cae2f2a6028a07f31b3fb 100644 (file)
@@ -429,9 +429,9 @@ th_dvb_mux_instance_t *dvb_mux_create(th_dvb_adapter_t *tda,
 
 void dvb_mux_set_networkname(th_dvb_mux_instance_t *tdmi, const char *name);
 
-void dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid);
+void dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid, int force);
 
-void dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid);
+void dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid, int force);
 
 void dvb_mux_set_enable(th_dvb_mux_instance_t *tdmi, int enabled);
 
index 7f0eb0c36215fe2774414c62920cb53c7215c7f3..7fd5e2c25e9794e7b55deddcda9d7e5e4e73e4cb 100644 (file)
@@ -169,12 +169,14 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
   }
 
   if(tdmi != NULL) {
+
     /* Update stuff ... */
     int save = 0;
     char buf2[1024];
     buf2[0] = 0;
 
-    if(tdmi_compare_conf(tda->tda_type, &tdmi->tdmi_conf, dmc)) {
+    if(tdmi->tdmi_adapter->tda_autodiscovery &&
+       tdmi_compare_conf(tda->tda_type, &tdmi->tdmi_conf, dmc)) {
 #if DVB_API_VERSION >= 5
       snprintf(buf2, sizeof(buf2), " (");
       if (tdmi->tdmi_conf.dmc_fe_modulation != dmc->dmc_fe_modulation)
@@ -861,10 +863,14 @@ dvb_mux_set_networkname(th_dvb_mux_instance_t *tdmi, const char *networkname)
  *
  */
 void
-dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid)
+dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid, int force)
 {
   htsmsg_t *m;
 
+  if (!force)
+    if (tdmi->tdmi_transport_stream_id != 0xFFFF || tsid == 0xFFFF)
+      return;
+
   tdmi->tdmi_transport_stream_id = tsid;
  
   dvb_mux_save(tdmi);
@@ -879,10 +885,14 @@ dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid)
  *
  */
 void
-dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid)
+dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid, int force)
 {
   htsmsg_t *m;
 
+  if (force)
+    if (tdmi->tdmi_network_id != 0 || onid == 0)
+      return;
+
   tdmi->tdmi_network_id = onid;
  
   dvb_mux_save(tdmi);
index 302c7b53b8965e105b6d0d19b7781948c31084ef..f3ddb560f7aefa0df009e7322dfa6b42eaab25d7 100644 (file)
@@ -342,6 +342,8 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
   tsid         = ptr[0] << 8 | ptr[1];
   onid         = ptr[5] << 8 | ptr[6];
   if (tableid == 0x42) {
+    dvb_mux_set_tsid(tdmi, tsid, 0);
+    dvb_mux_set_onid(tdmi, onid, 0);
     if(tdmi->tdmi_transport_stream_id != tsid || tdmi->tdmi_network_id != onid)
       return -1;
   } else {
@@ -504,6 +506,7 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
   }
 
   tsid = (ptr[0] << 8) | ptr[1];
+  dvb_mux_set_tsid(tdmi, tsid, 0);
   if (tdmi->tdmi_transport_stream_id != tsid)
     return -1;
 
@@ -844,11 +847,11 @@ dvb_table_local_channel(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
       t = dvb_service_find(tdmi, sid, 0, NULL);
       if(t != NULL) {
 
-       if(t->s_channel_number != chan) {
-         t->s_channel_number = chan;
-         t->s_config_save(t);
-         service_refresh_channel(t);
-       }
+        if(t->s_channel_number != chan) {
+          t->s_channel_number = chan;
+          t->s_config_save(t);
+          service_refresh_channel(t);
+        }
       }
     }
     ptr += 4;
@@ -999,8 +1002,9 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
     
     /* Search all muxes on adapter */
     LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
-      if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid);
-       break;
+      if(tdmi->tdmi_transport_stream_id == tsid &&
+         tdmi->tdmi_network_id          == onid);
+             break;
     
     if(tdmi == NULL)
       continue;