From 17b9aac84e37152200b2936a48e78d66d0714ed1 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Sun, 17 Nov 2013 20:40:38 -0200 Subject: [PATCH] Fix desc_frequency_list descriptor This descriptor is commented. Fix it. Signed-off-by: Mauro Carvalho Chehab --- lib/include/descriptors/desc_frequency_list.h | 5 +- lib/libdvbv5/descriptors/desc_frequency_list.c | 66 ++++++++++++++------------ 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/lib/include/descriptors/desc_frequency_list.h b/lib/include/descriptors/desc_frequency_list.h index 15f06de..e6e7945 100644 --- a/lib/include/descriptors/desc_frequency_list.h +++ b/lib/include/descriptors/desc_frequency_list.h @@ -30,6 +30,9 @@ struct dvb_desc_frequency_list { uint8_t length; struct dvb_desc *next; + uint8_t frequencies; + uint32_t *frequency; + union { uint8_t bitfield; struct { @@ -37,8 +40,6 @@ struct dvb_desc_frequency_list { uint8_t reserved:6; }; }; - //uint8_t frequencies; // FIXME: make linked list - //uint32_t *frequency[]; } __attribute__((packed)); struct dvb_v5_fe_parms; diff --git a/lib/libdvbv5/descriptors/desc_frequency_list.c b/lib/libdvbv5/descriptors/desc_frequency_list.c index 20107d2..19c6f25 100644 --- a/lib/libdvbv5/descriptors/desc_frequency_list.c +++ b/lib/libdvbv5/descriptors/desc_frequency_list.c @@ -25,39 +25,45 @@ void dvb_desc_frequency_list_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc) { - struct dvb_desc_frequency_list *flist = (struct dvb_desc_frequency_list *) desc; - - flist->bitfield = buf[0]; - - /*flist->frequencies = (flist->length - sizeof(flist->bitfield)) / sizeof(flist->frequency[0]);*/ - /*int i;*/ - /*for (i = 1; i <= flist->frequencies; i++) {*/ - /*flist->frequency[i] = ((uint32_t *) buf)[i];*/ - /*bswap32(flist->frequency[i]);*/ - /*switch (flist->freq_type) {*/ - /*case 1: [> satellite - to get kHz<]*/ - /*case 3: [> terrestrial - to get Hz<]*/ - /*flist->frequency[i] *= 10;*/ - /*break;*/ - /*case 2: [> cable - to get Hz <]*/ - /*flist->frequency[i] *= 100;*/ - /*break;*/ - /*case 0: [> not defined <]*/ - /*default:*/ - /*break;*/ - /*}*/ - /*}*/ -// FIXME: malloc list entires -// return sizeof(struct dvb_desc_frequency_list) + (flist->frequencies * sizeof(flist->frequency[0])); + struct dvb_desc_frequency_list *d = (struct dvb_desc_frequency_list *) desc; + size_t len; + int i; + char *p = buf; + + len = sizeof(*d) - offsetof(struct dvb_desc_frequency_list, bitfield); + memcpy(&d->bitfield, p, len); + p += len; + + d->frequencies = (d->length - len) / sizeof(d->frequency[0]); + + d->frequency = calloc(1, sizeof(d->frequency)); + + for (i = 0; i < d->frequencies; i++) { + d->frequency[i] = ((uint32_t *) buf)[i]; + bswap32(d->frequency[i]); + switch (d->freq_type) { + case 1: /* satellite - to get kHz */ + case 3: /* terrestrial - to get Hz */ + d->frequency[i] *= 10; + break; + case 2: /* cable - to get Hz */ + d->frequency[i] *= 100; + break; + case 0: /* not defined */ + default: + break; + } + } } void dvb_desc_frequency_list_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc) { - const struct dvb_desc_frequency_list *flist = (const struct dvb_desc_frequency_list *) desc; - dvb_log("| frequency list type: %d", flist->freq_type); - /*int i = 0;*/ - /*for (i = 0; i < flist->frequencies; i++) {*/ - /*dvb_log("| frequency : %d", flist->frequency[i]);*/ - /*}*/ + const struct dvb_desc_frequency_list *d = (const struct dvb_desc_frequency_list *) desc; + dvb_log("| frequency list type: %d", d->freq_type); + int i = 0; + + for (i = 0; i < d->frequencies; i++) { + dvb_log("| frequency : %d", d->frequency[i]); + } } -- 2.7.4