@@ -372,6 +372,8 @@ int dvb_set_sys(struct dvb_v5_fe_parms *p, fe_delivery_system_t sys)
parms->p.current_sys = sys;
parms->n_props = rc;
+ if (sys == SYS_ISDBS /* || sys == SYS_ISDBT */)
+ parms->p.default_charset = "arib-std-b24";
return 0;
}
@@ -1138,6 +1138,20 @@ static int get_program_and_store(struct dvb_v5_fe_parms_priv *parms,
entry->props[j].cmd = parms->dvb_prop[j].cmd;
entry->props[j].u.data = parms->dvb_prop[j].u.data;
+ /* [ISDB-S]
+ * Update DTV_STREAM_ID if it was not specified by a user
+ * or set to a wrong one.
+ * In those cases, demod must have selected the first TS_ID.
+ * The update must be after the above dvb_fe_get_parms() call,
+ * since a lazy FE driver that does not update stream_id prop
+ * cache in FE.get_frontend() may overwrite the setting again
+ * with the initial / user-specified wrong value.
+ */
+ if (entry->props[j].cmd == DTV_STREAM_ID
+ && entry->props[j].u.data == 0
+ && parms->p.current_sys == SYS_ISDBS)
+ entry->props[j].u.data = dvb_scan_handler->pat->header.id;
+
if (!channel && entry->props[j].cmd == DTV_FREQUENCY)
freq = parms->dvb_prop[j].u.data;
}
@@ -635,7 +635,6 @@ int dvb_estimate_freq_shift(struct dvb_v5_fe_parms *__p)
rolloff = 115;
break;
case SYS_DVBS:
- case SYS_ISDBS: /* FIXME: not sure if this rollof is right for ISDB-S */
divisor = 100000;
rolloff = 135;
break;
@@ -662,6 +661,12 @@ int dvb_estimate_freq_shift(struct dvb_v5_fe_parms *__p)
case SYS_DVBC_ANNEX_B:
bw = 6000000;
break;
+ case SYS_ISDBS:
+ /* since ISDBS uses fixed symbol_rate & rolloff,
+ * those parameters are not mandatory in channel config file.
+ */
+ bw = 28860 * 135 / 100;
+ break;
default:
break;
}
@@ -676,7 +681,9 @@ int dvb_estimate_freq_shift(struct dvb_v5_fe_parms *__p)
}
if (!bw)
dvb_fe_retrieve_parm(&parms->p, DTV_BANDWIDTH_HZ, &bw);
-
+ if (!bw)
+ dvb_log("Cannot calc frequency shift. " \
+ "Either bandwidth/symbol-rate is unavailable (yet).");
/*
* If the max frequency shift between two frequencies is below
* than the used bandwidth / 8, it should be the same channel.
@@ -1015,6 +1022,45 @@ static void add_update_nit_dvbs(struct dvb_table_nit *nit,
SYS_DVBS2);
}
+static void add_update_nit_isdbs(struct dvb_table_nit *nit,
+ struct dvb_table_nit_transport *tran,
+ struct dvb_desc *desc,
+ void *priv)
+{
+ struct update_transponders *tr = priv;
+ struct dvb_entry *new;
+ /* FIXME:
+ * use the ISDB-S specific satellite delsys descriptor structure,
+ * instead of overloading to the EN300-468's one, dvb_desc_sat.
+ * The following members are incompatible:
+ * {.modulation_type, .modulation_system, .roll_off, .fec}
+ */
+ struct dvb_desc_sat *d = (void *)desc;
+ uint32_t ts_id;
+
+ if (tr->update)
+ return;
+
+ ts_id = tran->transport_id;
+ new = dvb_scan_add_entry(tr->parms, tr->first_entry, tr->entry,
+ d->frequency, tr->shift, tr->pol, ts_id);
+ if (!new)
+ return;
+
+ /* Set (optional) ISDB-S props for the transponder */
+ /* FIXME: fill in other props like DTV_MODULATION, DTV_INNER_FEC.
+ * This requires extending the enum definitions in DVBv5 API
+ * to include the ISDB-S/T specific modulation/fec values,
+ * such as "BPSK" and "look TMCC".
+ * Since even "AUTO" is not defined, skip setting them now.
+ */
+ dvb_store_entry_prop(new, DTV_POLARIZATION,
+ dvbs_polarization[d->polarization]);
+ dvb_store_entry_prop(new, DTV_SYMBOL_RATE,
+ d->symbol_rate);
+}
+
+
static void __dvb_add_update_transponders(struct dvb_v5_fe_parms_priv *parms,
struct dvb_v5_descriptors *dvb_scan_handler,
struct dvb_entry *first_entry,
@@ -1072,6 +1118,14 @@ static void __dvb_add_update_transponders(struct dvb_v5_fe_parms_priv *parms,
satellite_delivery_system_descriptor,
NULL, add_update_nit_dvbs, &tr);
return;
+ case SYS_ISDBS:
+ /* see the FIXME: in add_update_nit_isdbs() */
+ dvb_table_nit_descriptor_handler(
+ &parms->p, dvb_scan_handler->nit,
+ satellite_delivery_system_descriptor,
+ NULL, add_update_nit_isdbs, &tr);
+ return;
+
default:
dvb_log("Transponders detection not implemented for this standard yet.");
return;
@@ -319,6 +319,8 @@ void dvb_iconv_to_charset(struct dvb_v5_fe_parms *parms,
p[len] = '\0';
dvb_logerr("Conversion from %s to %s not supported\n",
input_charset, output_charset);
+ if (!strcasecmp(input_charset, "ARIB-STD-B24"))
+ dvb_log("Try setting GCONV_PATH to the bundled gconv dir.\n");
} else {
iconv(cd, (ICONV_CONST char **)&src, &len, &p, &destlen);
iconv_close(cd);
@@ -386,7 +388,11 @@ void dvb_parse_string(struct dvb_v5_fe_parms *parms, char **dest, char **emph,
if (!len)
return;
- if (*src < 0x20) {
+ /*
+ * Strings in ISDB-S/T(JP) do not start with a charset identifier,
+ * and can start with a control character (< 0x20).
+ */
+ if (strcasecmp(type, "ARIB-STD-B24") && *src < 0x20) {
switch (*src) {
case 0x00: type = "ISO-6937"; break;
case 0x01: type = "ISO-8859-5"; break;
@@ -126,7 +126,8 @@ int main(int argc, char **argv)
fprintf(stderr, "ERROR: Please specify a valid output file\n");
missing = 1;
} else if (((args.input_format == FILE_ZAP) ||
- (args.output_format == FILE_ZAP)) && args.delsys <= 0) {
+ (args.output_format == FILE_ZAP)) &&
+ (args.delsys <= 0 || args.delsys == SYS_ISDBS)) {
fprintf(stderr, "ERROR: Please specify a valid delivery system for ZAP format\n");
missing = 1;
}
@@ -263,6 +263,15 @@ static int run_scan(struct arguments *args,
dvb_log("Scanning frequency #%d %d", count, freq);
/*
+ * update params->lnb only if it differs from entry->lnb
+ * (and "--lnbf" option was not provided),
+ * to avoid linear search of LNB types for every entries.
+ */
+ if (!args->lnb_name && entry->lnb &&
+ (!parms->lnb || strcasecmp(entry->lnb, parms->lnb->alias)))
+ parms->lnb = dvb_sat_get_lnb(dvb_sat_search_lnb(entry->lnb));
+
+ /*
* Run the scanning logic
*/