From 99a9247cb8cff092821d1410eb8cb63930fa0881 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Sat, 7 Jan 2012 08:20:57 -0200 Subject: [PATCH] utils/dvb: properly fill LCN Signed-off-by: Mauro Carvalho Chehab --- utils/dvb/descriptors.c | 15 ++++++++++++--- utils/dvb/libscan.c | 2 ++ utils/dvb/libscan.h | 8 ++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/utils/dvb/descriptors.c b/utils/dvb/descriptors.c index afcf891..066c60e 100644 --- a/utils/dvb/descriptors.c +++ b/utils/dvb/descriptors.c @@ -3,6 +3,7 @@ #include "parse_string.h" #include "dvb_frontend.h" +#include #include static char *default_charset = "iso-8859-1"; @@ -292,13 +293,21 @@ void parse_descriptor(enum dvb_tables type, case logical_channel_number_descriptor: { - int i; + int i, n = dvb_desc->nit_table.lcn_len; const unsigned char *p = &buf[2]; + for (i = 0; i < dlen; i+= 4, p+= 4) { + struct lcn_table **lcn = &dvb_desc->nit_table.lcn; + + *lcn = realloc(*lcn, (n + 1) * sizeof(*lcn)); + (*lcn)[n].service_id = p[0] << 8 | p[1]; + (*lcn)[n].lcn = (p[2] << 8 | p[3]) & 0x3ff; + dvb_desc->nit_table.lcn_len++; + if (dvb_desc->verbose) printf("Service ID: 0x%04x, LCN: %d\n", - p[0] << 8 | p[1], - (p[2] << 8 | p[3]) & 0x3ff); + (*lcn)[n].service_id, + (*lcn)[n].lcn); } break; } diff --git a/utils/dvb/libscan.c b/utils/dvb/libscan.c index 4486896..b2f99e6 100644 --- a/utils/dvb/libscan.c +++ b/utils/dvb/libscan.c @@ -411,6 +411,8 @@ void free_dvb_ts_tables(struct dvb_descriptors *dvb_desc) free(pid_table); } + if (nit_table->lcn) + free(nit_table->lcn); if (nit_table->network_name) free(nit_table->network_name); if (nit_table->network_alias) diff --git a/utils/dvb/libscan.h b/utils/dvb/libscan.h index d4a0c90..05695dd 100644 --- a/utils/dvb/libscan.h +++ b/utils/dvb/libscan.h @@ -28,6 +28,11 @@ struct transport_table { uint16_t tr_id; }; +struct lcn_table { + uint16_t service_id; + uint16_t lcn; +}; + struct nit_table { uint16_t network_id; unsigned char version; @@ -37,6 +42,9 @@ struct nit_table { unsigned virtual_channel; unsigned area_code; uint32_t guard_interval; + + struct lcn_table *lcn; + unsigned lcn_len; }; struct service_table { -- 2.7.4