uint8_t symbol_rate_7 : 4;
} descr_sat_delivery_t;
+// 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");
+}
+
static void ParseNIT(void *p_zero, dvbpsi_nit_t * p_nit)
{
last_used_packet_num = packet_num;
for (dvbpsi_descriptor_t *p_descriptor = p_ts->p_first_descriptor;
p_descriptor != NULL;
p_descriptor = p_descriptor->p_next) {
- char buf[256], *ptr;
- int i, len;
- if (p_descriptor->i_tag != 0x43) {
- continue;
+ if (p_descriptor->i_tag == 0x87) {
+ ParseLCN(p_nit->i_network_id, p_descriptor);
}
-
- 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, ");
+ if (p_descriptor->i_tag == 0x43) {
+ ParseDSD(p_nit, p_ts, p_descriptor);
}
- 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");
- break;
}
}
dvbpsi_nit_delete(p_nit);