+// Canal Digital stores their LCN in the NIT (Wikipedia says some do it in
+// the BAT). I haven't been able to find any format for this, even in NorDIG's
+// specification, so this is done by visual inspection.
+static void ParseLCN(int network_id, const dvbpsi_descriptor_t *p_descriptor)
+{
+ uint8_t *ptr = p_descriptor->p_data;
+ int channel_list_id = *ptr++;
+
+ // Skip the name and the three-letter country code.
+ int len = *ptr++;
+ ptr += len + 3;
+
+ // The LCN itself.
+ len = *ptr++;
+ for (int i = 0; i < len; i += 4) {
+ int sid = (ptr[i] << 8) | ptr[i + 1];
+ int lcn = ((ptr[i + 2] << 8) | ptr[i + 3]) & 0x3fff;
+ printf("lcn %d/%d/%d: lcn=%d\n", network_id, channel_list_id, sid, lcn);
+ }
+}
+
+static void ParseDSD(const dvbpsi_nit_t *p_nit, const dvbpsi_nit_ts_t *p_ts, const dvbpsi_descriptor_t *p_descriptor)
+{
+ char buf[256], *ptr;
+ int i, len;
+ descr_sat_delivery_t *d =
+ (descr_sat_delivery_t *) p_descriptor->p_data;
+ printf("ts %d/%d: ", p_nit->i_network_id, p_ts->i_ts_id);
+ printf("freq=%x%02x%02x, ", d->frequency_4,
+ d->frequency_3, d->frequency_2,
+ d->frequency_1);
+ printf("pol=%c, ", "HVLR"[d->polarization]);
+ if (d->modulation_system) {
+ printf("delivery_system=DVBS2, ");
+ } else {
+ printf("delivery_system=DVBS, ");
+ }
+ if (d->modulation_type == 0) {
+ printf("modulation=QAMAUTO, ");
+ } else if (d->modulation_type == 1) {
+ printf("modulation=QPSK, ");
+ } else if (d->modulation_type == 2) {
+ printf("modulation=8PSK, ");
+ } else if (d->modulation_type == 3) {
+ printf("modulation=QAM64, ");
+ }
+ printf("srate=%x%02x%02x, ", d->symbol_rate_12, d->symbol_rate_34, d->symbol_rate_56);
+ if (d->FEC_inner == 0) {
+ printf("coderate=auto");
+ } else if (d->FEC_inner == 1) {
+ printf("coderate=1/2");
+ } else if (d->FEC_inner == 2) {
+ printf("coderate=2/3");
+ } else if (d->FEC_inner == 3) {
+ printf("coderate=3/4");
+ } else if (d->FEC_inner == 4) {
+ printf("coderate=5/6");
+ } else if (d->FEC_inner == 5) {
+ printf("coderate=7/8");
+ } else if (d->FEC_inner == 6) {
+ printf("coderate=8/9");
+ } else if (d->FEC_inner == 7) {
+ printf("coderate=3/5");
+ } else if (d->FEC_inner == 8) {
+ printf("coderate=4/5");
+ } else if (d->FEC_inner == 9) {
+ printf("coderate=9/10");
+ } else {
+ printf("coderate=none");
+ }
+ printf("\n");
+}
+