Page 1 of 1
DVB Rolloff?
Posted: 08 Oct 2009 10:31
by MrLou
Hi,
I use VLC to tune and then stream dvb adapters in a Linux server.
When tuning a DVB-S2 adapter one needs to specify the rolloff factor so that the driver can then set it.
This seems to be unsupported, I've looked at the VLC command line help:
http://wiki.videolan.org/VLC_command-line_help
but see no mention of rolloff.
Is this something that will be added in future, I think DVB-S2 will become quite important in the next few years!
Thanks,
Lou
Re: DVB Rolloff?
Posted: 08 Oct 2009 19:19
by Jean-Baptiste Kempf
I am not sure DVB-S2 is in VLC...
Re: DVB Rolloff?
Posted: 09 Oct 2009 16:05
by MrLou
Yes, you're right
I'd forgotten that I'd patched VLC to work with the new S2 API! I'd better rework my patch to change the rolloff from AUTO to 35.
I should add that I'm happy to share this small patch if anyone is interested.
Cheers,
Lou
Re: DVB Rolloff?
Posted: 09 Oct 2009 17:17
by xtophe
I think you should post the patch to vlc-devel@ videolan.org (and here).
So that people find it f they do a search. And if it's clean it should be incorporated in next vlc release
Re: DVB Rolloff?
Posted: 12 Oct 2009 10:49
by MrLou
Hi,
Below is the patch I created.
It was made against VLC 0.9.8a, but applies OK against VLC 0.9.9a too, I haven't tested it against anything more recent.
Thanks,
Lou
Code: Select all
diff -urN --exclude 'Make*' vlc-0.9.8a.orig/modules/access/dvb/access.c vlc-0.9.8a/modules/access/dvb/access.c
--- vlc-0.9.8a.orig/modules/access/dvb/access.c 2008-10-15 20:31:20.000000000 +0100
+++ vlc-0.9.8a/modules/access/dvb/access.c 2009-02-25 14:16:50.000000000 +0000
@@ -86,6 +86,9 @@
#define DEVICE_TEXT N_("Device number to use on adapter")
#define DEVICE_LONGTEXT ""
+#define DELIVERY_TEXT N_("Delivery System")
+#define DELIVERY_LONGTEXT ""
+
#define FREQ_TEXT N_("Transponder/multiplex frequency")
#define FREQ_LONGTEXT N_("In kHz for DVB-S or Hz for DVB-C/T")
@@ -109,6 +112,9 @@
#define HIGH_VOLTAGE_LONGTEXT N_("Enable high voltage if your cables are " \
"particularly long. This is not supported by all frontends.")
+#define MODULATION_2G_TEXT N_("2nd Gen Modulation")
+#define MODULATION_2G_LONGTEXT N_("DVB-S2, C2 and T2 support")
+
#define TONE_TEXT N_("22 kHz tone")
#define TONE_LONGTEXT N_("[0=off, 1=on, -1=auto].")
@@ -196,6 +202,8 @@
false );
add_integer( "dvb-device", 0, NULL, DEVICE_TEXT, DEVICE_LONGTEXT,
true );
+ add_integer( "dvb-delivery", 0, NULL, DELIVERY_TEXT, DELIVERY_LONGTEXT,
+ true );
add_integer( "dvb-frequency", 11954000, NULL, FREQ_TEXT, FREQ_LONGTEXT,
false );
add_integer( "dvb-inversion", 2, NULL, INVERSION_TEXT, INVERSION_LONGTEXT,
@@ -208,6 +216,9 @@
true );
add_integer( "dvb-voltage", 13, NULL, VOLTAGE_TEXT, VOLTAGE_LONGTEXT,
true );
+ // TODO: Added 2G modulation
+ add_bool( "dvb-2g-modulation", 0, NULL, MODULATION_2G_TEXT,
+ MODULATION_2G_LONGTEXT, true );
add_bool( "dvb-high-voltage", 0, NULL, HIGH_VOLTAGE_TEXT,
HIGH_VOLTAGE_LONGTEXT, true );
add_integer( "dvb-tone", -1, NULL, TONE_TEXT, TONE_LONGTEXT,
@@ -661,12 +672,15 @@
/* */
var_Create( p_access, "dvb-adapter", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_access, "dvb-device", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
+ var_Create( p_access, "dvb-delivery", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_access, "dvb-frequency", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_access, "dvb-inversion", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_access, "dvb-probe", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
var_Create( p_access, "dvb-budget-mode", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
/* */
+ //TODO: Added 2nd gen mod
+ var_Create( p_access, "dvb-2g-modulation", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_access, "dvb-satno", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_access, "dvb-voltage", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_access, "dvb-high-voltage", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
@@ -745,8 +759,9 @@
else GET_OPTION_INT("inversion")
else GET_OPTION_BOOL("probe")
else GET_OPTION_BOOL("budget-mode")
-
+ else GET_OPTION_INT("dvb-delivery")
else GET_OPTION_INT("voltage")
+ else GET_OPTION_BOOL("dvb-2g-modulation")
else GET_OPTION_BOOL("high-voltage")
else GET_OPTION_INT("tone")
else GET_OPTION_INT("satno")
diff -urN --exclude 'Make*' vlc-0.9.8a.orig/modules/access/dvb/linux_dvb.c vlc-0.9.8a/modules/access/dvb/linux_dvb.c
--- vlc-0.9.8a.orig/modules/access/dvb/linux_dvb.c 2008-10-15 20:31:20.000000000 +0100
+++ vlc-0.9.8a/modules/access/dvb/linux_dvb.c 2009-02-25 14:18:12.000000000 +0000
@@ -82,6 +82,7 @@
#define FRONTEND_LOCK_TIMEOUT 10000000 /* 10 s */
/* Local prototypes */
+static fe_modulation_t DecodeModulationPSK( access_t *p_access );
static int FrontendInfo( access_t * );
static int FrontendSetQPSK( access_t * );
static int FrontendSetQAM( access_t * );
@@ -133,6 +134,7 @@
return VLC_EGENERIC;
}
+ msg_Dbg( p_access, "Frontend open - about to check type" );
switch( p_frontend->info.type )
{
case FE_OFDM:
@@ -142,7 +144,16 @@
psz_real = "DVB-C";
break;
case FE_QPSK:
- psz_real = "DVB-S";
+ msg_Dbg( p_access, "Checking for DVB-S or DVB-S2" );
+ if (p_frontend->info.caps & FE_CAN_2G_MODULATION)
+ {
+ // If can do 2G Mod, we have a DVB-S2 card
+ psz_real = "DVB-S2";
+ }
+ else
+ {
+ psz_real = "DVB-S";
+ }
break;
case FE_ATSC:
psz_real = "ATSC";
@@ -240,7 +251,7 @@
case FE_QPSK:
if( FrontendSetQPSK( p_access ) < 0 )
{
- msg_Err( p_access, "DVB-S: tuning failed" );
+ msg_Err( p_access, "DVB-S/DVB-S2: tuning failed" );
return VLC_EGENERIC;
}
break;
@@ -541,7 +552,14 @@
switch( p_frontend->info.type )
{
case FE_QPSK:
- msg_Dbg( p_access, " type = QPSK (DVB-S)" );
+ if (p_frontend->info.caps & FE_CAN_2G_MODULATION)
+ {
+ msg_Dbg( p_access, " type = DVB-S2" );
+ }
+ else
+ {
+ msg_Dbg( p_access, " type = DVB-S" );
+ }
break;
case FE_QAM:
msg_Dbg( p_access, " type = QAM (DVB-C)" );
@@ -631,6 +649,8 @@
msg_Dbg(p_access, " card can mute TS");
if( p_frontend->info.caps & FE_CAN_RECOVER)
msg_Dbg(p_access, " card can recover from a cable unplug");
+ if( p_frontend->info.caps & FE_CAN_2G_MODULATION)
+ msg_Dbg(p_access, " card can do 2nd gen modulation");
if( p_frontend->info.caps & FE_CAN_8VSB)
msg_Dbg(p_access, " card can do 8vsb");
if( p_frontend->info.caps & FE_CAN_16VSB)
@@ -664,6 +684,9 @@
return fe_inversion;
}
+/*****************************************************************************
+ * DecodeFEC: Returns FEC value
+ *****************************************************************************/
static fe_code_rate_t DecodeFEC( access_t *p_access, int i_val )
{
fe_code_rate_t fe_fec = FEC_NONE;
@@ -682,6 +705,11 @@
case 7: fe_fec = FEC_7_8; break;
case 8: fe_fec = FEC_8_9; break;
case 9: fe_fec = FEC_AUTO; break;
+
+ // Added new values
+ case 10: fe_fec = FEC_3_5; break;
+ case 11: fe_fec = FEC_9_10; break;
+
default:
/* cannot happen */
fe_fec = FEC_NONE;
@@ -691,6 +719,9 @@
return fe_fec;
}
+/*****************************************************************************
+ * DecodeModulationQAM: Returns QAM modulation
+ *****************************************************************************/
static fe_modulation_t DecodeModulationQAM( access_t *p_access )
{
switch( var_GetInteger( p_access, "dvb-modulation" ) )
@@ -706,6 +737,10 @@
return QAM_AUTO;
}
}
+
+/*****************************************************************************
+ * DecodeModulationOFDM : Returns OFDM modulation
+ *****************************************************************************/
static fe_modulation_t DecodeModulationOFDM( access_t *p_access )
{
switch( var_GetInteger( p_access, "dvb-modulation" ) )
@@ -722,6 +757,9 @@
return QAM_AUTO;
}
}
+/*****************************************************************************
+ * DecodeModulationATSC : Returns ATSC modulation
+ *****************************************************************************/
static fe_modulation_t DecodeModulationATSC( access_t *p_access )
{
switch( var_GetInteger( p_access, "dvb-modulation" ) )
@@ -735,7 +773,37 @@
}
/*****************************************************************************
- * FrontendSetQPSK : controls the FE device
+ * DecodeDeliverySystem : Returns delivery system
+ *****************************************************************************/
+static fe_delivery_system_t DecodeDeliverySystem( access_t *p_access )
+{
+ return var_GetInteger( p_access, "dvb-delivery" );
+}
+
+/*****************************************************************************
+ * DecodeModulationPSK : Returns DVB-S modulation
+ *****************************************************************************/
+static fe_modulation_t DecodeModulationPSK( access_t *p_access )
+{
+ int mod;
+
+ mod = var_GetInteger( p_access, "dvb-modulation" );
+
+ switch(mod)
+ {
+ case QPSK: return QPSK;
+ case PSK_8: return PSK_8;
+ case APSK_16: return APSK_16;
+ case APSK_32: return APSK_32;
+ default:
+ msg_Dbg( p_access, "DVB modulation not set, got %d, using QPSK",mod);
+ return QPSK;
+ }
+}
+
+
+/*****************************************************************************
+ * DecodeVoltage : controls the FE device
*****************************************************************************/
static fe_sec_voltage_t DecodeVoltage( access_t *p_access )
{
@@ -890,18 +958,27 @@
return 0;
}
+/*****************************************************************************
+ * FrontendSetQPSK : controls the FE device
+ *****************************************************************************/
static int FrontendSetQPSK( access_t *p_access )
{
access_sys_t *p_sys = p_access->p_sys;
struct dvb_frontend_parameters fep;
+ fe_modulation_t modulation;
int i_ret;
vlc_value_t val;
int i_frequency, i_lnb_slof = 0, i_lnb_lof1, i_lnb_lof2 = 0;
+ fe_delivery_system_t delSys;
/* Prepare the fep structure */
var_Get( p_access, "dvb-frequency", &val );
i_frequency = val.i_int;
+ modulation = DecodeModulationPSK(p_access);
+ // TODO: is this a valid way of determining between DVB-S and DVB-S2?
+ delSys = DecodeDeliverySystem(p_access);
+
var_Get( p_access, "dvb-lnb-lof1", &val );
if ( val.i_int == 0 )
{
@@ -983,21 +1060,36 @@
return VLC_EGENERIC;
}
- /* Empty the event queue */
- for( ; ; )
- {
- struct dvb_frontend_event event;
- if ( ioctl( p_sys->i_frontend_handle, FE_GET_EVENT, &event ) < 0
- && errno == EWOULDBLOCK )
- break;
- }
+ struct dvb_frontend_event ev;
+ struct dtv_property p_tune[] = {
+ { .cmd = DTV_DELIVERY_SYSTEM, .u.data = delSys },
+ { .cmd = DTV_FREQUENCY, .u.data = fep.frequency },
+ { .cmd = DTV_MODULATION, .u.data = modulation },
+ { .cmd = DTV_SYMBOL_RATE, .u.data = fep.u.qpsk.symbol_rate },
+ { .cmd = DTV_INNER_FEC, .u.data = fep.u.qpsk.fec_inner },
+ { .cmd = DTV_INVERSION, .u.data = fep.inversion },
+ { .cmd = DTV_ROLLOFF, .u.data = ROLLOFF_AUTO },
+ { .cmd = DTV_TUNE },
+ };
+ struct dtv_properties cmdseq_tune = {
+ .num = 8, //Important - this must match the count of .cmd's above
+ .props = p_tune
+ };
+
+ /* discard stale QPSK events */
+ while (1) {
+ if (ioctl(p_sys->i_frontend_handle, FE_GET_EVENT, &ev) == -1)
+ break;
+ }
+
+ msg_Dbg(p_access,"About to tune: mod=%d delivery=%d, freq=%d",modulation,delSys,fep.frequency);
/* Now send it all to the frontend device */
- if( (i_ret = ioctl( p_sys->i_frontend_handle, FE_SET_FRONTEND, &fep )) < 0 )
- {
- msg_Err( p_access, "DVB-S: setting frontend failed (%d) %m", i_ret );
- return VLC_EGENERIC;
- }
+ if ((ioctl(p_sys->i_frontend_handle, FE_SET_PROPERTY, &cmdseq_tune)) == -1)
+ {
+ msg_Err(p_access,"FE_SET_PROPERTY TUNE failed");
+ return VLC_EGENERIC;
+ }
return VLC_SUCCESS;
}
@@ -1493,7 +1585,7 @@
msg_Dbg( p_access, "CAMInit: NDS scrambling system supported" );
if ( caps.descr_type & CA_DSS )
msg_Dbg( p_access, "CAMInit: DSS scrambling system supported" );
-
+
if ( caps.slot_num == 0 )
{
msg_Err( p_access, "CAMInit: CAM module with no slots" );
Re: DVB Rolloff?
Posted: 14 Oct 2009 10:36
by Jean-Baptiste Kempf
can you send that to vlc-devel@, please?
Re: DVB Rolloff?
Posted: 15 Oct 2009 18:29
by MrLou
I already did. should I have had any kind of reply?
Thanks,
Lou
Re: DVB Rolloff?
Posted: 15 Oct 2009 18:30
by Jean-Baptiste Kempf
Well, it went through...
People are asking for a VLC 1.1 version of the patch