[vlc-commits] DTV: DVB-S and DVB-S2 tuning

Rémi Denis-Courmont git at videolan.org
Sun Mar 20 17:24:50 CET 2011


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Mar 20 18:24:19 2011 +0200| [39cc0ea092b2e20cc9684504c46fc9f54f8ae792] | committer: Rémi Denis-Courmont

DTV: DVB-S and DVB-S2 tuning

This is untested. Frequency offsets and diseqc are not done yet.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=39cc0ea092b2e20cc9684504c46fc9f54f8ae792
---

 modules/access/dtv/access.c |   48 ++++++++++++++++++++++++++++++++++--------
 modules/access/dtv/linux.c  |   39 ++++++++++++++++++++++++++++++++++-
 2 files changed, 77 insertions(+), 10 deletions(-)

diff --git a/modules/access/dtv/access.c b/modules/access/dtv/access.c
index 55c033d..51faf17 100644
--- a/modules/access/dtv/access.c
+++ b/modules/access/dtv/access.c
@@ -81,8 +81,8 @@ static const char *const modulation_user[] = { N_("Undefined"),
 #define INVERSION_LONGTEXT N_( \
     "If the demodulator cannot detect spectral inversion correctly, " \
     "it needs to be configured manually.")
-const int inversion_vlc[] = { -1, 0, 1 };
-static const char *const auto_off_on[] = { N_("Automatic"),
+const int auto_off_on_vlc[] = { -1, 0, 1 };
+static const char *const auto_off_on_user[] = { N_("Automatic"),
     N_("Off"), N_("On") };
 
 #define CODE_RATE_TEXT N_("FEC code rate")
@@ -131,6 +131,15 @@ static const char *const hierarchy_user[] = { N_("Automatic"),
     N_("None"), "1", "2", "4",
 };
 
+#define PILOT_TEXT N_("Pilot")
+#define ROLLOFF_TEXT N_("Roll-off factor")
+const int rolloff_vlc[] = { -1,
+    35, 20, 25,
+};
+static const char *const rolloff_user[] = { N_("Automatic"),
+    N_("0.35 (same as DVB-S)"), N_("0.20"), N_("0.25"),
+};
+
 static int  Open (vlc_object_t *);
 static void Close (vlc_object_t *);
 
@@ -165,7 +174,7 @@ vlc_module_begin ()
         change_integer_range (0, UINT64_C(0xffffffff) * 1000)
         change_safe ()
     add_integer ("dvb-inversion", -1, INVERSION_TEXT, INVERSION_LONGTEXT, true)
-        change_integer_list (inversion_vlc, auto_off_on)
+        change_integer_list (auto_off_on_vlc, auto_off_on_user)
         change_safe ()
 
     set_section (N_("Terrestrial reception parameters"), NULL)
@@ -229,6 +238,13 @@ vlc_module_begin ()
         change_integer_range (0, 0x7fffffff)
         change_safe ()
 #endif
+    set_section (N_("DVB-S2 parameters"), NULL)
+    add_integer ("dvb-pilot", -1, PILOT_TEXT, PILOT_TEXT, true)
+        change_integer_list (auto_off_on_vlc, auto_off_on_user)
+        change_safe ()
+    add_integer ("dvb-rolloff", -1, ROLLOFF_TEXT, ROLLOFF_TEXT, true)
+        change_integer_list (rolloff_vlc, rolloff_user)
+        change_safe ()
 vlc_module_end ()
 
 struct access_sys_t
@@ -535,16 +551,30 @@ const delsys_t dvbc = { .setup = dvbc_setup };
 /*** DVB-S ***/
 static int dvbs_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
 {
-    (void) dev; (void) freq;
-    msg_Err (obj, "DVB-S not implemented");
-    return -1;
+    char *fec = var_InheritCodeRate (obj);
+    uint32_t srate = var_InheritInteger (obj, "dvb-srate");
+
+    /* FIXME: adjust frequency (offset) */
+    int ret = dvb_set_dvbs (dev, freq, srate, fec);
+    free (fec);
+
+    /* TODO: setup SEC */
+    return ret;
 }
 
 static int dvbs2_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
 {
-    (void) dev; (void) freq;
-    msg_Err (obj, "DVB-S2 not implemented");
-    return -1;
+    char *mod = var_InheritModulation (obj);
+    char *fec = var_InheritCodeRate (obj);
+    uint32_t srate = var_InheritInteger (obj, "dvb-srate");
+    int pilot = var_InheritInteger (obj, "dvb-pilot");
+    int rolloff = var_InheritInteger (obj, "dvb-rolloff");
+
+    /* FIXME: adjust frequency (offset)? SEC? */
+    int ret = dvb_set_dvbs2 (dev, freq, mod, srate, fec, pilot, rolloff);
+    free (fec);
+    free (mod);
+    return ret;
 }
 
 const delsys_t dvbs = { .setup = dvbs_setup };
diff --git a/modules/access/dtv/linux.c b/modules/access/dtv/linux.c
index 3320ac4..0290789 100644
--- a/modules/access/dtv/linux.c
+++ b/modules/access/dtv/linux.c
@@ -536,7 +536,44 @@ int dvb_set_dvbc (dvb_device_t *d, uint32_t freq, const char *modstr,
 
 
 /*** DVB-S ***/
-/* TODO */
+int dvb_set_dvbs (dvb_device_t *d, uint64_t freq,
+                  uint32_t srate, const char *fecstr)
+{
+    unsigned f = freq / 1000;
+    unsigned fec = dvb_parse_fec (fecstr);
+
+    return dvb_set_props (d, 5, DTV_CLEAR, 0, DTV_DELIVERY_SYSTEM, SYS_DVBS,
+                          DTV_FREQUENCY, f, DTV_SYMBOL_RATE, srate,
+                          DTV_INNER_FEC, fec);
+}
+
+int dvb_set_dvbs2 (dvb_device_t *d, uint64_t freq, const char *modstr,
+                   uint32_t srate, const char *fecstr, int pilot, int rolloff)
+{
+    unsigned f = freq / 1000;
+    unsigned mod = dvb_parse_modulation (modstr, QPSK);
+    unsigned fec = dvb_parse_fec (fecstr);
+
+    switch (pilot)
+    {
+        case 0:  pilot = PILOT_OFF;  break;
+        case 1:  pilot = PILOT_ON;   break;
+        default: pilot = PILOT_AUTO; break;
+    }
+
+    switch (rolloff)
+    {
+        case 20: rolloff = ROLLOFF_20;  break;
+        case 25: rolloff = ROLLOFF_25;  break;
+        case 35: rolloff = ROLLOFF_35;  break;
+        default: rolloff = PILOT_AUTO; break;
+    }
+
+    return dvb_set_props (d, 8, DTV_CLEAR, 0, DTV_DELIVERY_SYSTEM, SYS_DVBS2,
+                          DTV_FREQUENCY, f, DTV_MODULATION, mod,
+                          DTV_SYMBOL_RATE, srate, DTV_INNER_FEC, fec,
+                          DTV_PILOT, pilot, DTV_ROLLOFF, rolloff);
+}
 
 
 /*** DVB-T ***/



More information about the vlc-commits mailing list