libdvbv5: move handler code to a separate file
authorMauro Carvalho Chehab <m.chehab@samsung.com>
Thu, 14 Nov 2013 01:13:15 +0000 (23:13 -0200)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Wed, 27 Nov 2013 11:24:16 +0000 (09:24 -0200)
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 <m.chehab@samsung.com>
lib/include/dvb-scan-table-handler.h
lib/libdvbv5/Makefile.am
lib/libdvbv5/dvb-file.c
lib/libdvbv5/dvb-scan-table-handler.c
lib/libdvbv5/dvb-scan.c
utils/dvb/dvbv5-scan.c

index 1a4a7d4..a19bddd 100644 (file)
@@ -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);
index 44d484f..250eebb 100644 (file)
@@ -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 \
index 72464b7..b5b276b 100644 (file)
@@ -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;
index f578ae2..9b0e5e9 100644 (file)
 #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);
+}
index e74d7d9..2bd932a 100644 (file)
@@ -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;
 }
index e6c918e..1c1adce 100644 (file)
@@ -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)