]> git.sesse.net Git - decode_sdt/commitdiff
Support parsing of LCN (Logical Channel Number) lists.
authorSteinar H. Gunderson <sesse@samfundet.no>
Sun, 29 Sep 2013 18:23:51 +0000 (20:23 +0200)
committerSteinar H. Gunderson <sesse@samfundet.no>
Sun, 29 Sep 2013 18:23:51 +0000 (20:23 +0200)
decode_sdt.c

index 7f336f8330ea937b874869041291362fe322a312..ffd17b86d84e0a5bb7d01a482da277c1d5f127cc 100644 (file)
@@ -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);