struct service_table *service_table;
unsigned service_table_len;
};
+
struct dvb_v5_descriptors {
int verbose;
uint32_t delivery_system;
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);
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 \
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;
/*
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;
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) {
}
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;
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;
#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);
+}
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;
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;
}
}
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;
}
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))
}
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++)
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);
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)
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)