From: Akihiro Tsukada <tsk...@gmail.com>

include stream id to duplication check
---
 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++;
-- 
2.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to