From 0b8d903f230c29fd8a213e8a06a5a11bcc1ecae8 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Sat, 13 Oct 2018 12:36:05 +0200 Subject: [PATCH] linuxdvb: support properly PLS ROOT --- src/input/mpegts/dvb.h | 2 ++ src/input/mpegts/dvb_support.c | 17 +++++++++++++++++ src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 4 ++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/input/mpegts/dvb.h b/src/input/mpegts/dvb.h index 149cec4e3..ab036850f 100644 --- a/src/input/mpegts/dvb.h +++ b/src/input/mpegts/dvb.h @@ -703,6 +703,8 @@ static inline int dvb_modulation_is_none_or_auto ( int modulation ) modulation == DVB_MOD_QAM_AUTO; } +uint32_t dvb_sat_pls( dvb_mux_conf_t *dmc ); + #endif /* ENABLE_MPEGTS_DVB */ void dvb_init ( void ); diff --git a/src/input/mpegts/dvb_support.c b/src/input/mpegts/dvb_support.c index c51c43d2e..09712d6fe 100644 --- a/src/input/mpegts/dvb_support.c +++ b/src/input/mpegts/dvb_support.c @@ -1193,6 +1193,23 @@ dvb_sat_position_from_str( const char *buf ) return (maj * 10 + min) * (c == 'W' ? -1 : 1); } +uint32_t +dvb_sat_pls( dvb_mux_conf_t *dmc ) +{ + if (dmc->dmc_fe_pls_mode == DVB_PLS_ROOT) { + uint32_t x, g; + const uint32_t root = dmc->dmc_fe_pls_code & 0x3ffff; + + for (g = 0, x = 1; g < 0x3ffff; g++) { + if (root == x) + return g; + x = (((x ^ (x >> 7)) & 1) << 17) | (x >> 1); + } + return 0x3ffff; + } + return dmc->dmc_fe_pls_code & 0x3ffff; +} + #endif /* ENABLE_MPEGTS_DVB */ /** diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index af1d93ce9..115bed099 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -1881,7 +1881,7 @@ linuxdvb_frontend_tune0 #if DVB_VER_ATLEAST(5,9) S2CMD(DTV_STREAM_ID, r); #if DVB_VER_ATLEAST(5,11) - S2CMD(DTV_SCRAMBLING_SEQUENCE_INDEX, dmc->dmc_fe_pls_code & 0x3FFFF); + S2CMD(DTV_SCRAMBLING_SEQUENCE_INDEX, dvb_sat_pls(dmc)); #endif #elif DVB_VER_ATLEAST(5,3) S2CMD(DTV_DVBT2_PLP_ID, r); @@ -1922,7 +1922,7 @@ linuxdvb_frontend_tune0 #if DVB_VER_ATLEAST(5,9) S2CMD(DTV_STREAM_ID, r); #if DVB_VER_ATLEAST(5,11) - S2CMD(DTV_SCRAMBLING_SEQUENCE_INDEX, dmc->dmc_fe_pls_code & 0x3FFFF); + S2CMD(DTV_SCRAMBLING_SEQUENCE_INDEX, dvb_sat_pls(dmc)); #endif #elif DVB_VER_ATLEAST(5,3) S2CMD(DTV_DVBT2_PLP_ID, r); -- 2.47.2