DVB_ROLLOFF_35 = 350,
} dvb_fe_rolloff_t;
+typedef enum dvb_fe_pls_mode {
+ DVB_PLS_ROOT = 0,
+ DVB_PLS_GOLD,
+ DVB_PLS_COMBO,
+} dvb_fe_pls_mode_t;
+
typedef enum dvb_polarisation {
DVB_POLARISATION_HORIZONTAL = 0x00,
DVB_POLARISATION_VERTICAL = 0x01,
dvb_fe_spectral_inversion_t dmc_fe_inversion;
dvb_fe_rolloff_t dmc_fe_rolloff;
dvb_fe_pilot_t dmc_fe_pilot;
+ int32_t dmc_fe_stream_id;
+ dvb_fe_pls_mode_t dmc_fe_pls_mode;
+ uint32_t dmc_fe_pls_code;
union {
dvb_qpsk_config_t dmc_fe_qpsk;
dvb_qam_config_t dmc_fe_qam;
const char *dvb_pol2str ( int pol );
const char *dvb_type2str ( int type );
const char *dvb_pilot2str ( int pilot );
+const char *dvb_plsmode2str ( int pls_mode );
#define dvb_feclo2str dvb_fec2str
#define dvb_fechi2str dvb_fec2str
int dvb_str2pol ( const char *str );
int dvb_str2type ( const char *str );
int dvb_str2pilot ( const char *str );
+int dvb_str2plsmode ( const char *str );
#define dvb_str2feclo dvb_str2fec
#define dvb_str2fechi dvb_str2fec
{"OFF", DVB_PILOT_OFF}
};
dvb_str2val(pilot);
+
+const static struct strtab plsmodetab[] = {
+ {"ROOT", DVB_PLS_ROOT},
+ {"GOLD", DVB_PLS_GOLD},
+ {"COMBO", DVB_PLS_COMBO},
+};
+dvb_str2val(plsmode);
#undef dvb_str2val
+
+
static int
dvb_mux_conf_str_dvbt ( dvb_mux_conf_t *dmc, char *buf, size_t bufsize )
{
return
snprintf(buf, bufsize,
- "%s freq %d bw %s cons %s hier %s code_rate %s:%s guard %s trans %s",
+ "%s freq %d bw %s cons %s hier %s code_rate %s:%s guard %s trans %s plp_id %d",
dvb_delsys2str(dmc->dmc_fe_delsys),
dmc->dmc_fe_freq,
dvb_bw2str(dmc->u.dmc_fe_ofdm.bandwidth),
dvb_fec2str(dmc->u.dmc_fe_ofdm.code_rate_HP),
dvb_fec2str(dmc->u.dmc_fe_ofdm.code_rate_LP),
dvb_guard2str(dmc->u.dmc_fe_ofdm.guard_interval),
- dvb_mode2str(dmc->u.dmc_fe_ofdm.transmission_mode));
+ dvb_mode2str(dmc->u.dmc_fe_ofdm.transmission_mode),
+ dmc->dmc_fe_stream_id);
}
static int
const char dir = dmc->u.dmc_fe_qpsk.orbital_dir;
return
snprintf(buf, bufsize,
- "%s pos %d.%d%c freq %d %c sym %d fec %s mod %s roff %s",
+ "%s pos %d.%d%c freq %d %c sym %d fec %s mod %s roff %s is_id %d pls_mode %s pls_code %d",
dvb_delsys2str(dmc->dmc_fe_delsys),
dmc->u.dmc_fe_qpsk.orbital_pos / 10,
dmc->u.dmc_fe_qpsk.orbital_pos % 10,
dmc->u.dmc_fe_qpsk.symbol_rate,
dvb_fec2str(dmc->u.dmc_fe_qpsk.fec_inner),
dvb_qam2str(dmc->dmc_fe_modulation),
- dvb_rolloff2str(dmc->dmc_fe_rolloff));
+ dvb_rolloff2str(dmc->dmc_fe_rolloff),
+ dmc->dmc_fe_stream_id,
+ dvb_plsmode2str(dmc->dmc_fe_pls_mode),
+ dmc->dmc_fe_pls_code);
}
static int
S2CMD(DTV_GUARD_INTERVAL, p.u.ofdm.guard_interval);
S2CMD(DTV_HIERARCHY, p.u.ofdm.hierarchy_information);
#endif
+ if (lm->lm_tuning.dmc_fe_delsys == DVB_SYS_DVBT2) {
+#if DVB_VER_ATLEAST(5,9)
+ S2CMD(DTV_STREAM_ID, dmc->dmc_fe_stream_id);
+#elif DVB_VER_ATLEAST(5,3)
+ S2CMD(DTV_DVBT2_PLP_ID, dmc->dmc_fe_stream_id);
+#endif
+ }
/* DVB-C */
} else if (lfe->lfe_type == DVB_TYPE_C) {
} else if (lfe->lfe_type == DVB_TYPE_S) {
S2CMD(DTV_SYMBOL_RATE, p.u.qpsk.symbol_rate);
S2CMD(DTV_INNER_FEC, p.u.qpsk.fec_inner);
- S2CMD(DTV_PILOT, TR(pilot, pilot_tbl, PILOT_AUTO));
S2CMD(DTV_MODULATION, TR(modulation, mod_tbl, QPSK));
if (lm->lm_tuning.dmc_fe_delsys == DVB_SYS_DVBS) {
S2CMD(DTV_ROLLOFF, ROLLOFF_35);
} else {
+ S2CMD(DTV_PILOT, TR(pilot, pilot_tbl, PILOT_AUTO));
S2CMD(DTV_ROLLOFF, TR(rolloff, rolloff_tbl, ROLLOFF_AUTO));
+ r = dmc->dmc_fe_stream_id != -1 ? (dmc->dmc_fe_stream_id & 0xFF) |
+ ((dmc->dmc_fe_pls_code & 0x3FFFF)<<8) | ((dmc->dmc_fe_pls_mode & 0x3)<<26) : r;
+#if DVB_VER_ATLEAST(5,9)
+ S2CMD(DTV_STREAM_ID, r );
+#elif DVB_VER_ATLEAST(5,3)
+ S2CMD(DTV_DVBT2_PLP_ID, r);
+#endif
}
/* ATSC */
{
MUX_PROP_STR("fec_lo", "FEC Low", dvbt, feclo, "AUTO"),
},
+ {
+ .type = PT_INT,
+ .id = "plp_id",
+ .name = "PLP ID",
+ .off = offsetof(dvb_mux_t, lm_tuning.dmc_fe_stream_id),
+ .def.i = 0,
+ },
{}
}
};
return list;
}
+static const void *
+dvb_mux_dvbs_class_pls_mode_get ( void *o )
+{
+ static const char *s;
+ dvb_mux_t *lm = o;
+ s = dvb_plsmode2str(lm->lm_tuning.dmc_fe_pls_mode);
+ return &s;
+}
+
+static int
+dvb_mux_dvbs_class_pls_mode_set ( void *o, const void *s )
+{
+ dvb_mux_t *lm = o;
+ lm->lm_tuning.dmc_fe_pls_mode = dvb_str2plsmode(s);
+ return 1;
+}
+
+static htsmsg_t *
+dvb_mux_dvbs_class_pls_mode_list ( void *o )
+{
+ htsmsg_t *list = htsmsg_create_list();
+ htsmsg_add_str(list, NULL, dvb_plsmode2str(DVB_PLS_ROOT));
+ htsmsg_add_str(list, NULL, dvb_plsmode2str(DVB_PLS_GOLD));
+ htsmsg_add_str(list, NULL, dvb_plsmode2str(DVB_PLS_COMBO));
+ return list;
+}
+
#define dvb_mux_dvbs_class_delsys_get dvb_mux_class_delsys_get
#define dvb_mux_dvbs_class_delsys_set dvb_mux_class_delsys_set
.get = dvb_mux_dvbs_class_pilot_get,
.list = dvb_mux_dvbs_class_pilot_list,
},
+ {
+ .type = PT_INT,
+ .id = "stream_id",
+ .name = "ISI",
+ .off = offsetof(dvb_mux_t, lm_tuning.dmc_fe_stream_id),
+ .def.i = -1,
+ },
+ {
+ .type = PT_STR,
+ .id = "pls_mode",
+ .name = "PLS MODE",
+ .set = dvb_mux_dvbs_class_pls_mode_set,
+ .get = dvb_mux_dvbs_class_pls_mode_get,
+ .list = dvb_mux_dvbs_class_pls_mode_list,
+ .def.s = "ROOT",
+ },
+ {
+ .type = PT_U32,
+ .id = "pls_code",
+ .name = "PLS CODE",
+ .off = offsetof(dvb_mux_t, lm_tuning.dmc_fe_pls_code),
+ .def.u32 = 1,
+ },
{
.type = PT_STR,
.id = "orbital",
/* Reject if not same symbol rate (some tolerance due to changes and diff in NIT) */
if (dvb_network_check_symbol_rate(lm, dmc, deltar)) continue;
+
/* DVB-S extra checks */
if (lm->lm_tuning.dmc_fe_type == DVB_TYPE_S) {
if (dvb_network_check_orbital_pos(lm, dmc)) continue;
}
+ /* Same PLP/ISI */
+ if (lm->lm_tuning.dmc_fe_stream_id != dmc->dmc_fe_stream_id) continue;
+
mm_alt = mm;
/* Reject if not same ID */
save |= COMPAREN(dmc_fe_pilot);
switch (dmc->dmc_fe_type) {
case DVB_TYPE_T:
+ save |= COMPARE(dmc_fe_stream_id);
save |= COMPAREN(u.dmc_fe_ofdm.bandwidth);
save |= COMPAREN(u.dmc_fe_ofdm.code_rate_HP);
save |= COMPAREN(u.dmc_fe_ofdm.code_rate_LP);
case DVB_TYPE_S:
save |= COMPARE(u.dmc_fe_qpsk.polarisation);
save |= COMPARE(u.dmc_fe_qpsk.symbol_rate);
+ save |= COMPARE(dmc_fe_stream_id);
+ save |= COMPAREN(dmc_fe_pls_mode);
+ save |= COMPAREN(dmc_fe_pls_code);
save |= COMPAREN(u.dmc_fe_qpsk.fec_inner);
break;
case DVB_TYPE_C:
int r;
if (*line == '2') {
- unsigned int plp_id, system_id;
- r = sscanf(line+1, "%u %s", &plp_id, bw);
- if (r == 2 && plp_id < 1000 && strstr(bw, "MHz") == 0) {
+ unsigned int system_id;
+ 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",
- &plp_id, &system_id, &mux->dmc_fe_freq, bw, fec, fec2, qam,
+ &mux->dmc_fe_stream_id, &system_id, &mux->dmc_fe_freq, bw, fec, fec2, qam,
mode, guard, hier);
if(r != 10) return 1;
} else {
r = sscanf(line+1, "%u %10s %10s %10s %10s %10s %10s %10s %u",
&mux->dmc_fe_freq, bw, fec, fec2, qam,
- mode, guard, hier, &plp_id);
- if(r == 8) plp_id = 0; /* auto? */ else
+ mode, guard, hier, &mux->dmc_fe_stream_id);
+ if(r == 8) mux->dmc_fe_stream_id = -1; else
if(r != 9) return 1;
}
mux->dmc_fe_delsys = DVB_SYS_DVBT2;
line++;
}
- r = sscanf(line, "%u %s %u %s %s %s",
+ r = sscanf(line, "%u %s %u %s %s %s %d %d %d",
&mux->dmc_fe_freq, pol, &mux->u.dmc_fe_qpsk.symbol_rate,
- fec, rolloff, qam);
+ fec, rolloff, qam, &mux->dmc_fe_stream_id, &mux->dmc_fe_pls_code, (int*)&mux->dmc_fe_pls_mode);
if (r < (4+v2)) return 1;
mux->dmc_fe_type = DVB_TYPE_S;
mux->dmc_fe_delsys = DVB_SYS_DVBS2;
if ((mux->dmc_fe_rolloff = dvb_str2rolloff(rolloff)) == -1) return 1;
if ((mux->dmc_fe_modulation = dvb_str2qam(qam)) == -1) return 1;
+ if (r < (4+v2+1)) mux->dmc_fe_stream_id = -1;
+ if (r < (4+v2+2)) mux->dmc_fe_pls_code = 1;
+ if (r < (4+v2+3)) mux->dmc_fe_pls_mode = 0;
} else {
mux->dmc_fe_delsys = DVB_SYS_DVBS;
mux->dmc_fe_rolloff = DVB_ROLLOFF_35;
if ((x = htsmsg_get_str(l, "INVERSION")))
if ((mux->dmc_fe_inversion = dvb_str2inver(x)) == -1)
mux_fail(r, "wrong inversion '%s'", x);
+ if (htsmsg_get_s32(l, "STREAM_ID", &mux->dmc_fe_stream_id))
+ mux->dmc_fe_stream_id = -1;
} else if (mux->dmc_fe_delsys == DVB_SYS_DVBS ||
mux->dmc_fe_delsys == DVB_SYS_DVBS2) {
if ((x = htsmsg_get_str(l, "PILOT")))
if ((mux->dmc_fe_pilot = dvb_str2rolloff(x)) == -1)
mux_fail(r, "wrong pilot '%s'", x);
+ if (htsmsg_get_s32(l, "STREAM_ID", &r)) {
+ mux->dmc_fe_stream_id = -1;
+ mux->dmc_fe_pls_mode = 0;
+ mux->dmc_fe_pls_code = 1;
+ }
+ else {
+ mux->dmc_fe_stream_id = r&0xff;
+ mux->dmc_fe_pls_mode = (r>>26)&0x3;
+ mux->dmc_fe_pls_code = (r>>8)&0x3FFFF;
+ }
+
if ((x = htsmsg_get_str(l, "POLARIZATION"))) {
char pol[2];
pol[0] = x[0]; pol[1] = '\0';