From 83da4e0f9500259be05cf5752c93a53fcaa30c75 Mon Sep 17 00:00:00 2001 From: beralt Date: Thu, 21 Nov 2013 14:31:08 +0100 Subject: [PATCH 1/6] Fixed the SNR value which is in 0.1 dB resolution --- src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index a164b8a5..3f9a9d44 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -537,8 +537,9 @@ linuxdvb_frontend_monitor ( void *aux ) mmi->mmi_stats.signal = u16; if (!ioctl(lfe->lfe_fe_fd, FE_READ_BER, &u32)) mmi->mmi_stats.ber = u32; + /* SNR is reported in 0.1 dB resolution */ if (!ioctl(lfe->lfe_fe_fd, FE_READ_SNR, &u16)) - mmi->mmi_stats.snr = u16; + mmi->mmi_stats.snr = u16 / 10; if (!ioctl(lfe->lfe_fe_fd, FE_READ_UNCORRECTED_BLOCKS, &u32)) mmi->mmi_stats.unc = u32; } From d081c84865a61f3a1832e5e0c47fede43f187304 Mon Sep 17 00:00:00 2001 From: beralt Date: Thu, 21 Nov 2013 15:04:39 +0100 Subject: [PATCH 2/6] Convert the signal quality in linuxdvb to percentages --- src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index 3f9a9d44..a6eb6866 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -534,7 +534,7 @@ linuxdvb_frontend_monitor ( void *aux ) /* Statistics */ if (!ioctl(lfe->lfe_fe_fd, FE_READ_SIGNAL_STRENGTH, &u16)) - mmi->mmi_stats.signal = u16; + mmi->mmi_stats.signal = (u16 * 100) / 0xffff; if (!ioctl(lfe->lfe_fe_fd, FE_READ_BER, &u32)) mmi->mmi_stats.ber = u32; /* SNR is reported in 0.1 dB resolution */ From aed4f63151205a530cc38fe474b5b452d2639bdf Mon Sep 17 00:00:00 2001 From: beralt Date: Mon, 25 Nov 2013 11:19:08 +0100 Subject: [PATCH 3/6] linuxdvb: use the v5 property interface for statistics --- src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 67 ++++++++++++++++--- 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index a6eb6866..dc0c6446 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -451,6 +451,8 @@ linuxdvb_frontend_monitor ( void *aux ) mpegts_pid_t *mp; fe_status_t fe_status; signal_state_t status; + struct dtv_property fe_properties[6]; + struct dtv_properties dtv_prop; lfe->mi_display_name((mpegts_input_t*)lfe, buf, sizeof(buf)); tvhtrace("linuxdvb", "%s - checking FE status", buf); @@ -533,15 +535,62 @@ linuxdvb_frontend_monitor ( void *aux ) } /* Statistics */ - if (!ioctl(lfe->lfe_fe_fd, FE_READ_SIGNAL_STRENGTH, &u16)) - mmi->mmi_stats.signal = (u16 * 100) / 0xffff; - if (!ioctl(lfe->lfe_fe_fd, FE_READ_BER, &u32)) - mmi->mmi_stats.ber = u32; - /* SNR is reported in 0.1 dB resolution */ - if (!ioctl(lfe->lfe_fe_fd, FE_READ_SNR, &u16)) - mmi->mmi_stats.snr = u16 / 10; - if (!ioctl(lfe->lfe_fe_fd, FE_READ_UNCORRECTED_BLOCKS, &u32)) - mmi->mmi_stats.unc = u32; + /* try the v5 API first */ + fe_properties[0].cmd = DTV_STAT_SIGNAL_STRENGTH; + /* BER */ + fe_properties[1].cmd = DTV_STAT_PRE_ERROR_BIT_COUNT; + fe_properties[2].cmd = DTV_STAT_PRE_TOTAL_BIT_COUNT; + fe_properties[3].cmd = DTV_STAT_CNR; + /* PER */ + fe_properties[4].cmd = DTV_STAT_ERROR_BLOCK_COUNT; + fe_properties[5].cmd = DTV_STAT_TOTAL_BLOCK_COUNT; + dtv_prop.num = 6; + dtv_prop.props = fe_properties; + + if(!ioctl(lfe->lfe_fe_fd, FE_GET_PROPERTY, &dtv_prop)) { + /* use v5 API */ + if(fe_properties[0].u.st.len > 0) { + if(fe_properties[0].u.st.stat[0].scale == FE_SCALE_RELATIVE) + mmi->mmi_stats.signal = (fe_properties[0].u.st.stat[0].uvalue * 100) / 0xffff; + /* TODO: handle other scales */ + } + /* Calculate BER from PRE_ERROR and TOTAL_BIT_COUNT */ + if(fe_properties[1].u.st.len > 0) { + if(fe_properties[1].u.st.stat[0].scale == FE_SCALE_COUNTER) + u16 = fe_properties[1].u.st.stat[0].uvalue; + } + if(fe_properties[2].u.st.len > 0) { + if(fe_properties[2].u.st.stat[0].scale == FE_SCALE_COUNTER) + mmi->mmi_stats.ber = u16 / fe_properties[2].u.st.stat[0].uvalue; + } + if(fe_properties[3].u.st.len > 0) { + /* note that decibel scale means 0.0001 dB units */ + /* TODO: snr is not unsigned, but signed! */ + if(fe_properties[3].u.st.stat[0].scale == FE_SCALE_DECIBEL) + mmi->mmi_stats.snr = fe_properties[3].u.st.stat[0].uvalue; + /* TODO: handle other scales */ + } + /* Calculate PER from PRE_ERROR and TOTAL_BIT_COUNT */ + if(fe_properties[4].u.st.len > 0) { + if(fe_properties[4].u.st.stat[0].scale == FE_SCALE_COUNTER) + u16 = fe_properties[4].u.st.stat[0].uvalue; + } + if(fe_properties[5].u.st.len > 0) { + if(fe_properties[5].u.st.stat[0].scale == FE_SCALE_COUNTER) + mmi->mmi_stats.unc = u16 / fe_properties[5].u.st.stat[0].uvalue; + } + } else { + /* use old v3 API */ + if (!ioctl(lfe->lfe_fe_fd, FE_READ_SIGNAL_STRENGTH, &u16)) + mmi->mmi_stats.signal = u16; + if (!ioctl(lfe->lfe_fe_fd, FE_READ_BER, &u32)) + mmi->mmi_stats.ber = u32; + if (!ioctl(lfe->lfe_fe_fd, FE_READ_SNR, &u16)) + mmi->mmi_stats.snr = u16; + if (!ioctl(lfe->lfe_fe_fd, FE_READ_UNCORRECTED_BLOCKS, &u32)) + mmi->mmi_stats.unc = u32; + } + } static void * From 124039f1aee324c183b59ccba13d412e5d30d76f Mon Sep 17 00:00:00 2001 From: beralt Date: Mon, 25 Nov 2013 11:27:13 +0100 Subject: [PATCH 4/6] linuxdvb: fix small errors while gathering statistics --- src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index dc0c6446..91f43f0c 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -560,8 +560,12 @@ linuxdvb_frontend_monitor ( void *aux ) u16 = fe_properties[1].u.st.stat[0].uvalue; } if(fe_properties[2].u.st.len > 0) { - if(fe_properties[2].u.st.stat[0].scale == FE_SCALE_COUNTER) - mmi->mmi_stats.ber = u16 / fe_properties[2].u.st.stat[0].uvalue; + if(fe_properties[2].u.st.stat[0].scale == FE_SCALE_COUNTER) { + if(fe_properties[5].u.st.stat[0].uvalue > 0 ) + mmi->mmi_stats.ber = u16 / fe_properties[2].u.st.stat[0].uvalue; + else + mmi->mmi_stats.ber = 0; + } } if(fe_properties[3].u.st.len > 0) { /* note that decibel scale means 0.0001 dB units */ @@ -576,8 +580,12 @@ linuxdvb_frontend_monitor ( void *aux ) u16 = fe_properties[4].u.st.stat[0].uvalue; } if(fe_properties[5].u.st.len > 0) { - if(fe_properties[5].u.st.stat[0].scale == FE_SCALE_COUNTER) - mmi->mmi_stats.unc = u16 / fe_properties[5].u.st.stat[0].uvalue; + if(fe_properties[5].u.st.stat[0].scale == FE_SCALE_COUNTER) { + if(fe_properties[5].u.st.stat[0].uvalue > 0 ) + mmi->mmi_stats.unc = u16 / fe_properties[5].u.st.stat[0].uvalue; + else + mmi->mmi_stats.unc = 0; + } } } else { /* use old v3 API */ From d4d7e3259a525f1d14a1e27895039db4d21c9b08 Mon Sep 17 00:00:00 2001 From: beralt Date: Mon, 25 Nov 2013 11:32:33 +0100 Subject: [PATCH 5/6] linuxdvb: another small typo --- src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index 91f43f0c..f49c9889 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -561,7 +561,7 @@ linuxdvb_frontend_monitor ( void *aux ) } if(fe_properties[2].u.st.len > 0) { if(fe_properties[2].u.st.stat[0].scale == FE_SCALE_COUNTER) { - if(fe_properties[5].u.st.stat[0].uvalue > 0 ) + if(fe_properties[2].u.st.stat[0].uvalue > 0 ) mmi->mmi_stats.ber = u16 / fe_properties[2].u.st.stat[0].uvalue; else mmi->mmi_stats.ber = 0; From 186344816a4ca54379820ad5d7dcc2bb42122ee1 Mon Sep 17 00:00:00 2001 From: beralt Date: Mon, 25 Nov 2013 11:59:16 +0100 Subject: [PATCH 6/6] linuxdvb: convert snr units to dB --- src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index f49c9889..0e3aef10 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -568,10 +568,9 @@ linuxdvb_frontend_monitor ( void *aux ) } } if(fe_properties[3].u.st.len > 0) { - /* note that decibel scale means 0.0001 dB units */ - /* TODO: snr is not unsigned, but signed! */ + /* note that decibel scale means 1 = 0.0001 dB units here */ if(fe_properties[3].u.st.stat[0].scale == FE_SCALE_DECIBEL) - mmi->mmi_stats.snr = fe_properties[3].u.st.stat[0].uvalue; + mmi->mmi_stats.snr = fe_properties[3].u.st.stat[0].svalue * 0.0001; /* TODO: handle other scales */ } /* Calculate PER from PRE_ERROR and TOTAL_BIT_COUNT */