Em Sun, 26 Oct 2014 20:46:23 +0900 tskd08@xxxxxxxxx escreveu: > From: Akihiro Tsukada <tskd08@xxxxxxxxx> > > include stream id to duplication check Please add a better description. I'll review it latter after you fix the issues on the other patches and send them with the proper SOBs. I would prefer to apply this patch and look on it more deeply, but I need first to be able to apply the remaining ones. > --- > lib/include/libdvbv5/dvb-scan.h | 11 ++-- > lib/libdvbv5/dvb-scan.c | 132 ++++++++++++---------------------------- > utils/dvb/dvbv5-scan.c | 16 ++--- > 3 files changed, 49 insertions(+), 110 deletions(-) > > diff --git a/lib/include/libdvbv5/dvb-scan.h b/lib/include/libdvbv5/dvb-scan.h > index e3a0d24..aad6d01 100644 > --- a/lib/include/libdvbv5/dvb-scan.h > +++ b/lib/include/libdvbv5/dvb-scan.h > @@ -385,16 +385,17 @@ void dvb_add_scaned_transponders(struct dvb_v5_fe_parms *parms, > */ > int dvb_estimate_freq_shift(struct dvb_v5_fe_parms *parms); > > -int dvb_new_freq_is_needed(struct dvb_entry *entry, struct dvb_entry *last_entry, > - uint32_t freq, enum dvb_sat_polarization pol, int shift); > -int dvb_new_ts_is_needed(struct dvb_entry *entry, struct dvb_entry *last_entry, > - uint32_t freq, int shift, uint32_t ts_id); > +int dvb_new_entry_is_needed(struct dvb_entry *entry, > + struct dvb_entry *last_entry, > + uint32_t freq, int shift, > + enum dvb_sat_polarization pol, uint32_t stream_id); > > struct dvb_entry *dvb_scan_add_entry(struct dvb_v5_fe_parms *parms, > struct dvb_entry *first_entry, > struct dvb_entry *entry, > uint32_t freq, uint32_t shift, > - enum dvb_sat_polarization pol); > + enum dvb_sat_polarization pol, > + uint32_t stream_id); > > void dvb_update_transponders(struct dvb_v5_fe_parms *parms, > struct dvb_v5_descriptors *dvb_scan_handler, > diff --git a/lib/libdvbv5/dvb-scan.c b/lib/libdvbv5/dvb-scan.c > index f265f97..e11a915 100644 > --- a/lib/libdvbv5/dvb-scan.c > +++ b/lib/libdvbv5/dvb-scan.c > @@ -693,93 +693,32 @@ int dvb_estimate_freq_shift(struct dvb_v5_fe_parms *__p) > return shift; > } > > -int dvb_new_freq_is_needed(struct dvb_entry *entry, struct dvb_entry *last_entry, > - uint32_t freq, enum dvb_sat_polarization pol, int shift) > +int dvb_new_entry_is_needed(struct dvb_entry *entry, > + struct dvb_entry *last_entry, > + uint32_t freq, int shift, > + enum dvb_sat_polarization pol, uint32_t stream_id) > { > - int i; > - uint32_t data; > - > for (; entry != last_entry; entry = entry->next) { > - for (i = 0; i < entry->n_props; i++) { > - data = entry->props[i].u.data; > - if (entry->props[i].cmd == DTV_POLARIZATION) { > - if (data != pol) > - continue; > - } > - if (entry->props[i].cmd == DTV_FREQUENCY) { > - if (( freq >= data - shift) && (freq <= data + shift)) > - return 0; > - } > - } > - } > - > - return 1; > -} > - > -struct dvb_entry *dvb_scan_add_entry(struct dvb_v5_fe_parms *__p, > - struct dvb_entry *first_entry, > - struct dvb_entry *entry, > - uint32_t freq, uint32_t shift, > - enum dvb_sat_polarization pol) > -{ > - struct dvb_v5_fe_parms_priv *parms = (void *)__p; > - struct dvb_entry *new_entry; > - int i, n = 2; > - > - if (!dvb_new_freq_is_needed(first_entry, NULL, freq, pol, shift)) > - return NULL; > - > - /* Clone the current entry into a new entry */ > - new_entry = calloc(sizeof(*new_entry), 1); > - if (!new_entry) { > - dvb_perror("not enough memory for a new scanning frequency"); > - return NULL; > - } > + int i; > > - memcpy(new_entry, entry, sizeof(*entry)); > + for (i = 0; i < entry->n_props; i++) { > + uint32_t data = entry->props[i].u.data; > > - /* > - * The frequency should change to the new one. Seek for it and > - * replace its value to the desired one. > - */ > - for (i = 0; i < new_entry->n_props; i++) { > - if (new_entry->props[i].cmd == DTV_FREQUENCY) { > - new_entry->props[i].u.data = freq; > - /* Navigate to the end of the entry list */ > - while (entry->next) { > - entry = entry->next; > - n++; > + if (entry->props[i].cmd == DTV_FREQUENCY) { > + if (freq < data - shift || freq > data + shift) > + break; > } > - dvb_log("New transponder/channel found: #%d: %d", > - n, freq); > - entry->next = new_entry; > - new_entry->next = NULL; > - return new_entry; > - } > - } > - > - /* This should never happen */ > - dvb_logerr("BUG: Couldn't add %d to the scan frequency list.", freq); > - free(new_entry); > - > - return NULL; > -} > - > -int dvb_new_ts_is_needed(struct dvb_entry *entry, struct dvb_entry *last_entry, > - uint32_t freq, int shift, uint32_t ts_id) > -{ > - int i; > - uint32_t data; > - > - for (; entry != last_entry; entry = entry->next) { > - for (i = 0; i < entry->n_props; i++) { > - data = entry->props[i].u.data; > - if (entry->props[i].cmd == DTV_STREAM_ID) { > - if (data != ts_id) > + if (pol != POLARIZATION_OFF > + && entry->props[i].cmd == DTV_POLARIZATION) { > + if (data != pol) > break; > } > - if (entry->props[i].cmd == DTV_FREQUENCY) { > - if (freq < data - shift || freq > data + shift) > + /* NO_STREAM_ID_FILTER: stream_id is not used. > + * 0: unspecified/auto. libdvbv5 default value. > + */ > + if (stream_id != NO_STREAM_ID_FILTER && stream_id != 0 > + && entry->props[i].cmd == DTV_STREAM_ID) { > + if (data != stream_id) > break; > } > } > @@ -790,16 +729,19 @@ int dvb_new_ts_is_needed(struct dvb_entry *entry, struct dvb_entry *last_entry, > return 1; > } > > -static struct dvb_entry * > -dvb_scan_add_entry_isdbs(struct dvb_v5_fe_parms *__p, > - struct dvb_entry *first_entry, struct dvb_entry *entry, > - uint32_t freq, uint32_t shift, uint32_t ts_id) > +struct dvb_entry *dvb_scan_add_entry(struct dvb_v5_fe_parms *__p, > + struct dvb_entry *first_entry, > + struct dvb_entry *entry, > + uint32_t freq, uint32_t shift, > + enum dvb_sat_polarization pol, > + uint32_t stream_id) > { > struct dvb_v5_fe_parms_priv *parms = (void *)__p; > struct dvb_entry *new_entry; > int i, n = 2; > > - if (!dvb_new_ts_is_needed(first_entry, NULL, freq, shift, ts_id)) > + if (!dvb_new_entry_is_needed(first_entry, NULL, freq, shift, pol, > + stream_id)) > return NULL; > > /* Clone the current entry into a new entry */ > @@ -874,7 +816,7 @@ static void add_update_nit_dvbc(struct dvb_table_nit *nit, > new = tr->entry; > } else { > new = dvb_scan_add_entry(tr->parms, tr->first_entry, tr->entry, > - d->frequency, tr->shift, tr->pol); > + d->frequency, tr->shift, tr->pol, 0); > if (!new) > return; > } > @@ -908,7 +850,8 @@ static void add_update_nit_isdbt(struct dvb_table_nit *nit, > > for (i = 0; i < d->num_freqs; i++) { > new = dvb_scan_add_entry(tr->parms, tr->first_entry, tr->entry, > - d->frequency[i], tr->shift, tr->pol); > + d->frequency[i], tr->shift, > + tr->pol, 0); > if (!new) > return; > } > @@ -984,9 +927,9 @@ static void add_update_nit_dvbt2(struct dvb_table_nit *nit, > for (i = 0; i < t2->frequency_loop_length; i++) { > new = dvb_scan_add_entry(tr->parms, tr->first_entry, tr->entry, > t2->centre_frequency[i] * 10, > - tr->shift, tr->pol); > + tr->shift, tr->pol, t2->plp_id); > if (!new) > - return; > + continue; > > dvb_store_entry_prop(new, DTV_DELIVERY_SYSTEM, > SYS_DVBT2); > @@ -1014,7 +957,8 @@ static void add_update_nit_dvbt(struct dvb_table_nit *nit, > return; > > new = dvb_scan_add_entry(tr->parms, tr->first_entry, tr->entry, > - d->centre_frequency * 10, tr->shift, tr->pol); > + d->centre_frequency * 10, tr->shift, > + tr->pol, 0); > if (!new) > return; > > @@ -1053,7 +997,7 @@ static void add_update_nit_dvbs(struct dvb_table_nit *nit, > new = tr->entry; > } else { > new = dvb_scan_add_entry(tr->parms, tr->first_entry, tr->entry, > - d->frequency, tr->shift, tr->pol); > + d->frequency, tr->shift, tr->pol, 0); > if (!new) > return; > } > @@ -1094,9 +1038,9 @@ static void add_update_nit_isdbs(struct dvb_table_nit *nit, > if (tr->update) > return; > > - ts_id = tran->transport_id; > - new = dvb_scan_add_entry_isdbs(tr->parms, tr->first_entry, tr->entry, > - d->frequency, tr->shift, ts_id); > + ts_id = tran->transport_id; > + new = dvb_scan_add_entry(tr->parms, tr->first_entry, tr->entry, > + d->frequency, tr->shift, tr->pol, ts_id); > if (!new) > return; > > diff --git a/utils/dvb/dvbv5-scan.c b/utils/dvb/dvbv5-scan.c > index e87c983..ef2b3ab 100644 > --- a/utils/dvb/dvbv5-scan.c > +++ b/utils/dvb/dvbv5-scan.c > @@ -241,6 +241,7 @@ static int run_scan(struct arguments *args, > > for (entry = dvb_file->first_entry; entry != NULL; entry = entry->next) { > struct dvb_v5_descriptors *dvb_scan_handler = NULL; > + uint32_t stream_id; > > /* > * If the channel file has duplicated frequencies, or some > @@ -254,18 +255,11 @@ static int run_scan(struct arguments *args, > if (dvb_retrieve_entry_prop(entry, DTV_POLARIZATION, &pol)) > pol = POLARIZATION_OFF; > > - if (parms->current_sys == SYS_ISDBS) { > - uint32_t tsid = 0; > + if (dvb_retrieve_entry_prop(entry, DTV_STREAM_ID, &stream_id)) > + stream_id = NO_STREAM_ID_FILTER; > > - dvb_store_entry_prop(entry, DTV_POLARIZATION, POLARIZATION_R); > - > - dvb_retrieve_entry_prop(entry, DTV_STREAM_ID, &tsid); > - if (!dvb_new_ts_is_needed(dvb_file->first_entry, entry, > - freq, shift, tsid)) > - continue; > - } else > - if (!dvb_new_freq_is_needed(dvb_file->first_entry, entry, > - freq, pol, shift)) > + if (!dvb_new_entry_is_needed(dvb_file->first_entry, entry, > + freq, shift, pol, stream_id)) > continue; > > count++; -- 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