]> 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:36:05 +0000 (12:36 +0200)
src/input/mpegts/dvb.h
src/input/mpegts/dvb_support.c
src/input/mpegts/linuxdvb/linuxdvb_frontend.c

index 2b5533564a2cc204aa54c00ca425e6042227e1dc..7eabd9c8a6dfb653eaded6e56226cdf2daa4ba86 100644 (file)
@@ -679,6 +679,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 5641464e60569e3a4bf2630b62d4f1ed3f63c8e8..8febb24ecfd1a4340fc2a4f5ac1aeb3ba0ab251b 100644 (file)
@@ -1170,6 +1170,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 62214a3a866422f8de746bd8b56fea3e848ff95c..7d2371f925bedcdcf72708282ed51caca37e4dff 100644 (file)
@@ -1836,7 +1836,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);
@@ -1877,7 +1877,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);