]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts dvb: distinguish correctly between DVB-C/ANNEX-B and ATSC-C/ANNEX-B networks...
authorJaroslav Kysela <perex@perex.cz>
Wed, 20 Sep 2017 07:10:19 +0000 (09:10 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 9 Oct 2017 13:35:46 +0000 (15:35 +0200)
src/input/mpegts/dvb.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/dvb_support.c
src/input/mpegts/linuxdvb/linuxdvb_adapter.c
src/input/mpegts/mpegts_mux_dvb.c
src/input/mpegts/mpegts_network_scan.c
src/input/mpegts/scanfile.c
src/satip/rtsp.c

index b618cd50850dada07463ee75bddf32dbc9e4727c..9dd28468d5d70ac5fa3a612fbdf447dbaa011ee1 100644 (file)
@@ -28,6 +28,7 @@
 
 struct mpegts_table;
 struct mpegts_table_state;
+struct mpegts_network;
 struct mpegts_mux;
 struct lang_str;
 
@@ -644,9 +645,10 @@ static inline int dvb_bandwidth( dvb_fe_bandwidth_t bw )
   return bw < 1000 ? 0 : bw * 1000;
 }
 
-int dvb_delsys2type ( enum dvb_fe_delivery_system ds );
+int dvb_delsys2type ( struct mpegts_network *ln, enum dvb_fe_delivery_system ds );
 
-void dvb_mux_conf_init ( dvb_mux_conf_t *dmc, dvb_fe_delivery_system_t delsys );
+void dvb_mux_conf_init ( struct mpegts_network *ln, dvb_mux_conf_t *dmc,
+                         dvb_fe_delivery_system_t delsys );
 
 int dvb_mux_conf_str ( dvb_mux_conf_t *conf, char *buf, size_t bufsize );
 
index b08181c611bf12e7e82aafc19078740976bf5f0f..1bda67d090885658bd241ed31b4ef7baee4d8960 100644 (file)
@@ -277,7 +277,8 @@ dvb_desc_sat_del
 
   polarisation = (ptr[6] >> 5) & 0x03;
 
-  dvb_mux_conf_init(&dmc, (ptr[6] & 0x4) ? DVB_SYS_DVBS2 : DVB_SYS_DVBS);
+  dvb_mux_conf_init((mpegts_network_t *)mm->mm_network, &dmc,
+                    (ptr[6] & 0x4) ? DVB_SYS_DVBS2 : DVB_SYS_DVBS);
 
   dmc.dmc_fe_freq                = frequency;
   dmc.u.dmc_fe_qpsk.orbital_pos  = orbitalpos;
@@ -352,7 +353,8 @@ dvb_desc_cable_del
     return NULL;
   }
 
-  dvb_mux_conf_init(&dmc, ((dvb_mux_t *)mm)->lm_tuning.dmc_fe_delsys);
+  dvb_mux_conf_init((mpegts_network_t *)mm->mm_network, &dmc,
+                    ((dvb_mux_t *)mm)->lm_tuning.dmc_fe_delsys);
 
   dmc.dmc_fe_freq            = frequency * 100;
 
@@ -418,7 +420,7 @@ dvb_desc_terr_del
     return NULL;
   }
 
-  dvb_mux_conf_init(&dmc, DVB_SYS_DVBT);
+  dvb_mux_conf_init((mpegts_network_t *)mm->mm_network, &dmc, DVB_SYS_DVBT);
 
   dmc.dmc_fe_freq                         = frequency * 10;
   dmc.u.dmc_fe_ofdm.bandwidth             = btab[(ptr[4] >> 5) & 0x7];
