From c03d76189c567ce634e1f4b57a5a8c4fb1a60310 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Wed, 13 Nov 2013 23:13:15 -0200 Subject: [PATCH] libdvbv5: move handler code to a separate file Move the functions that allocate/deallocate memory for the DVB scan description data to a separate file, and better name them, to avoid confusion with the dvb_desc used inside the descriptors parsing API. Signed-off-by: Mauro Carvalho Chehab --- lib/include/dvb-scan-table-handler.h | 10 +++--- lib/libdvbv5/Makefile.am | 1 + lib/libdvbv5/dvb-file.c | 32 +++++++++--------- lib/libdvbv5/dvb-scan-table-handler.c | 64 +++++++++++++++++++++++++++++++++++ lib/libdvbv5/dvb-scan.c | 63 +++------------------------------- utils/dvb/dvbv5-scan.c | 32 +++++++++--------- 6 files changed, 106 insertions(+), 96 deletions(-) diff --git a/lib/include/dvb-scan-table-handler.h b/lib/include/dvb-scan-table-handler.h index 1a4a7d4..a19bddd 100644 --- a/lib/include/dvb-scan-table-handler.h +++ b/lib/include/dvb-scan-table-handler.h @@ -145,6 +145,7 @@ struct sdt_table { struct service_table *service_table; unsigned service_table_len; }; + struct dvb_v5_descriptors { int verbose; uint32_t delivery_system; @@ -159,10 +160,7 @@ struct dvb_v5_descriptors { unsigned cur_ts; }; -void parse_descriptor(struct dvb_v5_fe_parms *parms, enum dvb_tables type, - struct dvb_v5_descriptors *dvb_desc, - const unsigned char *buf, int len); +struct dvb_v5_descriptors *dvb_scan_alloc_handler_table(uint32_t delivery_system, + int verbose); -int has_descriptor(struct dvb_v5_descriptors *dvb_desc, - unsigned char needed_descriptor, - const unsigned char *buf, int len); +void dvb_scan_free_handler_table(struct dvb_v5_descriptors *dvb_scan_handler); diff --git a/lib/libdvbv5/Makefile.am b/lib/libdvbv5/Makefile.am index 44d484f..250eebb 100644 --- a/lib/libdvbv5/Makefile.am +++ b/lib/libdvbv5/Makefile.am @@ -21,6 +21,7 @@ libdvbv5_la_SOURCES = \ dvb-zap-format.c \ dvb-sat.c ../include/dvb-sat.h \ dvb-scan.c ../include/dvb-scan.h \ + dvb-scan-table-handler.c ../include/dvb-scan-table-handler.h \ parse_string.c parse_string.h \ crc32.c crc32.h \ descriptors.c ../include/descriptors.h \ diff --git a/lib/libdvbv5/dvb-file.c b/lib/libdvbv5/dvb-file.c index 72464b7..b5b276b 100644 --- a/lib/libdvbv5/dvb-file.c +++ b/lib/libdvbv5/dvb-file.c @@ -738,40 +738,40 @@ int write_dvb_file(const char *fname, struct dvb_file *dvb_file) return 0; }; -char *dvb_vchannel(struct dvb_v5_descriptors *dvb_desc, +char *dvb_vchannel(struct dvb_v5_descriptors *dvb_scan_handler, int service) { - struct service_table *service_table = &dvb_desc->sdt_table.service_table[service]; - struct lcn_table *lcn = dvb_desc->nit_table.lcn; + struct service_table *service_table = &dvb_scan_handler->sdt_table.service_table[service]; + struct lcn_table *lcn = dvb_scan_handler->nit_table.lcn; int i; char *buf; if (!lcn) { - if (!dvb_desc->nit_table.virtual_channel) + if (!dvb_scan_handler->nit_table.virtual_channel) return NULL; - asprintf(&buf, "%d.%d", dvb_desc->nit_table.virtual_channel, + asprintf(&buf, "%d.%d", dvb_scan_handler->nit_table.virtual_channel, service); return buf; } - for (i = 0; i < dvb_desc->nit_table.lcn_len; i++) { + for (i = 0; i < dvb_scan_handler->nit_table.lcn_len; i++) { if (lcn[i].service_id == service_table->service_id) { asprintf(&buf, "%d.%d.%d", - dvb_desc->nit_table.virtual_channel, + dvb_scan_handler->nit_table.virtual_channel, lcn[i].lcn, service); return buf; } } - asprintf(&buf, "%d.%d", dvb_desc->nit_table.virtual_channel, + asprintf(&buf, "%d.%d", dvb_scan_handler->nit_table.virtual_channel, service); return buf; } static void handle_std_specific_parms(struct dvb_entry *entry, - struct dvb_v5_descriptors *dvb_desc) + struct dvb_v5_descriptors *dvb_scan_handler) { - struct nit_table *nit_table = &dvb_desc->nit_table; + struct nit_table *nit_table = &dvb_scan_handler->nit_table; int i; /* @@ -889,7 +889,7 @@ static int sort_other_el_pid(const void *a_arg, const void *b_arg) int store_dvb_channel(struct dvb_file **dvb_file, struct dvb_v5_fe_parms *parms, - struct dvb_v5_descriptors *dvb_desc, + struct dvb_v5_descriptors *dvb_scan_handler, int get_detected, int get_nit) { struct dvb_entry *entry; @@ -908,9 +908,9 @@ int store_dvb_channel(struct dvb_file **dvb_file, while (entry && entry->next) entry = entry->next; - for (i = 0; i < dvb_desc->sdt_table.service_table_len; i++) { - struct service_table *service_table = &dvb_desc->sdt_table.service_table[i]; - struct pat_table *pat_table = &dvb_desc->pat_table; + for (i = 0; i < dvb_scan_handler->sdt_table.service_table_len; i++) { + struct service_table *service_table = &dvb_scan_handler->sdt_table.service_table[i]; + struct pat_table *pat_table = &dvb_scan_handler->pat_table; struct pid_table *pid_table = NULL; if (!entry) { @@ -935,7 +935,7 @@ int store_dvb_channel(struct dvb_file **dvb_file, } entry->service_id = service_table->service_id; - entry->vchannel = dvb_vchannel(dvb_desc, i); + entry->vchannel = dvb_vchannel(dvb_scan_handler, i); /*entry->pol = parms->pol;*/ entry->sat_number = parms->sat_number; @@ -997,7 +997,7 @@ int store_dvb_channel(struct dvb_file **dvb_file, entry->n_props = parms->n_props; if (get_nit) - handle_std_specific_parms(entry, dvb_desc); + handle_std_specific_parms(entry, dvb_scan_handler); } return 0; diff --git a/lib/libdvbv5/dvb-scan-table-handler.c b/lib/libdvbv5/dvb-scan-table-handler.c index f578ae2..9b0e5e9 100644 --- a/lib/libdvbv5/dvb-scan-table-handler.c +++ b/lib/libdvbv5/dvb-scan-table-handler.c @@ -50,3 +50,67 @@ #include "descriptors/desc_hierarchy.h" #include "dvb-scan-table-handler.h" + +struct dvb_v5_descriptors *dvb_scan_alloc_handler_table(uint32_t delivery_system, + int verbose) +{ + struct dvb_v5_descriptors *dvb_scan_handler; + + dvb_scan_handler = calloc(sizeof(*dvb_scan_handler), 1); + if (!dvb_scan_handler) + return NULL; + + dvb_scan_handler->verbose = verbose; + dvb_scan_handler->delivery_system = delivery_system; + + return dvb_scan_handler; +} + +void dvb_scan_free_handler_table(struct dvb_v5_descriptors *dvb_scan_handler) +{ + struct pat_table *pat_table = &dvb_scan_handler->pat_table; + struct pid_table *pid_table = dvb_scan_handler->pat_table.pid_table; + struct nit_table *nit_table = &dvb_scan_handler->nit_table; + struct sdt_table *sdt_table = &dvb_scan_handler->sdt_table; + int i; + + if (pid_table) { + for (i = 0; i < pat_table->pid_table_len; i++) { + if (pid_table[i].video_pid) + free(pid_table[i].video_pid); + if (pid_table[i].audio_pid) + free(pid_table[i].audio_pid); + if (pid_table[i].other_el_pid) + free(pid_table[i].other_el_pid); + } + 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) + free(nit_table->network_alias); + if (nit_table->tr_table) + free(nit_table->tr_table); + if (nit_table->frequency) + free(nit_table->frequency); + if (nit_table->orbit) + free(nit_table->orbit); + + if (sdt_table->service_table) { + for (i = 0; i < sdt_table->service_table_len; i++) { + if (sdt_table->service_table[i].provider_name) + free(sdt_table->service_table[i].provider_name); + if (sdt_table->service_table[i].provider_alias) + free(sdt_table->service_table[i].provider_alias); + if (sdt_table->service_table[i].service_name) + free(sdt_table->service_table[i].service_name); + if (sdt_table->service_table[i].service_alias) + free(sdt_table->service_table[i].service_alias); + } + free(sdt_table->service_table); + } + free(dvb_scan_handler); +} diff --git a/lib/libdvbv5/dvb-scan.c b/lib/libdvbv5/dvb-scan.c index e74d7d9..2bd932a 100644 --- a/lib/libdvbv5/dvb-scan.c +++ b/lib/libdvbv5/dvb-scan.c @@ -220,15 +220,12 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms, struct dvb_table_nit *nit = NULL; struct dvb_table_sdt *sdt = NULL; - struct dvb_v5_descriptors *dvb_desc; + struct dvb_v5_descriptors *dvb_scan_handler; - dvb_desc = calloc(sizeof(*dvb_desc), 1); - if (!dvb_desc) + dvb_scan_handler = dvb_scan_alloc_handler_table(delivery_system, verbose); + if (!dvb_scan_handler) return NULL; - dvb_desc->verbose = verbose; - dvb_desc->delivery_system = delivery_system; - if (!timeout_multiply) timeout_multiply = 1; @@ -283,7 +280,7 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms, if (rc < 0) { fprintf(stderr, "error while waiting for PAT table\n"); if (!atsc_filter) { - dvb_free_ts_tables(dvb_desc); + dvb_scan_free_handler_table(dvb_scan_handler); return NULL; } } @@ -362,55 +359,5 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms, dvb_table_sdt_print(parms, sdt); } - return dvb_desc; -} - - -void dvb_free_ts_tables(struct dvb_v5_descriptors *dvb_desc) -{ - struct pat_table *pat_table = &dvb_desc->pat_table; - struct pid_table *pid_table = dvb_desc->pat_table.pid_table; - struct nit_table *nit_table = &dvb_desc->nit_table; - struct sdt_table *sdt_table = &dvb_desc->sdt_table; - int i; - - if (pid_table) { - for (i = 0; i < pat_table->pid_table_len; i++) { - if (pid_table[i].video_pid) - free(pid_table[i].video_pid); - if (pid_table[i].audio_pid) - free(pid_table[i].audio_pid); - if (pid_table[i].other_el_pid) - free(pid_table[i].other_el_pid); - } - 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) - free(nit_table->network_alias); - if (nit_table->tr_table) - free(nit_table->tr_table); - if (nit_table->frequency) - free(nit_table->frequency); - if (nit_table->orbit) - free(nit_table->orbit); - - if (sdt_table->service_table) { - for (i = 0; i < sdt_table->service_table_len; i++) { - if (sdt_table->service_table[i].provider_name) - free(sdt_table->service_table[i].provider_name); - if (sdt_table->service_table[i].provider_alias) - free(sdt_table->service_table[i].provider_alias); - if (sdt_table->service_table[i].service_name) - free(sdt_table->service_table[i].service_name); - if (sdt_table->service_table[i].service_alias) - free(sdt_table->service_table[i].service_alias); - } - free(sdt_table->service_table); - } - free(dvb_desc); + return dvb_scan_handler; } diff --git a/utils/dvb/dvbv5-scan.c b/utils/dvb/dvbv5-scan.c index e6c918e..1c1adce 100644 --- a/utils/dvb/dvbv5-scan.c +++ b/utils/dvb/dvbv5-scan.c @@ -325,21 +325,21 @@ static int estimate_freq_shift(struct dvb_v5_fe_parms *parms) static void add_other_freq_entries(struct dvb_file *dvb_file, struct dvb_v5_fe_parms *parms, - struct dvb_v5_descriptors *dvb_desc) + struct dvb_v5_descriptors *dvb_scan_handler) { int i; uint32_t freq, shift = 0; enum dvb_sat_polarization pol = POLARIZATION_OFF; - if (!dvb_desc->nit_table.frequency) + if (!dvb_scan_handler->nit_table.frequency) return; - pol = dvb_desc->nit_table.pol; + pol = dvb_scan_handler->nit_table.pol; shift = estimate_freq_shift(parms); - for (i = 0; i < dvb_desc->nit_table.frequency_len; i++) { - freq = dvb_desc->nit_table.frequency[i]; + for (i = 0; i < dvb_scan_handler->nit_table.frequency_len; i++) { + freq = dvb_scan_handler->nit_table.frequency[i]; if (new_freq_is_needed(dvb_file->first_entry, NULL, freq, pol, shift)) @@ -388,7 +388,7 @@ static int run_scan(struct arguments *args, } for (entry = dvb_file->first_entry; entry != NULL; entry = entry->next) { - struct dvb_v5_descriptors *dvb_desc = NULL; + struct dvb_v5_descriptors *dvb_scan_handler = NULL; /* First of all, set the delivery system */ for (i = 0; i < entry->n_props; i++) @@ -451,8 +451,8 @@ static int run_scan(struct arguments *args, if (!freq) continue; shift = estimate_freq_shift(parms); - if (dvb_desc && !new_freq_is_needed(dvb_file->first_entry, entry, - freq, dvb_desc->nit_table.pol, shift)) + if (dvb_scan_handler && !new_freq_is_needed(dvb_file->first_entry, entry, + freq, dvb_scan_handler->nit_table.pol, shift)) continue; rc = dvb_fe_set_parms(parms); @@ -474,18 +474,18 @@ static int run_scan(struct arguments *args, if (rc < 0) continue; - dvb_desc = dvb_get_ts_tables(parms, dmx_fd, + dvb_scan_handler = dvb_get_ts_tables(parms, dmx_fd, parms->current_sys, args->other_nit, args->timeout_multiply, verbose); - if (!dvb_desc) + if (!dvb_scan_handler) continue; - for (i = 0; i < dvb_desc->sdt_table.service_table_len; i++) { - struct service_table *service_table = &dvb_desc->sdt_table.service_table[i]; + for (i = 0; i < dvb_scan_handler->sdt_table.service_table_len; i++) { + struct service_table *service_table = &dvb_scan_handler->sdt_table.service_table[i]; - entry->vchannel = dvb_vchannel(dvb_desc, i); + entry->vchannel = dvb_vchannel(dvb_scan_handler, i); printf("Service #%d (%d)", i, service_table->service_id); if (service_table->service_name) @@ -495,13 +495,13 @@ static int run_scan(struct arguments *args, printf("\n"); } - store_dvb_channel(&dvb_file_new, parms, dvb_desc, + store_dvb_channel(&dvb_file_new, parms, dvb_scan_handler, args->get_detected, args->get_nit); if (!args->dont_add_new_freqs) - add_other_freq_entries(dvb_file, parms, dvb_desc); + add_other_freq_entries(dvb_file, parms, dvb_scan_handler); - dvb_free_ts_tables(dvb_desc); + dvb_scan_free_handler_table(dvb_scan_handler); } if (dvb_file_new) -- 2.7.4