utils/dvb: add support for transport descriptors
authorMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 3 Jan 2012 15:30:07 +0000 (13:30 -0200)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 7 Jan 2012 13:12:14 +0000 (11:12 -0200)
As this is tested with an ISDB-T channel, the only descriptor
found there is 0x41 (service_list_descriptor). This has no meaning
for a dvb-scan tool, so don't implement it.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
utils/dvb/descriptors.c
utils/dvb/descriptors.h
utils/dvb/libscan.c
utils/dvb/libscan.h

index 9b51ae6..1b049f0 100644 (file)
@@ -8,11 +8,13 @@ static char *default_charset = "iso-8859-1";
 static char *output_charset = "utf-8";
 
 static void parse_descriptor(struct dvb_descriptors *dvb_desc,
-                             const unsigned char *buf, int len)
+                             const unsigned char *buf, int len,
+                             void *ptr)
 {
        int dlen = buf[1] + 1;
        /* FIXME: Not all descriptors are valid for all tables */
 
+       printf("Descriptor 0x%02x, len %d\n", buf[0], dlen);
        switch(buf[0]) {
        case network_name_descriptor:
                parse_string(&dvb_desc->nit_table.network_name,
@@ -50,7 +52,7 @@ static void parse_descriptor(struct dvb_descriptors *dvb_desc,
 }
 
 void parse_nit_descriptor(struct dvb_descriptors *dvb_desc,
-                         const unsigned char *buf, int len)
+                         const unsigned char *buf, int len, void *ptr)
 {
        /* Check if the descriptor is valid on a NIT table */
        switch (buf[0]) {
@@ -72,7 +74,7 @@ void parse_nit_descriptor(struct dvb_descriptors *dvb_desc,
        case XAIT_location_descriptor:
        case FTA_content_management_descriptor:
        case extension_descriptor:
-               parse_descriptor(dvb_desc, buf, len);
+               parse_descriptor(dvb_desc, buf, len, ptr);
                break;
        default:
                return;
index 6782914..47aa3b8 100644 (file)
@@ -2,13 +2,6 @@
  * Descriptors, as defined on ETSI EN 300 468 V1.11.1 (2010-04)
  */
 
-enum table_type {
-       PAT,
-       PMT,
-       NIT,
-       NUM_TABLE_TYPES
-};
-
 enum descriptors {
        network_name_descriptor                         = 0x40,
        service_list_descriptor                         = 0x41,
@@ -77,4 +70,4 @@ enum descriptors {
 };
 
 void parse_nit_descriptor(struct dvb_descriptors *dvb_desc,
-                         const unsigned char *buf, int len);
+                         const unsigned char *buf, int len, void *ptr);
index 18e6f10..bcdfc62 100644 (file)
@@ -121,7 +121,7 @@ static void parse_nit(struct dvb_descriptors *dvb_desc,
                      int id, int version)
 {
        struct nit_table *nit_table = &dvb_desc->nit_table;
-       int len;
+       int len, n;
 
        nit_table->network_id    = id;
        nit_table->version = version;
@@ -133,10 +133,35 @@ static void parse_nit(struct dvb_descriptors *dvb_desc,
                return;
        }
 
-       printf("descriptor 0x%02x, len %d\n", buf[2], len);
+       parse_nit_descriptor(dvb_desc, &buf[2], len, NULL);
 
-       parse_nit_descriptor(dvb_desc, &buf[2], len);
+       *section_length -= len + 4;
+       buf += len + 4;
+
+       n = nit_table->tr_table_len;
+       while (*section_length > 6) {
+               nit_table->tr_table = realloc(nit_table->tr_table,
+                                       sizeof(*nit_table->tr_table) * (n + 1));
+               nit_table->tr_table[n].tr_id = (buf[0] << 8) | buf[1];
+
+               len = ((buf[4] & 0x0f) << 8) | buf[5];
+               if (*section_length < len + 4) {
+                       printf("NIT section too short for Network ID 0x%04x, transport stream ID 0x%04x",
+                              id, nit_table->tr_table[n].tr_id);
+                       continue;
+               } else {
+                       printf("Transport stream ID 0x%04x, len %d\n",
+                               nit_table->tr_table[n].tr_id);
+
+                       parse_nit_descriptor(dvb_desc, &buf[6], len,
+                                       &nit_table->tr_table[n]);
+                       n++;
+               }
 
+               *section_length -= len + 6;
+               buf += len + 6;
+       }
+       nit_table->tr_table_len = n;
 }
 
 
index 9f95da2..d70d2f9 100644 (file)
@@ -12,7 +12,7 @@ struct pid_table {
        uint16_t program_number;
        uint16_t pid;
        struct pmt_table pmt_table;
-       int video_pid_len, audio_pid_len;
+       unsigned video_pid_len, audio_pid_len;
        uint16_t *video_pid;
        uint16_t *audio_pid;
 };
@@ -24,10 +24,16 @@ struct pat_table {
        unsigned pid_table_len;
 };
 
+struct transport_table {
+       uint16_t tr_id;
+};
+
 struct nit_table {
        uint16_t network_id;
        unsigned char version;
        char *network_name, *network_alias;
+       struct transport_table *tr_table;
+       unsigned tr_table_len;
 };
 
 struct dvb_descriptors {