@@ -2756,7 +2758,10 @@ psi_tables_install ( mpegts_input_t *mi, mpegts_mux_t *mm,
     psi_tables_atsc_t(mm);
     break;
   case DVB_SYS_DVBC_ANNEX_B:
-    psi_tables_atsc_c(mm);
+    if (idnode_is_instance(&mm->mm_id, &dvb_mux_dvbc_class))
+      psi_tables_dvb(mm);
+    else
+      psi_tables_atsc_c(mm);
     break;
   case DVB_SYS_NONE:
   case DVB_SYS_DVBH:
index 95fbf441d2bb78ffa6bd715738aea398af22204f..fc11a24118b84bbdeee05b6a82d9b2f9fd8baad4 100644 (file)
@@ -719,7 +719,7 @@ const static struct strtab delsystab[] = {
 dvb_str2val(delsys);
 
 int
-dvb_delsys2type ( dvb_fe_delivery_system_t delsys )
+dvb_delsys2type ( mpegts_network_t *ln, dvb_fe_delivery_system_t delsys )
 {
   switch (delsys) {
     case DVB_SYS_DVBC_ANNEX_A:
@@ -736,7 +736,10 @@ dvb_delsys2type ( dvb_fe_delivery_system_t delsys )
     case DVB_SYS_ATSCMH:
       return DVB_TYPE_ATSC_T;
     case DVB_SYS_DVBC_ANNEX_B:
-      return DVB_TYPE_ATSC_C;
+      if (ln && idnode_is_instance(&ln->mn_id, &dvb_network_dvbc_class))
+        return DVB_TYPE_C;
+      else
+        return DVB_TYPE_ATSC_C;
     case DVB_SYS_ISDBT:
       return DVB_TYPE_ISDB_T;
     case DVB_SYS_ISDBC:
@@ -980,10 +983,12 @@ dvb_str2val(plsmode);
 
 
 void
-dvb_mux_conf_init ( dvb_mux_conf_t *dmc, dvb_fe_delivery_system_t delsys )
+dvb_mux_conf_init ( mpegts_network_t *ln,
+                    dvb_mux_conf_t *dmc,
+                    dvb_fe_delivery_system_t delsys )
 {
   memset(dmc, 0, sizeof(*dmc));
-  dmc->dmc_fe_type      = dvb_delsys2type(delsys);
+  dmc->dmc_fe_type      = dvb_delsys2type(ln, delsys);
   dmc->dmc_fe_delsys    = delsys;
   dmc->dmc_fe_inversion = DVB_INVERSION_AUTO;
   dmc->dmc_fe_pilot     = DVB_PILOT_AUTO;
@@ -1020,10 +1025,16 @@ dvb_mux_conf_str_dvbt ( dvb_mux_conf_t *dmc, char *buf, size_t bufsize )
 static int
 dvb_mux_conf_str_dvbc ( dvb_mux_conf_t *dmc, char *buf, size_t bufsize )
 {
+  const char *delsys;
+  if (dmc->dmc_fe_type == DVB_TYPE_C &&
+      dmc->dmc_fe_delsys == DVB_SYS_DVBC_ANNEX_B)
+    delsys = "DVB-C/ANNEX_B";
+  else
+    delsys = dvb_delsys2str(dmc->dmc_fe_delsys);
   return
   snprintf(buf, bufsize,
            "%s freq %d sym %d mod %s fec %s",
-           dvb_delsys2str(dmc->dmc_fe_delsys),
+           delsys,
            dmc->dmc_fe_freq,
            dmc->u.dmc_fe_qam.symbol_rate,
            dvb_qam2str(dmc->dmc_fe_modulation),
index deb4ac73eaf2c1536042e7acd29f87c845561ce6..cadf697a65d82295725f73f5a3efede5133f9283 100644 (file)
@@ -411,7 +411,7 @@ linuxdvb_adapter_add ( const char *path )
         delsys = DVB_SYS_DVBS;
 
       /* Invalid */
-      if ((type5 = dvb_delsys2type(delsys)) == DVB_TYPE_NONE)
+      if ((type5 = dvb_delsys2type(NULL, delsys)) == DVB_TYPE_NONE)
         continue;
 
       /* Couldn't find */
index ff9898edd4c344ccc0c4fd8d14b7c39dead099b9..134098fc8d7e36cd27c877aca318f3ef004b85ce 100644 (file)
@@ -293,6 +293,7 @@ dvb_mux_dvbc_class_delsys_enum (void *o, const char *lang)
 {
   htsmsg_t *list = htsmsg_create_list();
   htsmsg_add_str(list, NULL, dvb_delsys2str(DVB_SYS_DVBC_ANNEX_A));
+  htsmsg_add_str(list, NULL, dvb_delsys2str(DVB_SYS_DVBC_ANNEX_B));
   htsmsg_add_str(list, NULL, dvb_delsys2str(DVB_SYS_DVBC_ANNEX_C));
   return list;
 }
@@ -1018,7 +1019,7 @@ dvb_mux_create0
   lm = (dvb_mux_t*)mm;
 
   /* Defaults */
-  dvb_mux_conf_init(&lm->lm_tuning, delsys);
+  dvb_mux_conf_init((mpegts_network_t*)ln, &lm->lm_tuning, delsys);
 
   /* Parent init and load config */
   if (!(mm = mpegts_mux_create0(mm, idc, uuid,
index 8c1752a5c719041aa1d5476d86288ef38ec02d93..c643a7c09ea41b543148aa9f1bf254e1848de251 100644 (file)
@@ -389,7 +389,7 @@ tsid_lookup:
         mpegts_mux_t *mm = NULL;
 
         mux = malloc(sizeof(dvb_mux_conf_t));
-        dvb_mux_conf_init(mux, dvbs2 ? DVB_SYS_DVBS2 : DVB_SYS_DVBS);
+        dvb_mux_conf_init(mn, mux, dvbs2 ? DVB_SYS_DVBS2 : DVB_SYS_DVBS);
         mux->dmc_fe_freq = freq;
         mux->u.dmc_fe_qpsk.symbol_rate = symbol;
         mux->u.dmc_fe_qpsk.polarisation = dvb_str2pol(pol);
index 3f7732108097258cebd31b96146e4b0ac9e8af78..e3117492e3278227360c5d53a378f471638c0961 100644 (file)
@@ -134,7 +134,7 @@ scanfile_load_atsc ( dvb_mux_conf_t *mux, const char *line )
 
   r = sscanf(line, "%u %s", &mux->dmc_fe_freq, qam);
   if (r != 2) return 1;
-  dvb_mux_conf_init(mux, DVB_SYS_ATSC);
+  dvb_mux_conf_init(NULL, mux, DVB_SYS_ATSC);
   if ((mux->dmc_fe_modulation = dvb_str2qam(qam)) == -1) return 1;
 
   return 0;
@@ -148,7 +148,7 @@ scanfile_load_dvbt ( dvb_mux_conf_t *mux, const char *line )
 
   if (*line == '2') {
     unsigned int system_id;
-    dvb_mux_conf_init(mux, DVB_SYS_DVBT2);
+    dvb_mux_conf_init(NULL, mux, DVB_SYS_DVBT2);
     r = sscanf(line+1, "%u %s", &mux->dmc_fe_stream_id, bw);
     if (r == 2 && mux->dmc_fe_stream_id < 1000 && strstr(bw, "MHz") == 0) {
       r = sscanf(line+1, "%u %u %u %10s %10s %10s %10s %10s %10s %10s",
@@ -163,7 +163,7 @@ scanfile_load_dvbt ( dvb_mux_conf_t *mux, const char *line )
       if(r != 9) return 1;
     }
   } else {
-    dvb_mux_conf_init(mux, DVB_SYS_DVBT);
+    dvb_mux_conf_init(NULL, mux, DVB_SYS_DVBT);
     r = sscanf(line, "%u %10s %10s %10s %10s %10s %10s %10s",
                     &mux->dmc_fe_freq, bw, fec, fec2, qam, mode, guard, hier);
     if(r != 8) return 1;
@@ -191,7 +191,7 @@ scanfile_load_dvbs ( dvb_mux_conf_t *mux, const char *line )
     line++;
   }
 
-  dvb_mux_conf_init(mux, v2 ? DVB_SYS_DVBS2 : DVB_SYS_DVBS);
+  dvb_mux_conf_init(NULL, mux, v2 ? DVB_SYS_DVBS2 : DVB_SYS_DVBS);
 
   r = sscanf(line, "%u %s %u %s %s %s %d %d %d",
                   &mux->dmc_fe_freq, pol, &mux->u.dmc_fe_qpsk.symbol_rate,
@@ -224,7 +224,7 @@ scanfile_load_dvbc ( dvb_mux_conf_t *mux, const char *line )
                   &mux->dmc_fe_freq, &mux->u.dmc_fe_qam.symbol_rate, fec, qam);
   if(r != 4) return 1;
 
-  dvb_mux_conf_init(mux, DVB_SYS_DVBC_ANNEX_A);
+  dvb_mux_conf_init(NULL, mux, DVB_SYS_DVBC_ANNEX_A);
   if ((mux->u.dmc_fe_qam.fec_inner  = dvb_str2fec(fec)) == -1) return 1;
   if ((mux->dmc_fe_modulation       = dvb_str2qam(qam)) == -1) return 1;
 
@@ -515,7 +515,7 @@ scanfile_load_dvbv5
   if (!x || (int)mux->dmc_fe_delsys < 0)
     mux_fail(r, "wrong system '%s'", x);
 
-  dvb_mux_conf_init(mux, mux->dmc_fe_delsys);
+  dvb_mux_conf_init(NULL, mux, mux->dmc_fe_delsys);
 
   if (mux->dmc_fe_delsys == DVB_SYS_DVBT ||
       mux->dmc_fe_delsys == DVB_SYS_DVBT2) {
index b49bf7eac64f56e1414e2b4595aa7830d4aaefae..c974e0b00bf9fbe0f401c27b64b666ea03d56c9c 100644 (file)
@@ -1019,7 +1019,7 @@ rtsp_parse_cmd
     }
   }
 
-  dvb_mux_conf_init(dmc = &rs->dmc, msys);
+  dvb_mux_conf_init(NULL, dmc = &rs->dmc, msys);
 
   mtype = mtype_to_tvh(hc);
   if (mtype == DVB_MOD_NONE) goto end;