Signed-off-by: André Roth <neolynx@xxxxxxxxx> --- lib/libdvbv5/dvb-scan.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/lib/libdvbv5/dvb-scan.c b/lib/libdvbv5/dvb-scan.c index e9ccc72..520bf9c 100644 --- a/lib/libdvbv5/dvb-scan.c +++ b/lib/libdvbv5/dvb-scan.c @@ -96,9 +96,13 @@ int dvb_read_section_with_id(struct dvb_v5_fe_parms *parms, int dmx_fd, uint8_t *buf = NULL; uint8_t *tbl = NULL; ssize_t table_length = 0; + + // handle sections + int start_id = -1; + int start_section = -1; int first_section = -1; int last_section = -1; - int table_id = -1; + /*int table_id = -1;*/ int sections = 0; struct dmx_sct_filter_params f; struct dvb_table_header *h; @@ -108,7 +112,6 @@ int dvb_read_section_with_id(struct dvb_v5_fe_parms *parms, int dmx_fd, *table = NULL; // FIXME: verify known table - memset(&f, 0, sizeof(f)); f.pid = pid; f.filter.filter[0] = tid; @@ -185,24 +188,27 @@ int dvb_read_section_with_id(struct dvb_v5_fe_parms *parms, int dmx_fd, h = (struct dvb_table_header *)buf; dvb_table_header_init(h); + + /* dvb_logdbg( "dvb_read_section: id %d, section %d/%d, current: %d", h->id, h->section_id, h->last_section, h->current_next ); */ + if (start_id == h->id && start_section == h->section_id) { + dvb_logdbg( "dvb_read_section: section repeated, reading done" ); + break; + } + if (start_id == -1) start_id = h->id; + if (start_section == -1) start_section = h->section_id; + if (id != -1 && h->id != id) { /* search for a specific table id */ continue; - } else { - if (table_id == -1) - table_id = h->id; - else if (h->id != table_id) { - dvb_logwarn("dvb_read_section: table ID mismatch reading multi section table: %d != %d", h->id, table_id); - continue; - } } + /*dvb_logerr("dvb_read_section: got section %d, last %d, filter %d", h->section_id, h->last_section, id );*/ /* handle the sections */ if (first_section == -1) first_section = h->section_id; - else if (h->section_id == first_section) + else if (start_id == h->id && h->section_id == first_section) break; - if (last_section == -1) + if (last_section == -1 || h->last_section > last_section) last_section = h->last_section; if (!tbl) { @@ -228,10 +234,14 @@ int dvb_read_section_with_id(struct dvb_v5_fe_parms *parms, int dmx_fd, else dvb_logerr("dvb_read_section: no initializer for table %d", tid); - if (++sections == last_section + 1) + if (id != -1 && ++sections == last_section + 1) { + dvb_logerr("dvb_read_section: ++sections == last_section + 1"); break; + } } - free(buf); + + if (buf) + free(buf); dvb_dmx_stop(dmx_fd); -- 1.8.3.2 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html