X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=decode_sdt.c;fp=decode_sdt.c;h=ffd17b86d84e0a5bb7d01a482da277c1d5f127cc;hb=cd7be00e3ef50fec0cb1d917184ad6fb4f2891a4;hp=7f336f8330ea937b874869041291362fe322a312;hpb=5f90b5667bda4e5a1962fe99ddc21c231f3b5260;p=decode_sdt diff --git a/decode_sdt.c b/decode_sdt.c index 7f336f8..ffd17b8 100644 --- a/decode_sdt.c +++ b/decode_sdt.c @@ -248,6 +248,79 @@ typedef struct { 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; @@ -259,59 +332,12 @@ static void ParseNIT(void *p_zero, dvbpsi_nit_t * p_nit) 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);