]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
linuxdvb: support properly PLS ROOT
authorJaroslav Kysela <perex@perex.cz>
Sat, 13 Oct 2018 10:36:05 +0000 (12:36 +0200)
committerJaroslav Kysela <perex@perex.cz>
Sat, 13 Oct 2018 10:37:45 +0000 (12:37 +0200)
src/input/mpegts/dvb.h
src/input/mpegts/dvb_support.c
src/input/mpegts/linuxdvb/linuxdvb_frontend.c

index 149cec4e37350fbb7ff889a63d5a939de037d427..ab036850f96bf9ade22dd92149f9715f98e6d398 100644 (file)
@@ -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 );
index c51c43d2edd77306ba46067d1712fe7810c7b6ab..09712d6feee668e02ba1cc30fe249e8f52d57c99 100644 (file)
@@ -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 */
 
 /**
index af1d93ce9a6bed09aea87b24e4829877505c9297..115bed0997c5ebcb80e89ead43e19e70b9e31cec 100644 (file)
@@ -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);