]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Keep track of transport-id for each mux so we can do cross-transport EPG updates
authorAndreas Öman <andreas@lonelycoder.com>
Sat, 19 Apr 2008 14:11:21 +0000 (14:11 +0000)
committerAndreas Öman <andreas@lonelycoder.com>
Sat, 19 Apr 2008 14:11:21 +0000 (14:11 +0000)
ajaxui/ajaxui_config_dvb.c
dvb.c
dvb.h
dvb_muxconfig.c
dvb_muxconfig.h
dvb_tables.c

index 28722e140e45da38b3dd9eba054c1e8f3a0db1a4..222b4183033be8dd175f2f46a73206c3362c6486 100644 (file)
@@ -498,6 +498,7 @@ ajax_adaptercreatemux(http_connection_t *hc, http_reply_t *hr,
     return HTTP_STATUS_NOT_FOUND;
 
   v = dvb_mux_create_str(tda,
+                        "65535",
                         http_arg_get(&hc->hc_req_args, "freq"),
                         http_arg_get(&hc->hc_req_args, "symrate"),
                         http_arg_get(&hc->hc_req_args, "const"),
diff --git a/dvb.c b/dvb.c
index 0164572f2af4ee530b16a657656f6af7614f61dc..f556076901250674e4879deb441d85b2e3e4ce4b 100644 (file)
Binary files a/dvb.c and b/dvb.c differ
diff --git a/dvb.h b/dvb.h
index 16db8e986468b8152951cbcca2942cbb1354ab1f..f47918b7bd6653691b0b769537ed7d280bb28b3c 100644 (file)
--- a/dvb.h
+++ b/dvb.h
@@ -53,8 +53,10 @@ th_transport_t *dvb_find_transport(th_dvb_mux_instance_t *tdmi,
 th_dvb_mux_instance_t *dvb_mux_create(th_dvb_adapter_t *tda,
                                      struct dvb_frontend_parameters *fe_param,
                                      int polarisation, int switchport,
-                                     int save);
+                                     int save, uint16_t tsid);
 
 void dvb_tdmi_save(th_dvb_mux_instance_t *tdmi);
 
+void dvb_tda_save(th_dvb_adapter_t *tda);
+
 #endif /* DVB_H_ */
index bec16bea6599bb2325dc507fcde9ad90271d610b..cbafde3547ab8b1482d00125b37c0b93868294fc 100644 (file)
@@ -98,6 +98,8 @@ dvb_mux_store(FILE *fp, th_dvb_mux_instance_t *tdmi)
 {
   struct dvb_frontend_parameters *f = tdmi->tdmi_fe_params;
 
+  fprintf(fp, "\ttransportstreamid = %d\n", tdmi->tdmi_transport_stream_id);
+
   fprintf(fp, "\tfrequency = %d\n", f->frequency);
   
   switch(tdmi->tdmi_adapter->tda_fe_info->type) {
@@ -156,6 +158,7 @@ dvb_mux_store(FILE *fp, th_dvb_mux_instance_t *tdmi)
  */
 const char *
 dvb_mux_create_str(th_dvb_adapter_t *tda,
+                  const char *tsidstr,
                   const char *freqstr,
                   const char *symratestr,
                   const char *qamstr,
@@ -173,7 +176,7 @@ dvb_mux_create_str(th_dvb_adapter_t *tda,
   struct dvb_frontend_parameters f;
   int r;
   int polarisation = 0, switchport = 0;
-
   memset(&f, 0, sizeof(f));
   
   f.inversion = INVERSION_AUTO;
@@ -247,7 +250,7 @@ dvb_mux_create_str(th_dvb_adapter_t *tda,
     break;
   }
 
-  dvb_mux_create(tda, &f, polarisation, switchport, save);
+  dvb_mux_create(tda, &f, polarisation, switchport, save, atoi(tsidstr));
 
   return NULL;
 }
index dcdd20fc2691da3fa5cf6e868c5ad3073dd9fa9e..37d457dcae85295e86f8bb36e6c9281e0dd3d22c 100644 (file)
@@ -22,6 +22,7 @@
 void dvb_mux_store(FILE *fp, th_dvb_mux_instance_t *tdmi);
 
 const char *dvb_mux_create_str(th_dvb_adapter_t *tda,
+                              const char *tsidstr,
                               const char *freqstr,
                               const char *symratestr,
                               const char *qamstr,
index 469b450954fbe02d36eadef7d70b49da75e6a326..f2f331e3711f27bf34743e51085a41eb3fa72033 100644 (file)
@@ -202,6 +202,7 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
 {
   th_transport_t *t;
   th_channel_t *ch;
+  th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
 
   uint16_t serviceid;
   int version;
@@ -224,6 +225,8 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
   char desc[5000];
   epg_content_type_t *ect;
 
+  //  printf("EIT!, tid = %x\n", tableid);
+
   if(tableid < 0x4e || tableid > 0x6f || len < 11)
     return;
 
@@ -240,6 +243,14 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
   len -= 11;
   ptr += 11;
 
+  /* Search all muxes on adapter */
+  LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
+    if(tdmi->tdmi_transport_stream_id == transport_stream_id)
+      break;
+  
+  if(tdmi == NULL)
+    return;
+
   t = dvb_find_transport(tdmi, serviceid, 0, NULL);
   if(t == NULL)
     return;
@@ -445,6 +456,11 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
 
   tid = (ptr[0] << 8) | ptr[1];
 
+  if(tdmi->tdmi_transport_stream_id != tid) {
+    tdmi->tdmi_transport_stream_id = tid;
+    dvb_tda_save(tdmi->tdmi_adapter);
+  }
+
   ptr += 5;
   len -= 5;
 
@@ -514,7 +530,8 @@ static const fe_modulation_t qam_tab [6] = {
  * Cable delivery descriptor
  */
 static void
-dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len)
+dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
+                        uint16_t tsid)
 {
   int freq, symrate;
   struct dvb_frontend_parameters fe_param;
@@ -546,14 +563,15 @@ dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len)
 
   fe_param.u.qam.fec_inner = fec_tab[ptr[10] & 0x07];
 
-  dvb_mux_create(tdmi->tdmi_adapter, &fe_param, 0, 0, 1);
+  dvb_mux_create(tdmi->tdmi_adapter, &fe_param, 0, 0, 1, tsid);
 }
 
 /**
  * Satellite delivery descriptor
  */
 static void
-dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len)
+dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
+                      uint16_t tsid)
 {
   int freq, symrate, pol;
   struct dvb_frontend_parameters fe_param;
@@ -578,7 +596,8 @@ dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len)
 
   pol = (ptr[6] >> 5) & 0x03;
 
-  dvb_mux_create(tdmi->tdmi_adapter, &fe_param, pol, tdmi->tdmi_switchport, 1);
+  dvb_mux_create(tdmi->tdmi_adapter, &fe_param, pol, tdmi->tdmi_switchport, 1,
+                tsid);
 }
 
 
@@ -658,10 +677,10 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
 
       switch(tag) {
       case DVB_DESC_SAT:
-       dvb_table_sat_delivery(tdmi, ptr, tlen);
+       dvb_table_sat_delivery(tdmi, ptr, tlen, tsid);
        break;
       case DVB_DESC_CABLE:
-       dvb_table_cable_delivery(tdmi, ptr, tlen);
+       dvb_table_cable_delivery(tdmi, ptr, tlen, tsid);
        break;
       }