[dvblast-devel] Add support for DVB-T/S2 and ISDB multistream.
Georgi Chorbadzhiyski
git at videolan.org
Thu Jan 17 23:14:12 CET 2013
dvblast | branch: master | Georgi Chorbadzhiyski <gf at unixsol.org> | Fri Nov 11 21:55:40 2011 +0200| [347f184da2355d8a6fcddc2eccf306e5f95aee12] | committer: Georgi Chorbadzhiyski
Add support for DVB-T/S2 and ISDB multistream.
Generic multistream support was added in Linux 3.6 in commit 287cefd096b.
http://git.kernel.org/gitweb.cgi?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=287cefd096b
The way it is added it is backwards compatible with older kernels.
This patch implements mis support in DVBlast. Unfortunately I don't
have mis compatible hardware and a way to test it, so I'm posting
this patch as RFC and RFT.
If your frontend reports FE_CAN_MULTISTREAM (you have to use Linux 3.6
and higher) it'll be invaluable to test if multistream support is
working.
> http://git.videolan.org/gitweb.cgi/dvblast.git/?a=commit;h=347f184da2355d8a6fcddc2eccf306e5f95aee12
---
NEWS | 1 +
config.h | 6 ++++++
dvb.c | 11 +++++++----
dvblast.c | 11 +++++++++--
dvblast.h | 1 +
dvblastctl.c | 3 +--
6 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/NEWS b/NEWS
index b67922b..d513e13 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ Changes between 2.2 and 2.3:
* Added CA device addressing.
* Added support for remapping ES pids to fixed values.
* Added support for multi-delivery system frontends.
+ * Added support for multistream that appeared in Linux 3.6
Changes between 2.1 and 2.2:
----------------------------
diff --git a/config.h b/config.h
index 8a009af..e09c09c 100644
--- a/config.h
+++ b/config.h
@@ -25,9 +25,15 @@
#define _DVBLAST_CONFIG_H_
#if defined(__linux__)
+#define DVBAPI_VERSION ((DVB_API_VERSION)*100+(DVB_API_VERSION_MINOR))
#define HAVE_DVB_SUPPORT
#define HAVE_ASI_SUPPORT
#define HAVE_CLOCK_NANOSLEEP
+#define HAVE_DVB_MULTISTREAM
+#if DVBAPI_VERSION < 508
+ #define DTV_STREAM_ID 42
+ #define FE_CAN_MULTISTREAM 0x4000000
+#endif
#endif
#define HAVE_ICONV
diff --git a/dvb.c b/dvb.c
index d257c80..14d5f66 100644
--- a/dvb.c
+++ b/dvb.c
@@ -580,8 +580,6 @@ static int FrontendDoDiseqc(void)
return bis_frequency;
}
-#define DVBAPI_VERSION ((DVB_API_VERSION)*100+(DVB_API_VERSION_MINOR))
-
#if DVB_API_VERSION >= 5
#if DVBAPI_VERSION < 505
@@ -777,6 +775,7 @@ static void FrontendInfo( struct dvb_frontend_info info, uint32_t version,
#if DVBAPI_VERSION >= 501
FRONTEND_INFO( info.caps, FE_CAN_2G_MODULATION, "2G_MODULATION" )
#endif
+ FRONTEND_INFO( info.caps, FE_CAN_MULTISTREAM, "MULTISTREAM" )
FRONTEND_INFO( info.caps, FE_NEEDS_BENDING, "NEEDS_BENDING" )
FRONTEND_INFO( info.caps, FE_CAN_RECOVER, "FE_CAN_RECOVER" )
FRONTEND_INFO( info.caps, FE_CAN_MUTE_TS, "FE_CAN_MUTE_TS" )
@@ -862,6 +861,7 @@ static struct dtv_property dvbs2_cmdargs[] = {
{ .cmd = DTV_INNER_FEC, .u.data = FEC_AUTO },
{ .cmd = DTV_PILOT, .u.data = PILOT_AUTO },
{ .cmd = DTV_ROLLOFF, .u.data = ROLLOFF_AUTO },
+ { .cmd = DTV_STREAM_ID, .u.data = 0 },
{ .cmd = DTV_TUNE },
};
static struct dtv_properties dvbs2_cmdseq = {
@@ -928,6 +928,7 @@ static struct dtv_properties atsc_cmdseq = {
#define PILOT 7
#define TRANSMISSION 8
#define ROLLOFF 8
+#define MIS 9
#define HIERARCHY 9
struct dtv_property pclear[] = {
@@ -1132,6 +1133,7 @@ static void FrontendSet( bool b_init )
p->props[MODULATION].u.data = GetModulation();
p->props[PILOT].u.data = GetPilot();
p->props[ROLLOFF].u.data = GetRollOff();
+ p->props[MIS].u.data = i_mis;
}
else
p = &dvbs_cmdseq;
@@ -1141,9 +1143,10 @@ static void FrontendSet( bool b_init )
p->props[FEC_INNER].u.data = GetFECInner(info.caps);
p->props[FREQUENCY].u.data = FrontendDoDiseqc();
- msg_Dbg( NULL, "tuning DVB-S frontend to f=%d srate=%d inversion=%d fec=%d rolloff=%d modulation=%s pilot=%d",
+ msg_Dbg( NULL, "tuning DVB-S frontend to f=%d srate=%d inversion=%d fec=%d rolloff=%d modulation=%s pilot=%d mis=%d",
i_frequency, i_srate, i_inversion, i_fec, i_rolloff,
- psz_modulation == NULL ? "legacy" : psz_modulation, i_pilot );
+ psz_modulation == NULL ? "legacy" : psz_modulation, i_pilot,
+ i_mis );
break;
case SYS_ATSC:
diff --git a/dvblast.c b/dvblast.c
index 721782c..3c2bee4 100644
--- a/dvblast.c
+++ b/dvblast.c
@@ -75,6 +75,7 @@ int b_tone = 0;
int i_bandwidth = 8;
char *psz_modulation = NULL;
int i_pilot = -1;
+int i_mis = 0;
int i_fec_lp = 999;
int i_guard = -1;
int i_transmission = -1;
@@ -486,6 +487,7 @@ void usage()
msg_Raw( NULL, " -P --pilot DVB-S2 Pilot (-1 auto, 0 off, 1 on)" );
msg_Raw( NULL, " -R --rolloff DVB-S2 Rolloff value" );
msg_Raw( NULL, " DVB-S2 35=0.35|25=0.25|20=0.20|0=AUTO (default: 35)" );
+ msg_Raw( NULL, " -1 --multistream-id Set stream ID (0-255, default: 0)" );
msg_Raw( NULL, " -K --fec-lp DVB-T low priority FEC (default auto)" );
msg_Raw( NULL, " -G --guard DVB-T guard interval" );
msg_Raw( NULL, " DVB-T 32 (1/32)|16 (1/16)|8 (1/8)|4 (1/4)|-1 (auto, default)" );
@@ -555,7 +557,7 @@ int main( int i_argc, char **pp_argv )
usage();
/*
- * The only short options left are: 12346789
+ * The only short options left are: 2346789
* Use them wisely.
*/
static const struct option long_options[] =
@@ -580,6 +582,7 @@ int main( int i_argc, char **pp_argv )
{ "inversion", required_argument, NULL, 'I' },
{ "modulation", required_argument, NULL, 'm' },
{ "pilot", required_argument, NULL, 'P' },
+ { "mutistream-id", required_argument, NULL, '1' },
{ "fec-lp", required_argument, NULL, 'K' },
{ "guard", required_argument, NULL, 'G' },
{ "hierarchy", required_argument, NULL, 'H' },
@@ -617,7 +620,7 @@ int main( int i_argc, char **pp_argv )
{ 0, 0, 0, 0 }
};
- while ( (c = getopt_long(i_argc, pp_argv, "q::c:r:t:o:i:a:n:5:f:F:R:s:S:k:v:pb:I:m:P:K:G:H:X:O:uwUTL:E:d:D:A:lg:zCWYeM:N:j:J:B:x:Q:hVZ:y:0:", long_options, NULL)) != -1 )
+ while ( (c = getopt_long(i_argc, pp_argv, "q::c:r:t:o:i:a:n:5:f:F:R:s:S:k:v:pb:I:m:P:K:G:H:X:O:uwUTL:E:d:D:A:lg:zCWYeM:N:j:J:B:x:Q:hVZ:y:0:1:", long_options, NULL)) != -1 )
{
switch ( c )
{
@@ -745,6 +748,10 @@ int main( int i_argc, char **pp_argv )
i_pilot = strtol( optarg, NULL, 0 );
break;
+ case '1':
+ i_mis = strtol( optarg, NULL, 0 );
+ break;
+
case 'K':
i_fec_lp = strtol( optarg, NULL, 0 );
break;
diff --git a/dvblast.h b/dvblast.h
index 5df0d49..7026ab8 100644
--- a/dvblast.h
+++ b/dvblast.h
@@ -166,6 +166,7 @@ extern int i_bandwidth;
extern int i_inversion;
extern char *psz_modulation;
extern int i_pilot;
+extern int i_mis;
extern int i_fec_lp;
extern int i_guard;
extern int i_transmission;
diff --git a/dvblastctl.c b/dvblastctl.c
index 1cb3cc2..0ffb1b9 100644
--- a/dvblastctl.c
+++ b/dvblastctl.c
@@ -626,8 +626,6 @@ int main( int i_argc, char **ppsz_argv )
PRINT_CAPS( CAN_HIERARCHY_AUTO );
PRINT_CAPS( CAN_MUTE_TS );
-#define DVBAPI_VERSION ((DVB_API_VERSION)*100+(DVB_API_VERSION_MINOR))
-
#if DVBAPI_VERSION >= 301
PRINT_CAPS( CAN_8VSB );
PRINT_CAPS( CAN_16VSB );
@@ -640,6 +638,7 @@ int main( int i_argc, char **ppsz_argv )
#if DVBAPI_VERSION >= 501
PRINT_CAPS( CAN_2G_MODULATION );
#endif
+ PRINT_CAPS( CAN_MULTISTREAM );
#undef PRINT_CAPS
if ( i_print_type == PRINT_TEXT )
More information about the dvblast-devel
mailing list