This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/v4l-utils.git tree:

Subject: libdvbv5: Check if the stats is valid and return it to userspace
Author:  Mauro Carvalho Chehab <[email protected]>
Date:    Sun Aug 19 13:50:12 2012 -0300

Signed-off-by: Mauro Carvalho Chehab <[email protected]>

 lib/include/dvb-fe.h  |    5 +--
 lib/libdvbv5/dvb-fe.c |   56 ++++++++++++++++++++++++++++++------------------
 2 files changed, 37 insertions(+), 24 deletions(-)

---

http://git.linuxtv.org/v4l-utils.git?a=commitdiff;h=68b20e2d1a159b966261a36139e7252b760d9415

diff --git a/lib/include/dvb-fe.h b/lib/include/dvb-fe.h
index b2c3587..c9b2185 100644
--- a/lib/include/dvb-fe.h
+++ b/lib/include/dvb-fe.h
@@ -60,6 +60,7 @@ enum dvbv3_emulation_type {
 
 struct dvb_v5_stats {
        struct dtv_property             prop[DTV_MAX_STATS];
+       int                             valid[DTV_MAX_STATS];
 };
 
 
@@ -130,9 +131,7 @@ int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms);
 /* Get statistics */
 
 int dvb_fe_retrieve_stats(struct dvb_v5_fe_parms *parms,
-                          unsigned cmd, uint32_t *value);
-int dvb_fe_store_stats(struct dvb_v5_fe_parms *parms,
-                       unsigned cmd, uint32_t value);
+                         unsigned cmd, uint32_t *value);
 int dvb_fe_get_stats(struct dvb_v5_fe_parms *parms);
 
 /* Get both status statistics and dvb parameters */
diff --git a/lib/libdvbv5/dvb-fe.c b/lib/libdvbv5/dvb-fe.c
index 8ed73b6..eadabf6 100644
--- a/lib/libdvbv5/dvb-fe.c
+++ b/lib/libdvbv5/dvb-fe.c
@@ -657,13 +657,16 @@ ret:
 }
 
 int dvb_fe_retrieve_stats(struct dvb_v5_fe_parms *parms,
-                          unsigned cmd, uint32_t *value)
+                         unsigned cmd, uint32_t *value)
 {
-       int i;
+       int i, valid;
        for (i = 0; i < DTV_MAX_STATS; i++) {
                if (parms->stats.prop[i].cmd != cmd)
                        continue;
                *value = parms->stats.prop[i].u.data;
+               valid = parms->stats.valid[i];
+               if (!valid)
+                       return EINVAL;
                return 0;
        }
        dvb_logerr("%s not found on retrieve",
@@ -672,14 +675,16 @@ int dvb_fe_retrieve_stats(struct dvb_v5_fe_parms *parms,
        return EINVAL;
 }
 
-int dvb_fe_store_stats(struct dvb_v5_fe_parms *parms,
-                       unsigned cmd, uint32_t value)
+static int dvb_fe_store_stats(struct dvb_v5_fe_parms *parms,
+                       unsigned cmd, uint32_t value,
+                       int valid)
 {
        int i;
        for (i = 0; i < DTV_MAX_STATS; i++) {
                if (parms->stats.prop[i].cmd != cmd)
                        continue;
                parms->stats.prop[i].u.data = value;
+               parms->stats.valid[i] = valid;
                return 0;
        }
        dvb_logerr("%s not found on store",
@@ -690,33 +695,42 @@ int dvb_fe_store_stats(struct dvb_v5_fe_parms *parms,
 
 int dvb_fe_get_stats(struct dvb_v5_fe_parms *parms)
 {
-       fe_status_t status;
-       uint32_t ber, ucb;
-       uint16_t strength, snr;
-       int i;
+       fe_status_t status = 0;
+       uint32_t ber= 0, ucb = 0;
+       uint16_t strength = 0, snr = 0;
+       int i, valid;
 
        if (ioctl(parms->fd, FE_READ_STATUS, &status) == -1) {
                dvb_perror("FE_READ_STATUS");
-               status = -1;
-       }
-       dvb_fe_store_stats(parms, DTV_STATUS, status);
+               valid = 0;
+       } else
+               valid = 1;
+       dvb_fe_store_stats(parms, DTV_STATUS, status, valid);
 
        if (ioctl(parms->fd, FE_READ_BER, &ber) == -1)
-               ber = 0;
-       dvb_fe_store_stats(parms, DTV_BER, ber);
+               valid = 0;
+       else
+               valid = 1;
+       dvb_fe_store_stats(parms, DTV_BER, ber, valid);
 
        if (ioctl(parms->fd, FE_READ_SIGNAL_STRENGTH, &strength) == -1)
-               strength = (uint16_t) -1;
-       dvb_fe_store_stats(parms, DTV_SIGNAL_STRENGTH, strength);
+               valid = 0;
+       else
+               valid = 1;
+
+       dvb_fe_store_stats(parms, DTV_SIGNAL_STRENGTH, strength, valid);
 
        if (ioctl(parms->fd, FE_READ_SNR, &snr) == -1)
-               snr = (uint16_t) -1;
-       dvb_fe_store_stats(parms, DTV_SNR, snr);
+               valid = 0;
+       else
+               valid = 1;
+       dvb_fe_store_stats(parms, DTV_SNR, snr, valid);
 
        if (ioctl(parms->fd, FE_READ_UNCORRECTED_BLOCKS, &ucb) == -1)
-               ucb = 0;
-       dvb_fe_store_stats(parms, DTV_UNCORRECTED_BLOCKS, snr);
-
+               valid = 0;
+       else
+               valid = 1;
+       dvb_fe_store_stats(parms, DTV_UNCORRECTED_BLOCKS, snr, valid);
 
        if (parms->verbose > 1) {
                dvb_log("Status: ");
@@ -754,7 +768,7 @@ int dvb_fe_get_event(struct dvb_v5_fe_parms *parms)
                                dvb_log ("    %s", fe_status_name[i].name);
                }
        }
-       dvb_fe_store_stats(parms, DTV_STATUS, status);
+       dvb_fe_store_stats(parms, DTV_STATUS, status, 1);
 
        dvb_fe_retrieve_parm(parms, DTV_FREQUENCY, &event.parameters.frequency);
        dvb_fe_retrieve_parm(parms, DTV_INVERSION, &event.parameters.inversion);

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to