From 33f14129ad295ea3a2a226143419bfa60d39c411 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Sun, 24 Nov 2013 07:54:23 -0200 Subject: [PATCH] libdvbv5: improve debug messages Add several improvements at the debug messages: - Without verbose, show only the Virtual channels or services to be stored in the file; - instead of using fprintf for errors, use the error macros. That will make errors colored; - With verbose=1, will show all parsed data; - With verbose=2, will show all unparsed descriptors and their hexdump contents; - With verbose=3, will show all descriptors and their hexdump contents, including the ones without a parser. Verbose levels 2 and 3 helps to detect if some improvements would be needed inside the descriptor parser's library. Signed-off-by: Mauro Carvalho Chehab --- lib/libdvbv5/descriptors.c | 20 ++++++++++---- lib/libdvbv5/descriptors/desc_extension.c | 19 ++++++++++---- lib/libdvbv5/dvb-file.c | 10 ++++--- lib/libdvbv5/dvb-scan.c | 43 +++++++++++++++++++------------ 4 files changed, 61 insertions(+), 31 deletions(-) diff --git a/lib/libdvbv5/descriptors.c b/lib/libdvbv5/descriptors.c index 24aba87..943e463 100644 --- a/lib/libdvbv5/descriptors.c +++ b/lib/libdvbv5/descriptors.c @@ -97,11 +97,21 @@ void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ui int desc_len = ptr[1]; size_t size; -#if 0 /* For an additional level of debug */ - dvb_log("descriptor type 0x%x, size %d", - desc_type, desc_len); - hexdump(parms, "dump: ", ptr + 2, desc_len); -#endif + switch (parms->verbose) { + case 0: + case 1: + break; + case 2: + if (dvb_descriptors[desc_type].init) + break; + /* fall through */ + case 3: + dvb_log("%sdescriptor %s type 0x%x, size %d", + dvb_descriptors[desc_type].init ? "" : "Not handled ", + dvb_descriptors[desc_type].name, desc_type, desc_len); + hexdump(parms, "content: ", ptr + 2, desc_len); + } + if (desc_len > section_length - 2) { dvb_logerr("descriptor is too big"); return; diff --git a/lib/libdvbv5/descriptors/desc_extension.c b/lib/libdvbv5/descriptors/desc_extension.c index fa5f68c..8eac4b5 100644 --- a/lib/libdvbv5/descriptors/desc_extension.c +++ b/lib/libdvbv5/descriptors/desc_extension.c @@ -130,11 +130,20 @@ void extension_descriptor_init(struct dvb_v5_fe_parms *parms, ext->extension_code = desc_type; p++; -#if 0 /* For an additional level of debug */ - dvb_log("extension descriptor type 0%x, size %d", - desc_type, desc_len); - hexdump(parms, "dump: ", p, desc_len); -#endif + switch (parms->verbose) { + case 0: + case 1: + break; + case 2: + if (dvb_ext_descriptors[desc_type].init) + break; + /* fall through */ + case 3: + dvb_log("%sextension descriptor %s type 0x%x, size %d", + dvb_ext_descriptors[desc_type].init ? "" : "Not handled ", + dvb_ext_descriptors[desc_type].name, desc_type, desc_len); + hexdump(parms, "content: ", p, desc_len); + } init = dvb_ext_descriptors[desc_type].init; if (init) diff --git a/lib/libdvbv5/dvb-file.c b/lib/libdvbv5/dvb-file.c index a0341e2..6a0d8a1 100644 --- a/lib/libdvbv5/dvb-file.c +++ b/lib/libdvbv5/dvb-file.c @@ -1090,8 +1090,9 @@ int store_dvb_channel(struct dvb_file **dvb_file, d->major_channel_number, d->minor_channel_number); - dvb_log("Found channel %s, name = %s", - vchannel, channel); + if (parms->verbose) + dvb_log("Virtual channel %s, name = %s", + vchannel, channel); rc = get_program_and_store(parms, *dvb_file, dvb_scan_handler, d->program_number, @@ -1120,7 +1121,7 @@ int store_dvb_channel(struct dvb_file **dvb_file, channel = calloc(strlen(desc->name) + 1, 1); strcpy(channel, desc->name); } - dvb_log("Found service %s, provider %s, type %d", + dvb_log("Service %s, provider %s, type %d", desc->name, desc->provider, desc->service_type); break; } @@ -1128,7 +1129,8 @@ int store_dvb_channel(struct dvb_file **dvb_file, if (!channel) asprintf(&channel, "#%d", service->service_id); - dvb_log("Storing as channel %s", channel); + if (parms->verbose) + dvb_log("Storing as channel %s", channel); vchannel = dvb_vchannel(dvb_scan_handler->nit, service->service_id); rc = get_program_and_store(parms, *dvb_file, dvb_scan_handler, diff --git a/lib/libdvbv5/dvb-scan.c b/lib/libdvbv5/dvb-scan.c index 5b0ee92..413909c 100644 --- a/lib/libdvbv5/dvb-scan.c +++ b/lib/libdvbv5/dvb-scan.c @@ -111,7 +111,8 @@ int dvb_read_section_with_id(struct dvb_v5_fe_parms *parms, int dmx_fd, return -1; } - dvb_log("Parsing table ID %d, program ID %d", tid, pid); + if (parms->verbose) + dvb_log("Parsing table ID %d, program ID %d", tid, pid); buf = malloc(DVB_MAX_PAYLOAD_PACKET_SIZE); if (!buf) @@ -197,14 +198,22 @@ int dvb_read_section_with_id(struct dvb_v5_fe_parms *parms, int dmx_fd, tbl = malloc(dvb_table_initializers[tid].size); else tbl = malloc(MAX_TABLE_SIZE); - if (!tbl) - dvb_perror("Out of memory"); + if (!tbl) { + dvb_logerr("Out of memory"); + free(buf); + dvb_dmx_stop(dmx_fd); + return -4; + } } if (dvb_table_initializers[tid].init) { dvb_table_initializers[tid].init(parms, buf, buf_length, tbl, &table_length); - if (!tbl) + if (!tbl) { dvb_perror("Out of memory"); + free(buf); + dvb_dmx_stop(dmx_fd); + return -4; + } if (!dvb_table_initializers[tid].size) tbl = realloc(tbl, table_length); } else @@ -291,7 +300,7 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms, (uint8_t **) &dvb_scan_handler->pat, pat_pmt_time * timeout_multiply); if (rc < 0) { - fprintf(stderr, "error while waiting for PAT table\n"); + dvb_logerr("error while waiting for PAT table"); dvb_scan_free_handler_table(dvb_scan_handler); return NULL; } @@ -305,7 +314,7 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms, (uint8_t **)&dvb_scan_handler->vct, vct_time * timeout_multiply); if (rc < 0) - fprintf(stderr, "error while waiting for VCT table\n"); + dvb_logerr("error while waiting for VCT table"); else if (verbose) dvb_table_vct_print(parms, dvb_scan_handler->vct); } @@ -318,20 +327,20 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms, dvb_scan_handler->program[num_pmt].pat_pgm = program; if (!program->service_id) { - dvb_log("Network PID: 0x%02x", program->pid); + if (verbose) + dvb_log("Network PID: 0x%02x", program->pid); num_pmt++; continue; } - - dvb_log("Program ID %d", program->pid); + if (verbose) + dvb_log("Program ID %d", program->pid); rc = dvb_read_section(parms, dmx_fd, DVB_TABLE_PMT, program->pid, (uint8_t **)&dvb_scan_handler->program[num_pmt].pmt, pat_pmt_time * timeout_multiply); if (rc < 0) { - fprintf(stderr, - "error while reading the PMT table for service 0x%04x\n", - program->service_id); + dvb_logerr("error while reading the PMT table for service 0x%04x", + program->service_id); dvb_scan_handler->program[num_pmt].pmt = NULL; } else { if (verbose) @@ -347,7 +356,7 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms, (uint8_t **)&dvb_scan_handler->nit, nit_time * timeout_multiply); if (rc < 0) - fprintf(stderr, "error while reading the NIT table\n"); + dvb_logerr("error while reading the NIT table"); else if (verbose) dvb_table_nit_print(parms, dvb_scan_handler->nit); @@ -358,7 +367,7 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms, (uint8_t **)&dvb_scan_handler->sdt, sdt_time * timeout_multiply); if (rc < 0) - fprintf(stderr, "error while reading the SDT table\n"); + dvb_logerr("error while reading the SDT table"); else if (verbose) dvb_table_sdt_print(parms, dvb_scan_handler->sdt); } @@ -366,13 +375,13 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms, /* NIT/SDT other tables */ if (other_nit) { if (verbose) - printf("Parsing other NIT/SDT\n"); + dvb_log("Parsing other NIT/SDT"); rc = dvb_read_section(parms, dmx_fd, DVB_TABLE_NIT2, DVB_TABLE_NIT_PID, (uint8_t **)&dvb_scan_handler->nit, nit_time * timeout_multiply); if (rc < 0) - fprintf(stderr, "error while reading the NIT table\n"); + dvb_logerr("error while reading the NIT table"); else if (verbose) dvb_table_nit_print(parms, dvb_scan_handler->nit); @@ -381,7 +390,7 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms, (uint8_t **)&dvb_scan_handler->sdt, sdt_time * timeout_multiply); if (rc < 0) - fprintf(stderr, "error while reading the SDT table\n"); + dvb_logerr("error while reading the SDT table"); else if (verbose) dvb_table_sdt_print(parms, dvb_scan_handler->sdt); } -- 2.7.4