From: Jaroslav Kysela Date: Wed, 20 Sep 2017 07:10:19 +0000 (+0200) Subject: mpegts dvb: distinguish correctly between DVB-C/ANNEX-B and ATSC-C/ANNEX-B networks... X-Git-Tag: v4.2.4~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=af49588ae600b3c299f016bf248cbb10dd2ad53a;p=thirdparty%2Ftvheadend.git mpegts dvb: distinguish correctly between DVB-C/ANNEX-B and ATSC-C/ANNEX-B networks, fixes #4529 --- diff --git a/src/input/mpegts/dvb.h b/src/input/mpegts/dvb.h index b618cd508..9dd28468d 100644 --- a/src/input/mpegts/dvb.h +++ b/src/input/mpegts/dvb.h @@ -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 ); diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index b08181c61..1bda67d09 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -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: diff --git a/src/input/mpegts/dvb_support.c b/src/input/mpegts/dvb_support.c index 95fbf441d..fc11a2411 100644 --- a/src/input/mpegts/dvb_support.c +++ b/src/input/mpegts/dvb_support.c @@ -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), diff --git a/src/input/mpegts/linuxdvb/linuxdvb_adapter.c b/src/input/mpegts/linuxdvb/linuxdvb_adapter.c index deb4ac73e..cadf697a6 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_adapter.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_adapter.c @@ -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 */ diff --git a/src/input/mpegts/mpegts_mux_dvb.c b/src/input/mpegts/mpegts_mux_dvb.c index ff9898edd..134098fc8 100644 --- a/src/input/mpegts/mpegts_mux_dvb.c +++ b/src/input/mpegts/mpegts_mux_dvb.c @@ -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, diff --git a/src/input/mpegts/mpegts_network_scan.c b/src/input/mpegts/mpegts_network_scan.c index 8c1752a5c..c643a7c09 100644 --- a/src/input/mpegts/mpegts_network_scan.c +++ b/src/input/mpegts/mpegts_network_scan.c @@ -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); diff --git a/src/input/mpegts/scanfile.c b/src/input/mpegts/scanfile.c index 3f7732108..e3117492e 100644 --- a/src/input/mpegts/scanfile.c +++ b/src/input/mpegts/scanfile.c @@ -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) { diff --git a/src/satip/rtsp.c b/src/satip/rtsp.c index b49bf7eac..c974e0b00 100644 --- a/src/satip/rtsp.c +++ b/src/satip/rtsp.c @@ -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;