summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuenter Bartsch <guenter@users.sourceforge.net>2002-12-27 00:53:49 +0000
committerGuenter Bartsch <guenter@users.sourceforge.net>2002-12-27 00:53:49 +0000
commiteadff9a874810b5963dd483a044a481c291a6199 (patch)
tree70d99f5a5cd70e9b4026d37f2958d1067166c8b5
parent4b80217cb872335e6f01de22d58fc0778da265c6 (diff)
downloadxine-lib-eadff9a874810b5963dd483a044a481c291a6199.tar.gz
xine-lib-eadff9a874810b5963dd483a044a481c291a6199.tar.bz2
finally - dvb support in xine :)
CVS patchset: 3687 CVS date: 2002/12/27 00:53:49
-rw-r--r--ChangeLog3
-rw-r--r--configure.ac1
-rw-r--r--doc/Makefile.am2
-rw-r--r--doc/README.dvb86
-rw-r--r--doc/dvb_channels1836
-rw-r--r--src/demuxers/demux_ts.c50
-rw-r--r--src/input/Makefile.am9
-rw-r--r--src/input/input_dvb.c865
-rw-r--r--src/input/ost/Makefile.am22
-rw-r--r--src/input/ost/README9
-rw-r--r--src/input/ost/ca.h84
-rw-r--r--src/input/ost/demux.h346
-rw-r--r--src/input/ost/dmx.h141
-rw-r--r--src/input/ost/frontend.h208
-rw-r--r--src/input/ost/sec.h118
-rw-r--r--src/xine-engine/audio_decoder.c18
-rw-r--r--src/xine-engine/xine.c4
17 files changed, 3786 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index c276be71a..9a9474e9c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
* what a GOOM! post plugin
-
+ * Digital TV (DVB) input plugin (experimental)
+
xine-lib (1-beta1)
* updated libfaad
* improved engine for seeking and slider positioning
diff --git a/configure.ac b/configure.ac
index 632d4573c..b68698879 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1176,6 +1176,7 @@ src/dxr3/Makefile
src/input/Makefile
src/input/libdvdnav/Makefile
src/input/libdvdread/Makefile
+src/input/ost/Makefile
src/input/librtsp/Makefile
src/input/libreal/Makefile
src/liba52/Makefile
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 3b329656f..6b5e3b956 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1,7 +1,7 @@
SUBDIRS = man hackersguide
-EXTRA_DIST = $(docs_DOCS) README README.plugins MRLs dataflow.dia
+EXTRA_DIST = $(docs_DOCS) README README.plugins MRLs dataflow.dia README.dvb dvb_channels
docdir = $(prefix)/share/doc/xine
docs_DOCS =
diff --git a/doc/README.dvb b/doc/README.dvb
new file mode 100644
index 000000000..8412c243e
--- /dev/null
+++ b/doc/README.dvb
@@ -0,0 +1,86 @@
+
+xine Digital TV (DVB)
+=====================
+
+xine can be used to watch digital television.
+
+xine supports Digital TV (Digital Video Broadcasting - DVB) cards
+using the Linux DVB driver from Convergence (so far this has only been
+tested using a Hauppauge WinTV Nova DVB-S card).
+
+driver download and installation
+--------------------------------
+
+Download and install the latest drivers from www.linuxtv.org. You will
+need kernel sources configured for your configuration for a successfull build,
+preferably in /usr/src/linux. Once you have that, unpack the driver sources
+
+# tar xfvz siemens_dvb-0.9.4.tar.gz
+
+and compile the driver
+
+# cd DVB/driver
+# make
+
+if that doesn't fail, do a
+
+# make insmod
+
+to load the generated modules into your running kernel. If everything went
+fine, you should have a line like
+
+dvb: 1 dvb(s) found!
+
+in your dmesg.
+
+
+install a channel list
+----------------------
+
+xine's dvb input plugin needs a channel/transponder list that fits your
+satellite equipment. If you happen to live in central europe and want to
+watch free channels from the astra 1a position you're lucky - you can simply
+copy the dvb_channels file that comes with libxine (doc directory)
+
+$ mkdir ~/.xine
+$ cp doc/dvb_channels ~/.xine
+
+otherwise you'll probably want to write your own channels file. The file
+format is very simple: for each station add three lines:
+
+Program Name
+A BBBBBBBB C DDDDDDDD E FFF GGG
+(empty line)
+
+with
+
+A - diseqc number
+
+B - Frequency
+
+C - LNB voltage (H/V polarisation switch)
+
+D - Symbol Rate
+
+E - FEC
+
+F - vpid (video program id)
+
+G - apid (audio program id)
+
+once you have written a working dvb_channels file for your location/satellite,
+you might want to share it with others on the xine-user mailing list :-)
+
+
+using xine to watch digital television
+--------------------------------------
+
+make sure you have a recent libxine and frontend installed (latest CVS as of
+this writing). then simply start something like
+
+$ gxine dvb://
+
+you should be able to zap around using the NumPad-8 / NumPad-2 keys.
+An OSD menu for channel selection is currently being implemented.
+
+Have fun.
diff --git a/doc/dvb_channels b/doc/dvb_channels
new file mode 100644
index 000000000..940e876d0
--- /dev/null
+++ b/doc/dvb_channels
@@ -0,0 +1,1836 @@
+ARD Das Erste
+0 11837000 4 27500000 2 101 102
+EinsMuXx
+0 12109000 4 27500000 2 301 302
+EinsExtra
+0 12109000 4 27500000 2 101 102
+EinsFestival
+0 12109000 4 27500000 2 201 202
+ZDF
+0 11954000 4 27500000 2 110 120
+ZDFtheaterkanal
+0 11954000 4 27500000 2 1110 1120
+RTL Television
+0 12188000 4 27500000 2 163 104
+SAT.1-CH
+0 12148000 4 27500000 2 255 256
+ProSieben
+0 12483000 2 27502000 2 255 256
+RTL2
+0 12188000 4 27500000 2 166 128
+VOX
+0 12188000 4 27500000 2 167 136
+KABEL1
+0 12483000 2 27502000 2 511 512
+Super RTL
+0 12188000 4 27500000 2 165 120
+NEUN LIVE Television
+0 12483000 2 27502000 2 767 768
+TW1
+0 12692000 4 22000000 3 166 167
+ARTE
+0 10788000 4 22000000 3 167 136
+ZIK / XXL
+0 12266000 4 27500000 2 164 96
+N24
+0 12483000 2 27502000 2 2047 2048
+n-tv
+0 12670000 2 22000000 3 162 96
+CNN Int.
+0 12168000 2 27500000 2 165 100
+EuroNews
+0 11954000 4 27500000 2 2221 2233
+fox news
+2 10983000 2 27500000 2 523 751
+CNBC
+0 11954000 4 27500000 2 510 520
+CNBC Europe
+0 12610000 2 22000000 3 944 945
+Sky News
+0 12552000 2 22000000 3 305 306
+Phoenix
+0 11837000 4 27500000 2 901 902
+XXP
+2 11095000 4 27500000 2 33 44
+DW-TV
+0 10788000 2 22000000 3 305 306
+BR-alpha
+0 11837000 4 27500000 2 701 702
+NBC
+2 11054000 4 27500000 3 550 551
+arte
+0 11837000 4 27500000 2 401 402
+Bloomberg TV Germany
+0 12552000 2 22000000 3 162 99
+Bloomberg English TV
+2 11647000 4 27500000 2 1560 1520
+ZDFdokukanal
+0 11954000 4 27500000 2 660 670
+ZDFinfokanal
+0 11954000 4 27500000 2 610 620
+MTV Central
+0 12699000 2 22000000 3 3031 3032
+VIVA
+0 12670000 2 22000000 3 309 310
+VIVA PLUS
+0 12552000 2 22000000 3 171 172
+3sat
+0 11954000 4 27500000 2 210 220
+SFB1
+0 12109000 4 27500000 2 601 602
+SR Fernsehen Suedwes
+0 11837000 4 27500000 2 501 502
+S&Uuml;DWEST BW
+0 11837000 4 27500000 2 801 802
+WDR FERNSEHEN
+0 11837000 4 27500000 2 601 602
+Bayerisches FS
+0 11837000 4 27500000 2 201 202
+hessen fernsehen
+0 11837000 4 27500000 2 301 302
+MDR FERNSEHEN
+0 12109000 4 27500000 2 401 402
+NDR Fernsehen
+0 12109000 4 27500000 2 2401 2402
+ORB-Fernsehen
+0 12109000 4 27500000 2 501 502
+S&Uuml;DWEST RP
+0 12109000 4 27500000 2 3101 3102
+tv.nrw
+2 11604000 4 27500000 3 111 112
+ONTV Regional
+0 12148000 4 27500000 2 2303 2304
+FASHION-TV
+0 12266000 4 27500000 2 169 116
+Eurosport
+0 11954000 4 27500000 2 410 420
+RTL TELE Letzebuerg
+0 12552000 2 22000000 3 168 144
+Iraq
+2 12654000 4 27500000 2 1960 1920
+Tele5
+0 10832000 4 22000000 3 58 65
+TV POLONIA
+2 10719000 2 27500000 2 163 92
+ALLOCINE INFO
+0 11739000 2 27500000 2 167 108
+Chamber TV
+0 12552000 2 22000000 3 55 56
+LCP
+0 12207000 2 27500000 2 165 100
+TEST
+0 12188000 4 27500000 2 50 51
+FEED
+2 12437000 4 27500000 2 308 256
+RTL2 AUSTRIA
+2 11054000 4 27500000 2 520 521
+ProSieben Schweiz
+0 12051000 2 27500000 2 289 290
+RTL Television
+2 11054000 4 27500000 2 160 80
+RAI 1
+0 10788000 2 22000000 3 289 290
+ESC1 - EGYPTE
+0 10788000 2 22000000 3 163 104
+Canal Algerie
+0 10788000 2 22000000 3 168 138
+Test-R
+0 11837000 4 27500000 2 901 902
+RTM - MAROC
+0 10788000 2 22000000 2 162 96
+RTPI
+0 10788000 2 22000000 2 300 301
+TV 5
+0 10788000 2 22000000 2 164 112
+TV7
+0 10788000 2 22000000 2 166 128
+Polonia 1
+0 10832000 4 22000000 2 54 57
+Tango TV
+0 10832000 4 22000000 2 61 62
+TV Puls
+0 10832000 4 22000000 2 59 60
+FRANCE 5
+0 11608000 2 22000000 2 160 80
+ANDALUC&Iacute;A TV
+0 11686000 2 22000000 2 162 88
+Canal Canarias
+0 11686000 2 22000000 2 160 80
+ETB SAT
+0 11686000 2 22000000 2 163 92
+TM SAT/LA OTRA
+0 11686000 2 22000000 2 164 96
+TVC INT.
+0 11686000 2 22000000 2 161 84
+Kabel 1 Austria
+0 12051000 2 27500000 2 166 167
+Kabel 1 Schweiz
+0 12051000 2 27500000 2 162 163
+ProSieben Austria
+0 12051000 2 27500000 2 161 84
+SAT.1 A
+0 12051000 2 27500000 2 800 801
+FRANCE 5
+0 12207000 2 27500000 2 160 80
+AB SAT / XXL
+0 12266000 4 27500000 2 164 96
+MOTEURS
+0 12266000 4 27500000 2 160 80
+CA TV
+0 12324000 2 27500000 2 165 100
+LE SESAME C+
+0 12324000 2 27500000 2 165 1965
+MOSAIQUE
+0 12324000 2 27500000 2 162 0
+RealityTV
+0 12382000 4 27500000 2 169 110
+K13
+0 12402000 2 27500000 2 163 92
+ANDALUC&Iacute;A TV
+0 12441000 2 27500000 2 162 88
+Canal Canarias
+0 12441000 2 27500000 2 160 80
+ETB SAT
+0 12441000 2 27500000 2 163 92
+FASHION TV
+0 12441000 2 27500000 2 165 100
+TAQUILLA 0
+0 12441000 2 27500000 2 166 104
+TM SAT/LA OTRA
+0 12441000 2 27500000 2 164 96
+TVC INT.
+0 12441000 2 27500000 2 161 84
+DSF
+0 12483000 2 27502000 2 1023 1024
+Sonnenklar TV
+0 12090000 2 27500000 2 1023 1024
+Home Shopping Europe
+0 12483000 2 27502000 2 1279 1280
+RTL Shop
+0 12188000 4 27500000 2 168 137
+QVC GERMANY
+0 12552000 2 22000000 3 165 166
+Travel
+0 12168000 2 27500000 2 163 92
+Promo
+2 12169000 4 27500000 2 521 740
+ASTRA Mosaik
+0 12552000 2 22000000 3 175 176
+ASTRA-Mosaic 2
+0 12552000 2 22000000 3 179 120
+ASTRA-Mosaic 3
+0 12552000 2 22000000 3 182 169
+ASTRA-Mosaic 4
+0 12552000 2 22000000 3 185 170
+ASTRA-Mosaic 5
+0 12552000 2 22000000 3 163 164
+BVN
+0 12574000 4 22000000 2 164 96
+Liberty TV.com
+0 12610000 2 22000000 2 941 943
+LibertyTV.com
+0 12610000 2 22000000 2 941 942
+Motors TV
+0 12610000 2 22000000 2 191 192
+RTBF SAT
+0 12610000 2 22000000 2 48 49
+TV5 Europe
+0 12610000 2 22000000 2 45 46
+Wishline
+0 12610000 2 22000000 2 214 215
+No-ZAP TV
+0 12640000 4 22000000 2 160 80
+TV-NIEP II
+0 12670000 2 22000000 2 77 78
+BL-SPIEL 1
+0 11719000 4 27500000 2 255 256
+BL-SPIEL 2
+0 11719000 4 27500000 2 2047 2048
+BL-SPIEL 3
+0 11719000 4 27500000 2 2303 2304
+BL-SPIEL 4
+0 11719000 4 27500000 2 2559 2560
+BL-SPIEL 5
+0 11719000 4 27500000 2 2815 2816
+BL-SPIEL 6
+0 11719000 4 27500000 2 3071 3072
+F1 Box
+0 11719000 4 27500000 2 2559 2560
+F1 Cockpit
+0 11719000 4 27500000 2 2303 2304
+F1 Info
+0 11719000 4 27500000 2 3071 3072
+F1 Portal
+0 11719000 4 27500000 2 255 256
+F1 Super
+0 11719000 4 27500000 2 2047 2048
+F1 Verfolger
+0 11719000 4 27500000 2 2815 2816
+PREM EROTIK 2
+0 11719000 4 27500000 2 1535 1536
+PREM EROTIK 3
+0 11719000 4 27500000 2 1791 1792
+PREM EROTIK 4
+0 11719000 4 27500000 2 3583 3584
+PREMIERE DIREKT 1
+0 11719000 4 27500000 2 1023 1024
+PREMIERE DIREKT 2
+0 11719000 4 27500000 2 767 768
+PREMIERE DIREKT 3
+0 11719000 4 27500000 2 511 512
+PREMIERE DIREKT 3
+0 11719000 4 27500000 2 1279 1280
+PREMIERE SPORT 1
+0 11719000 4 27500000 2 255 256
+CINE CINEMA 16/9
+0 11739000 2 27500000 2 160 80
+CLUB TELEACHAT
+0 11739000 2 27500000 2 162 88
+GOURMET TV
+0 11739000 2 27500000 2 170 120
+KTO
+0 11739000 2 27500000 2 163 92
+MATCH TV
+0 11739000 2 27500000 2 165 100
+MCM
+0 11739000 2 27500000 2 161 84
+MCM 2
+0 11739000 2 27500000 2 164 96
+MCM AFRICA
+0 11739000 2 27500000 2 166 104
+NAT GEOGRAPHIC
+0 11739000 2 27500000 2 169 116
+TiJi
+0 11739000 2 27500000 2 168 112
+13 TH STREET
+0 11758000 4 27500000 2 2303 2304
+BEATE-UHSE.TV
+0 11758000 4 27500000 2 1023 1024
+CLASSICA
+0 11758000 4 27500000 2 767 768
+FOX KIDS
+0 11758000 4 27500000 2 1279 1280
+GOLDSTAR TV
+0 11758000 4 27500000 2 3839 3840
+HEIMATKANAL
+0 11758000 4 27500000 2 1535 1536
+JUNIOR
+0 11758000 4 27500000 2 255 256
+K-TOON
+0 11758000 4 27500000 2 511 512
+CANAL J
+0 11778000 2 27500000 2 167 108
+CUISINE.TV
+0 11778000 2 27500000 2 165 100
+EUROSPORT
+0 11778000 2 27500000 2 160 80
+LCI
+0 11778000 2 27500000 2 166 104
+PARIS PREMIERE
+0 11778000 2 27500000 2 163 92
+PLANETE
+0 11778000 2 27500000 2 162 88
+SANTE - VIE PLUS
+0 11778000 2 27500000 2 168 112
+SANTE-VIE
+0 11778000 2 27500000 2 168 112
+TMC
+0 11778000 2 27500000 2 161 84
+VOYAGE
+0 11778000 2 27500000 2 164 96
+PREMIERE 1
+0 11797000 4 27500000 2 511 512
+PREMIERE 2
+0 11797000 4 27500000 2 1791 1792
+PREMIERE 3
+0 11797000 4 27500000 2 2303 2304
+PREMIERE 4
+0 11797000 4 27500000 2 767 768
+PREMIERE 5
+0 11797000 4 27500000 2 1279 1280
+PREMIERE 6
+0 11797000 4 27500000 2 1535 1536
+PREMIERE 7
+0 11797000 4 27500000 2 1023 1024
+PREMIERE START
+0 11797000 4 27500000 2 255 256
+BLOOMBERG TV
+0 11817000 2 27500000 2 163 92
+CANAL JIMMY
+0 11817000 2 27500000 2 165 100
+CINECINEMAS 2
+0 11817000 2 27500000 2 161 84
+CINECINEMAS 3
+0 11817000 2 27500000 2 162 88
+i TELEVISION
+0 11817000 2 27500000 2 169 116
+LA CHAINE METEO
+0 11817000 2 27500000 2 167 108
+MEZZO
+0 11817000 2 27500000 2 166 104
+MEZZO[esp]
+0 11817000 2 27500000 2 166 104
+PATHE SPORT:
+0 11817000 2 27500000 2 168 112
+SEASONS
+0 11817000 2 27500000 2 160 80
+CANAL+
+0 11856000 2 27500000 2 160 80
+CANAL+ 16/9
+0 11856000 2 27500000 2 163 92
+CANAL+ BLEU
+0 11856000 2 27500000 2 161 84
+CANAL+ JAUNE
+0 11856000 2 27500000 2 162 88
+CANAL+ VERT
+0 11856000 2 27500000 2 167 108
+CINE CLASSICS
+0 11856000 2 27500000 2 2047 0
+CINECINEMAS 1
+0 11856000 2 27500000 2 165 100
+DISNEY CHANNEL
+0 11856000 2 27500000 2 166 104
+EQUIDIA
+0 11856000 2 27500000 2 168 112
+PMU sur Canal+
+0 11856000 2 27500000 2 160 80
+40 LATINO
+0 11934000 2 27500000 2 160 80
+CANAL+ ...30
+0 11934000 2 27500000 2 167 108
+CINECLASSICS
+0 11934000 2 27500000 2 162 88
+CNN+
+0 11934000 2 27500000 2 172 128
+EUROSPORTNEWS
+0 11934000 2 27500000 2 173 132
+FOX NEWS
+0 11934000 2 27500000 2 168 112
+M&Eacute;TEO
+0 11934000 2 27500000 2 169 116
+Nat Geographic
+0 11934000 2 27500000 2 170 120
+REAL MADRID TV
+0 11934000 2 27500000 2 171 124
+40 LATINO
+0 11941000 2 27500000 2 160 80
+CANAL+ ...30
+0 11941000 2 27500000 2 167 108
+CINECLASSICS
+0 11941000 2 27500000 2 162 88
+40 TV
+0 11973000 2 27500000 2 165 100
+CANAL+
+0 11973000 2 27500000 2 160 80
+CANAL+ AZUL
+0 11973000 2 27500000 2 161 84
+CANAL+ ROJO
+0 11973000 2 27500000 2 162 88
+DISCOVERY
+0 11973000 2 27500000 2 166 104
+DISNEY CHANNEL
+0 11973000 2 27500000 2 163 92
+SPORTMAN&Iacute;A
+0 11973000 2 27500000 2 164 96
+SPORTMAN&Iacute;A
+0 11973000 2 27500000 2 164 96
+ATV
+0 11992000 4 27500000 2 163 90
+Avante
+0 11992000 4 27500000 2 162 88
+Discovery Cze
+0 11992000 4 27500000 2 170 112
+Eurosport
+0 11992000 4 27500000 2 160 80
+ExtremeSports
+0 11992000 4 27500000 2 165 98
+Hallmark Cze
+0 11992000 4 27500000 2 702 703
+M2
+0 11992000 4 27500000 2 164 96
+MTV Europe
+0 11992000 4 27500000 2 168 108
+Private Gold
+0 11992000 4 27500000 2 167 106
+SpektrumInt.
+0 11992000 4 27500000 2 169 110
+TV3
+0 11992000 4 27500000 2 166 104
+CANAL EVENEMENT
+0 12012000 2 27500000 2 162 88
+ESPN CLASSIC
+0 12012000 2 27500000 2 169 116
+FRANCE 2
+0 12012000 2 27500000 2 160 80
+FRANCE 3
+0 12012000 2 27500000 2 161 84
+MCM AFRICA
+0 12012000 2 27500000 2 166 104
+TELE MELODY
+0 12012000 2 27500000 2 167 108
+[18]
+0 12012000 2 27500000 2 2047 0
+DISCOVERY CHANNEL
+0 12031000 4 27500000 2 1791 1792
+KRIMI &amp;CO
+0 12031000 4 27500000 2 1535 1536
+PREMIERE DIREKT 1
+0 12031000 4 27500000 2 511 512
+PREMIERE DIREKT 2
+0 12031000 4 27500000 2 255 256
+PREMIERE DIREKT 4
+0 12031000 4 27500000 2 2815 2816
+PREMIERE EROTIK
+0 12031000 4 27500000 2 1279 1280
+PREMIERE NOSTALGIE
+0 12031000 4 27500000 2 2559 2560
+PREMIERE SERIE
+0 12031000 4 27500000 2 1023 1024
+PREMIERE SPORT 2
+0 12031000 4 27500000 2 3839 3840
+BL-KONFERENZ
+0 12070000 4 27500000 2 255 256
+BL-SPIEL 7
+0 12070000 4 27500000 2 3071 3072
+BL-SPIEL 8
+0 12070000 4 27500000 2 3071 3072
+BL-SPIEL 9
+0 12070000 4 27500000 2 3071 3072
+DISNEY CHANNEL
+0 12090000 2 27500000 2 767 768
+PLANET
+0 12090000 2 27500000 2 1279 1280
+STUDIO UNIVERSAL
+0 12090000 2 27500000 2 255 256
+K1
+0 12129000 2 27500000 2 160 80
+K10
+0 12129000 2 27500000 2 169 116
+K11
+0 12129000 2 27500000 2 166 104
+K12
+0 12129000 2 27500000 2 167 108
+K2
+0 12129000 2 27500000 2 161 84
+K3
+0 12129000 2 27500000 2 162 88
+K4
+0 12129000 2 27500000 2 163 92
+K5
+0 12129000 2 27500000 2 164 96
+K6
+0 12129000 2 27500000 2 165 100
+K7
+0 12129000 2 27500000 2 166 104
+K8
+0 12129000 2 27500000 2 167 108
+K9
+0 12129000 2 27500000 2 168 112
+BD 1
+0 12148000 4 27500000 2 1791 1792
+BD 3/PARTNER TV
+0 12148000 4 27500000 2 511 512
+BD 4
+0 12148000 4 27500000 2 2047 2048
+BD_DVB
+0 12148000 4 27500000 2 1023 1024
+BetaBC
+0 12148000 4 27500000 2 1535 1536
+Bloomberg
+0 12168000 2 27500000 2 167 112
+TCM
+0 12168000 2 27500000 2 169 64
+TCM.
+0 12168000 2 27500000 2 164 96
+TVBS
+0 12168000 2 27500000 2 162 88
+CANALPRO TV
+0 12207000 2 27500000 2 170 120
+EURONEWS
+0 12207000 2 27500000 2 164 96
+PLANETE 2
+0 12207000 2 27500000 2 166 104
+TV BREIZH
+0 12207000 2 27500000 2 161 84
+ESTILO
+0 12246000 2 27500000 2 165 100
+EUROSPORT
+0 12246000 2 27500000 2 164 96
+NICK-PARAMOUNT
+0 12246000 2 27500000 2 167 108
+SEASONS
+0 12246000 2 27500000 2 170 120
+TAQUILLA 11
+0 12246000 2 27500000 2 169 116
+TAQUILLA 6
+0 12246000 2 27500000 2 161 84
+TAQUILLA 7
+0 12246000 2 27500000 2 162 88
+TAQUILLA 8
+0 12246000 2 27500000 2 163 92
+TAQUILLA 9
+0 12246000 2 27500000 2 171 124
+VIAJAR
+0 12246000 2 27500000 2 166 104
+AB 1
+0 12266000 4 27500000 2 161 84
+ACTION
+0 12266000 4 27500000 2 170 120
+ANIMAUX
+0 12266000 4 27500000 2 162 88
+ENCYCLOPEDIA
+0 12266000 4 27500000 2 163 92
+ESCALES
+0 12266000 4 27500000 2 165 100
+FIT/CHAINE HISTOIRE
+0 12266000 4 27500000 2 166 104
+MANGA
+0 12266000 4 27500000 2 171 124
+RFM-TV
+0 12266000 4 27500000 2 168 112
+CNBC-NBC
+0 12287000 2 27500000 2 162 88
+DISNEY CH. +1
+0 12287000 2 27500000 2 171 124
+DOCUMAN&Iacute;A
+0 12287000 2 27500000 2 160 80
+FOX KIDS
+0 12287000 2 27500000 2 161 84
+Playhouse Disney
+0 12287000 2 27500000 2 172 128
+TAQUILLA 1
+0 12287000 2 27500000 2 166 104
+TAQUILLA 14
+0 12287000 2 27500000 2 176 144
+TAQUILLA 2
+0 12287000 2 27500000 2 167 108
+TAQUILLA X
+0 12287000 2 27500000 2 170 120
+TOON DISNEY
+0 12287000 2 27500000 2 173 132
+Animal Planet
+0 12304000 4 27500000 2 702 703
+Animal Planet Cze
+0 12304000 4 27500000 2 706 707
+Duna TV
+0 12304000 4 27500000 2 168 108
+Eurosport News
+0 12304000 4 27500000 2 167 106
+FoxKids
+0 12304000 4 27500000 2 163 90
+Hallmark
+0 12304000 4 27500000 2 161 84
+HBO Cze
+0 12304000 4 27500000 2 164 96
+MTV Classic
+0 12304000 4 27500000 2 165 98
+MTV Polska
+0 12304000 4 27500000 2 166 104
+Sport 1 Hun
+0 12304000 4 27500000 2 169 110
+TCM Cartoon
+0 12304000 4 27500000 2 162 88
+Viasat 3
+0 12304000 4 27500000 2 160 80
+CANAL CLUB
+0 12324000 2 27500000 2 160 80
+Animal Planet
+0 12344000 4 27500000 2 164 96
+Discovery
+0 12344000 4 27500000 2 162 88
+NGC
+0 12344000 4 27500000 2 161 84
+RTL4
+0 12344000 4 27500000 2 160 80
+RTL5
+0 12344000 4 27500000 2 163 92
+Club
+0 12382000 4 27500000 2 162 88
+Discovery
+0 12382000 4 27500000 2 163 90
+Filmm&Acirc;uzeum
+0 12382000 4 27500000 2 165 98
+Fox Kids CE
+0 12382000 4 27500000 2 166 104
+HBO Hun
+0 12382000 4 27500000 2 161 82
+National Geographic
+0 12382000 4 27500000 2 164 96
+TA3
+0 12382000 4 27500000 2 167 106
+TCM Cartoon CE
+0 12382000 4 27500000 2 170 114
+13EME RUE
+0 12402000 2 27500000 2 162 88
+CINECLASSICS
+0 12402000 2 27500000 2 168 112
+COMEDIE !
+0 12402000 2 27500000 2 161 84
+CSAT
+0 12402000 2 27500000 2 169 116
+DEMAIN !
+0 12402000 2 27500000 2 160 80
+FOX KIDS
+0 12402000 2 27500000 2 164 96
+GAME ONE
+0 12402000 2 27500000 2 167 108
+KIOSQUE
+0 12402000 2 27500000 2 163 92
+L'EQUIPE TV
+0 12402000 2 27500000 2 165 100
+PLANETE FUTURE
+0 12402000 2 27500000 2 166 104
+RFO SAT
+0 12402000 2 27500000 2 164 96
+C+ Blauw
+0 12515000 4 22000000 2 161 84
+C+ Rood
+0 12515000 4 22000000 2 160 80
+C+16/9
+0 12515000 4 22000000 2 166 104
+NED1
+0 12515000 4 22000000 2 162 88
+NED2
+0 12515000 4 22000000 2 163 92
+NED3
+0 12515000 4 22000000 2 164 96
+The Studio
+0 12515000 4 22000000 2 167 108
+X-ZONE
+0 12515000 4 22000000 2 165 87
+AXN
+0 12522000 2 22000000 2 166 104
+CINEMAN&Iacute;A
+0 12522000 2 22000000 2 160 80
+CINEMAN&Iacute;A AZUL
+0 12522000 2 22000000 2 161 84
+FOX
+0 12522000 2 22000000 2 167 108
+TAQUILLA 3
+0 12522000 2 22000000 2 162 88
+TAQUILLA 4
+0 12522000 2 22000000 2 163 92
+TAQUILLA 5
+0 12522000 2 22000000 2 164 96
+Kindernet/Veronica
+0 12574000 4 22000000 2 166 104
+NET5
+0 12574000 4 22000000 2 165 100
+SBS6
+0 12574000 4 22000000 2 160 80
+TMF
+0 12574000 4 22000000 2 162 88
+V8/Fox Kids
+0 12574000 4 22000000 2 163 92
+Yorin
+0 12574000 4 22000000 2 161 84
+CINEMAN&Iacute;A ROJO
+0 12581000 2 22000000 2 165 100
+TAQUILLA 12
+0 12581000 2 22000000 2 168 112
+TAQUILLA 12
+0 12581000 2 22000000 2 172 128
+TAQUILLA X
+0 12581000 2 22000000 2 163 92
+TAQUILLA XX
+0 12581000 2 22000000 2 161 84
+TAQUILLA XY
+0 12581000 2 22000000 2 162 88
+ORF 1
+0 12692000 4 22000000 2 160 161
+ORF 2
+0 12692000 4 22000000 2 500 501
+ORF 2 B
+0 12692000 4 22000000 2 500 501
+ORF 2 K
+0 12692000 4 22000000 2 500 501
+ORF 2 N
+0 12692000 4 22000000 2 500 501
+ORF 2 O
+0 12692000 4 22000000 2 500 501
+ORF 2 S
+0 12692000 4 22000000 2 500 501
+ORF 2 St
+0 12692000 4 22000000 2 500 501
+ORF 2 T
+0 12692000 4 22000000 2 500 501
+ORF 2 V
+0 12692000 4 22000000 2 500 501
+ORF 2 W
+0 12692000 4 22000000 2 500 501
+MTV 2
+0 12699000 2 22000000 2 3091 3092
+MTV 2.
+0 12699000 2 22000000 2 3091 3092
+MTV Base
+0 12699000 2 22000000 2 3051 3052
+MTV Base.
+0 12699000 2 22000000 2 3051 3052
+MTV ESP
+0 12699000 2 22000000 2 3011 3012
+MTV F
+0 12699000 2 22000000 2 3021 3022
+MTV HITS
+0 12699000 2 22000000 2 3041 3042
+MTV HITS.
+0 12699000 2 22000000 2 3041 3042
+MTV2 Pop Channel
+0 12699000 2 22000000 2 3081 3082
+VH1
+0 12699000 2 22000000 2 3061 3062
+VH1 Classic
+0 12699000 2 22000000 2 3071 3072
+10.722 H
+2 10734000 4 29900000 2 1005 1205
+Cinenova
+2 10734000 4 29900000 2 1003 1203
+Cinenova 2
+2 10734000 4 29900000 2 1002 1202
+Deepam TV
+2 10734000 4 29900000 2 1006 1206
+EWTN
+2 10734000 4 29900000 2 1001 1201
+MTA INTL
+2 10734000 4 29900000 2 1004 1204
+BOULH
+2 10949000 2 27500000 2 7488 7489
+HSE Italia
+2 10983000 2 27500000 2 522 750
+s.verde
+2 10983000 2 27500000 2 2689 2690
+CNN
+2 11054000 4 27500000 2 540 542
+RTL A
+2 11054000 4 27500000 2 580 584
+VOX CH
+2 11054000 4 27500000 2 500 501
+ZDF
+2 11054000 4 27500000 2 570 571
+Kurdsat
+2 11095000 4 27500000 2 38 41
+New Live Channel CNL
+2 11095000 4 27500000 2 51 52
+NOELLO SAT
+2 11095000 4 27500000 2 4194 4195
+professional TV
+2 11095000 4 27500000 2 32 47
+Sailing Channel
+2 11095000 4 27500000 2 37 34
+Spice Platinum
+2 11095000 4 27500000 2 2901 2911
+TVN
+2 11178000 4 22000000 2 512 650
+DW-tv
+2 11196000 2 9100000 2 101 102
+Testcard
+2 11205000 4 4000000 2 4130 4131
+Techniczny 2
+2 11406000 2 27500000 2 515 680
+TVN
+2 11406000 2 27500000 2 512 650
+TVN 24
+2 11406000 2 27500000 2 513 660
+TVN 7
+2 11406000 2 27500000 2 514 670
+RAI INTERNATIONAL
+2 11464000 2 4400000 2 512 650
+ARD &quot;Das Erste&quot;
+2 11604000 4 27500000 2 172 173
+DeeJay TV
+2 11604000 4 27500000 2 160 161
+DW-TV
+2 11604000 4 27500000 2 1000 1001
+K-TV
+2 11604000 4 27500000 2 711 712
+RTL 2 CH
+2 11604000 4 27500000 2 175 176
+Super RTL A
+2 11604000 4 27500000 2 180 181
+VIVA polska
+2 11604000 4 27500000 2 190 191
+102.5 HIT Ch
+2 11623000 2 27500000 2 224 244
+123SAT/69XTV
+2 11623000 2 27500000 2 230 250
+Cartoon Network
+2 11623000 2 27500000 2 3401 3411
+Channel SUN
+2 11623000 2 27500000 2 229 249
+KHALIFA TV
+2 11623000 2 27500000 2 228 248
+PRO SAT
+2 11623000 2 27500000 2 226 246
+TLC SAT
+2 11623000 2 27500000 2 225 245
+TV ROMANIA
+2 11623000 2 27500000 2 227 247
+Ultra Blue TV
+2 11623000 2 27500000 2 223 243
+Bloomberg European T
+2 11647000 4 27500000 2 1360 1320
+Bloomberg French TV
+2 11647000 4 27500000 2 1160 1120
+Bloomberg German TV
+2 11647000 4 27500000 2 1460 1420
+Bloomberg Italian TV
+2 11647000 4 27500000 2 1260 1220
+Tel Sell Homeshoppin
+2 11647000 4 27500000 2 1760 1720
+Test
+2 11647000 4 27500000 2 1660 1620
+EDTV 1
+2 11747000 4 27500000 2 4130 4131
+EDTV BUSINESS
+2 11747000 4 27500000 2 4642 4643
+EDTV DRAMA
+2 11747000 4 27500000 2 4898 4899
+EDTV SPORT
+2 11747000 4 27500000 2 4386 4387
+TEST
+2 11747000 4 27500000 2 7970 7971
+Canale Lavoro
+2 11766000 2 27500000 2 516 654
+RAI1
+2 11766000 2 27500000 2 160 80
+RAI2
+2 11766000 2 27500000 2 161 84
+RAI3
+2 11766000 2 27500000 2 162 88
+RAILAB
+2 11766000 2 27500000 2 517 655
+RaiMed
+2 11766000 2 27500000 2 515 653
+RAIMOSAICO
+2 11766000 2 27500000 2 164 96
+SENATO ITALIANO
+2 11766000 2 27500000 2 163 92
+CANAL 24 HORAS
+2 11789000 4 27500000 2 3569 3570
+CANAL CLASICO
+2 11789000 4 27500000 2 3529 3530
+HISPAVISION
+2 11789000 4 27500000 2 3545 3546
+LIBRE - CARTA
+2 11789000 4 27500000 2 3577 3578
+NOSTALGIA
+2 11789000 4 27500000 2 3561 3562
+TELEDEPORTE
+2 11789000 4 27500000 2 3537 3538
+TVE ASIA-AFRICA
+2 11789000 4 27500000 2 3553 3554
+TVE INTERNACIONAL
+2 11789000 4 27500000 2 3521 3522
+CAMERA DEPUTATI
+2 11804000 2 27500000 2 517 655
+RAIeducational
+2 11804000 2 27500000 2 514 652
+RAINettunoSAT1
+2 11804000 2 27500000 2 519 657
+RAINettunoSAT2
+2 11804000 2 27500000 2 513 651
+RAINews24
+2 11804000 2 27500000 2 516 654
+RAISPORTSAT
+2 11804000 2 27500000 2 512 650
+SAT2000
+2 11804000 2 27500000 2 518 656
+TELEPACE
+2 11804000 2 27500000 2 515 653
+Stream1
+2 11843000 2 27500000 2 512 650
+snai
+2 11881000 2 27500000 2 2561 2562
+stream news
+2 11881000 2 27500000 2 2305 2306
+C5
+2 11919000 2 27500000 2 513 660
+I1
+2 11919000 2 27500000 2 512 650
+R4
+2 11919000 2 27500000 2 514 670
+IQRA
+2 12015000 4 27500000 2 520 730
+LBC EUROPE
+2 12015000 4 27500000 2 517 700
+MA3
+2 12015000 4 27500000 2 522 750
+C. Milagro
+2 12092000 4 27500000 2 4368 4369
+Fiesta
+2 12092000 4 27500000 2 4432 4433
+Italiasat
+2 12092000 4 27500000 2 4520 4521
+LiveSex
+2 12092000 4 27500000 2 4660 4661
+Maharaji
+2 12092000 4 27500000 2 4416 4417
+Sex-View
+2 12092000 4 27500000 2 4630 4631
+Telesierra
+2 12092000 4 27500000 2 4160 4161
+Tizianasat
+2 12092000 4 27500000 2 4600 4601
+UBN
+2 12092000 4 27500000 2 3260 3220
+AL JAZEERA
+2 12111000 2 27500000 2 270 271
+Alice
+2 12111000 2 27500000 2 351 352
+ARM 1
+2 12111000 2 27500000 2 240 241
+Coming Soon TV
+2 12111000 2 27500000 2 310 311
+HB CHANNEL
+2 12111000 2 27500000 2 200 201
+Leonardo
+2 12111000 2 27500000 2 355 356
+Nuvolari
+2 12111000 2 27500000 2 358 359
+TV MODA
+2 12111000 2 27500000 2 220 221
+AH-EDP1
+2 12149000 2 27500000 2 96 900
+Alice
+2 12149000 2 27500000 2 160 161
+GAY.TV
+2 12149000 2 27500000 2 36 37
+Leonardo
+2 12149000 2 27500000 2 128 130
+Nuvolari
+2 12149000 2 27500000 2 176 177
+TV7 Tunis
+2 12149000 2 27500000 2 112 113
+AUGUST
+2 12188000 2 27500000 2 3713 3714
+BALKANIA TV
+2 12188000 2 27500000 2 3969 3970
+ERT SAT
+2 12188000 2 27500000 2 514 652
+EXTRA
+2 12188000 2 27500000 2 516 654
+OTE PROMO
+2 12188000 2 27500000 2 517 655
+RTS SAT
+2 12188000 2 27500000 2 519 657
+TRIAL
+2 12188000 2 27500000 2 513 651
+TV MAGIC
+2 12188000 2 27500000 2 3584 3585
+Acasa TV
+2 12197000 4 12128000 2 1260 1220
+PRO TV
+2 12197000 4 12128000 2 1160 1120
+PRO TV
+2 12197000 4 12128000 2 1160 1120
+ProTv Intl ENG
+2 12197000 4 12128000 2 1360 1322
+ARIRANG TV
+2 12220000 4 6161000 2 33 34
+BK TV
+2 12220000 4 6161000 2 3105 3106
+Ch-3 Arabic IBA TV
+2 12220000 4 6161000 2 1057 1058
+DCTV-german
+2 12235000 2 13400000 2 1160 1123
+DCTV-german
+2 12235000 2 13400000 2 1160 1123
+AJARA TV
+2 12245000 4 27500000 2 127 137
+CFI PECO PRO
+2 12245000 4 27500000 2 121 131
+FASHION
+2 12245000 4 27500000 2 123 133
+XXP
+2 12265000 2 27500000 2 1660 1620
+BVN-TV
+2 12303000 2 27500000 2 209 210
+COUNTDOWN
+2 12303000 2 27500000 2 235 236
+KURDISTAN TV
+2 12303000 2 27500000 2 225 226
+MAGIC
+2 12303000 2 27500000 2 245 246
+NAPOLI INT.
+2 12303000 2 27500000 2 240 241
+RTB INTERNATIONAL
+2 12303000 2 27500000 2 198 199
+SLO-TV1
+2 12303000 2 27500000 2 200 201
+TBNE
+2 12303000 2 27500000 2 230 231
+TELSELL
+2 12303000 2 27500000 2 205 206
+Abu Dhabi TV
+2 12380000 2 27500000 2 3024 3034
+Bangla TV
+2 12380000 2 27500000 2 3301 3311
+EQUIDIA PRO
+2 12380000 2 27500000 2 3321 3331
+EQUIDIA PRO P1
+2 12380000 2 27500000 2 321 0
+EQUIDIA PRO P2
+2 12380000 2 27500000 2 322 0
+RTV MONTENEGRO
+2 12380000 2 27500000 2 3026 3036
+SAT 7
+2 12380000 2 27500000 2 3001 3011
+SERTE TEST 2
+2 12380000 2 27500000 2 3025 3035
+SYRIAN TV
+2 12380000 2 27500000 2 3022 3032
+SRG SSR SAT Access
+2 12399000 4 27500000 2 165 98
+AL-ALAM
+2 12437000 4 27500000 2 165 90
+IRIB1 ENG
+2 12437000 4 27500000 2 160 81
+IRIB1 PER
+2 12437000 4 27500000 2 160 80
+IRIB2 ENG
+2 12437000 4 27500000 2 161 83
+IRIB2 PER
+2 12437000 4 27500000 2 161 82
+IRINN
+2 12437000 4 27500000 2 164 88
+SAHAR1
+2 12437000 4 27500000 2 162 84
+SAHAR2
+2 12437000 4 27500000 2 163 86
+2M Maroc
+2 12476000 4 27500000 2 601 602
+ARY DIGITAL
+2 12476000 4 27500000 2 650 651
+B4U Movies
+2 12476000 4 27500000 2 656 657
+EbS
+2 12476000 4 27500000 2 101 201
+LibertyTV.com
+2 12476000 4 27500000 2 941 942
+MOU.2
+2 12476000 4 27500000 2 42 43
+PINK PLUS
+2 12476000 4 27500000 2 308 256
+Zee Cinema
+2 12476000 4 27500000 2 915 916
+Zee TV
+2 12476000 4 27500000 2 910 911
+CALABRIASAT
+2 12520000 2 27500000 2 52 53
+HRT-TV1
+2 12520000 2 27500000 2 100 101
+LIGURIA SAT
+2 12520000 2 27500000 2 407 408
+NILE TV
+2 12520000 2 27500000 2 56 57
+SARDEGNA UNO
+2 12520000 2 27500000 2 503 504
+SET
+2 12520000 2 27500000 2 501 502
+TELESPAZIO TEST
+2 12520000 2 27500000 2 98 99
+VIDEOLINA
+2 12520000 2 27500000 2 515 516
+Bulgaria TV
+2 12540000 4 27500000 2 4612 4613
+MEDIOLANUM
+2 12540000 4 27500000 2 1131 1132
+sisal
+2 12540000 4 27500000 2 4356 4357
+24ore.tv
+2 12558000 2 27500000 2 6916 6917
+CNES-Toulouse
+2 12558000 2 27500000 2 6143 6142
+ESP Dutch
+2 12558000 2 27500000 2 2577 2564
+ESP News Eng
+2 12558000 2 27500000 2 2825 2823
+Q-CHANNEL
+2 12558000 2 27500000 2 1037 1039
+ANN
+2 12597000 2 27500000 2 161 84
+BBC World
+2 12597000 2 27500000 2 163 92
+CNNI
+2 12597000 2 27500000 2 168 112
+EuroNews
+2 12597000 2 27500000 2 2221 2233
+JSTV 1
+2 12597000 2 27500000 2 2000 2001
+JSTV 2
+2 12597000 2 27500000 2 2011 2012
+MBC
+2 12597000 2 27500000 2 160 80
+Al manar
+2 12654000 4 27500000 2 1060 1020
+ESC
+2 12654000 4 27500000 2 1860 1820
+Kuwait
+2 12654000 4 27500000 2 1460 1420
+Libya
+2 12654000 4 27500000 2 1560 1520
+Oman
+2 12654000 4 27500000 2 1760 1720
+Qatar
+2 12654000 4 27500000 2 1260 1220
+Saudi 1
+2 12654000 4 27500000 2 1360 1320
+Sharjah
+2 12654000 4 27500000 2 1160 1120
+Sudan
+2 12654000 4 27500000 2 1660 1620
+3ABN
+2 12673000 2 27500000 2 210 211
+GAME NETWORK
+2 12673000 2 27500000 2 291 292
+Jordan Tv
+2 12673000 2 27500000 2 310 311
+Studio Europa
+2 12673000 2 27500000 2 230 231
+Telemarket
+2 12673000 2 27500000 2 350 351
+TEST
+2 12673000 2 27500000 2 360 361
+Thai TV5
+2 12673000 2 27500000 2 200 201
+Video Italia
+2 12673000 2 27500000 2 340 341
+ABsat PROMO
+2 12692000 4 27500000 2 169 116
+ONYX
+2 12692000 4 27500000 2 161 84
+PASSIONS
+2 12692000 4 27500000 2 160 80
+DISCOVERY
+2 10719000 2 27500000 2 161 84
+PLANETE
+2 10719000 2 27500000 2 165 100
+RTL7
+2 10719000 2 27500000 2 162 88
+SEASONS
+2 10719000 2 27500000 2 166 104
+TVN
+2 10719000 2 27500000 2 160 80
+VIVA Polska
+2 10719000 2 27500000 2 167 108
+Cin&eacute;star 1
+2 10757000 2 27500000 2 120 130
+Cin&eacute;star 2
+2 10757000 2 27500000 2 220 230
+Cin&eacute;toile
+2 10757000 2 27500000 2 320 330
+Club T&eacute;l&eacute;achat
+2 10757000 2 27500000 2 920 930
+FUN TV
+2 10757000 2 27500000 2 620 630
+Shopping Avenue
+2 10757000 2 27500000 2 420 430
+S&eacute;rie Club
+2 10757000 2 27500000 2 520 530
+Teva
+2 10757000 2 27500000 2 720 730
+Festival
+2 10796000 2 27500000 2 420 430
+Histoire
+2 10796000 2 27500000 2 520 530
+Infosport
+2 10796000 2 27500000 2 120 130
+Loft Story
+2 10796000 2 27500000 2 320 330
+Odyss&eacute;e
+2 10796000 2 27500000 2 720 730
+R&eacute;gions
+2 10796000 2 27500000 2 220 230
+TFJ
+2 10796000 2 27500000 2 1020 1030
+TV5
+2 10796000 2 27500000 2 920 930
+T&eacute;l&eacute;toon
+2 10796000 2 27500000 2 620 630
+CREDIT AGRICOLE
+2 10834000 2 27500000 2 5321 5333
+EUROSPORT
+2 10834000 2 27500000 2 220 230
+FRANCE 2
+2 10834000 2 27500000 2 320 330
+FRANCE 3
+2 10834000 2 27500000 2 520 530
+I TELEVISION
+2 10834000 2 27500000 2 820 830
+LCI
+2 10834000 2 27500000 2 120 130
+TPS star
+2 10834000 2 27500000 2 420 430
+ALLO CINE INFO
+2 10873000 2 27500000 2 520 530
+BBC PRIME
+2 10873000 2 27500000 2 620 630
+EQUIDIA
+2 10873000 2 27500000 2 320 330
+ESPN CLASSIC SPORT
+2 10873000 2 27500000 2 420 430
+LA CHAINE PARLEMENTA
+2 10873000 2 27500000 2 1020 1030
+RTM
+2 10873000 2 27500000 2 120 130
+SIC
+2 10873000 2 27500000 2 220 230
+TV BREIZH
+2 10873000 2 27500000 2 720 730
+ALE KINO!
+2 10892000 4 27500000 2 164 96
+AVANTE
+2 10892000 4 27500000 2 169 114
+CANAL+
+2 10892000 4 27500000 2 160 80
+CANAL+ NIEBIESKI
+2 10892000 4 27500000 2 168 112
+CANAL+ ZOLTY
+2 10892000 4 27500000 2 161 85
+FOX KIDS
+2 10892000 4 27500000 2 162 88
+MINIMAX
+2 10892000 4 27500000 2 165 100
+TMT
+2 10892000 4 27500000 2 163 92
+TVP 1
+2 10892000 4 27500000 2 166 104
+TVP 2
+2 10892000 4 27500000 2 167 108
+Cin&eacute;faz
+2 10911000 2 27500000 2 220 230
+Multivision
+2 10911000 2 27500000 2 320 330
+TF6
+2 10911000 2 27500000 2 720 730
+TPS star
+2 10911000 2 27500000 2 120 130
+AnimalPlanet
+2 10930000 4 27500000 2 517 700
+Appl. Ch
+2 10930000 4 27500000 2 516 690
+Big Bro
+2 10930000 4 27500000 2 512 650
+Big Bro
+2 10930000 4 27500000 2 515 680
+CNBC
+2 10930000 4 27500000 2 513 660
+FILM SAT
+2 10930000 4 27500000 2 518 710
+Nat. Geo
+2 10930000 4 27500000 2 513 660
+NOVA CINE
+2 10930000 4 27500000 2 514 670
+SS Extra
+2 10930000 4 27500000 2 516 690
+Test
+2 10930000 4 27500000 2 516 690
+Test
+2 10930000 4 27500000 2 516 690
+ALPHA TV
+2 10949000 2 27500000 2 7456 7457
+ALPHA CINEMA 1
+2 10949000 2 27500000 2 7476 7477
+ALPHA KIDS
+2 10949000 2 27500000 2 7464 7465
+ALPHA PROMO
+2 10949000 2 27500000 2 7452 7453
+ALPHA SPORTS 1
+2 10949000 2 27500000 2 7468 7469
+ALPHA SPORTS 2
+2 10949000 2 27500000 2 7472 7473
+ALPHA TEST 1
+2 10949000 2 27500000 2 7460 7461
+&Acirc;&Iuml;&Otilde;&Euml;&Ccedil;
+2 10949000 2 27500000 2 7496 7497
+&ETH;&Iuml;&Euml;&Eacute;&Oacute; TV
+2 10949000 2 27500000 2 7492 7493
+mtch
+2 10983000 2 27500000 2 2817 2818
+ALGERIAN TV
+2 11034000 2 27500000 2 1020 1030
+ARTE
+2 11034000 2 27500000 2 420 430
+FRANCE 5
+2 11034000 2 27500000 2 120 130
+M6
+2 11034000 2 27500000 2 520 530
+PARIS PREMIERE
+2 11034000 2 27500000 2 820 830
+RFO SAT
+2 11034000 2 27500000 2 320 330
+TF1
+2 11034000 2 27500000 2 220 230
+TF1
+2 11034000 2 27500000 2 620 630
+Bloomberg
+2 11241000 2 27500000 2 162 88
+MTV 1
+2 11241000 2 27500000 2 165 100
+MTV 5
+2 11241000 2 27500000 2 169 116
+MTV F
+2 11241000 2 27500000 2 168 112
+MTV H
+2 11241000 2 27500000 2 164 96
+MTV Nordic
+2 11241000 2 27500000 2 163 92
+MTV2 Pop Channel
+2 11241000 2 27500000 2 160 80
+NL Test
+2 11241000 2 27500000 2 161 84
+Program 8 / SF
+2 11241000 2 27500000 2 167 108
+VH1
+2 11241000 2 27500000 2 166 104
+DISNEY CHANNEL
+2 11262000 4 27500000 2 1030 1034
+PLANET
+2 11262000 4 27500000 2 1100 1104
+SEASONS
+2 11262000 4 27500000 2 1040 1044
+STUDIO UNIVERSAL
+2 11262000 4 27500000 2 1050 1054
+CYFRA+ INFO
+2 11283000 2 27500000 2 163 92
+EUROSPORT
+2 11283000 2 27500000 2 162 88
+FORMULA 1
+2 11283000 2 27500000 2 168 116
+HALLMARK
+2 11283000 2 27500000 2 161 84
+HBO
+2 11283000 2 27500000 2 160 80
+HBO
+2 11283000 2 27500000 2 160 80
+MTV CLASSIC
+2 11283000 2 27500000 2 165 100
+NATIONAL GEO
+2 11283000 2 27500000 2 166 104
+REALITY TV
+2 11283000 2 27500000 2 167 108
+TVN 24
+2 11283000 2 27500000 2 164 96
+ADVENTURE 1
+2 11311000 4 30000000 2 859 860
+AVANTE
+2 11311000 4 30000000 2 855 856
+CARTOON / TCM
+2 11311000 4 30000000 2 875 876
+CLUB
+2 11311000 4 30000000 2 871 872
+CNBC Europe
+2 11311000 4 30000000 2 895 896
+EXTREME SPORTS
+2 11311000 4 30000000 2 879 880
+NATIONAL GEOGRAPHIC
+2 11311000 4 30000000 2 863 864
+PAOK Channel
+2 11311000 4 30000000 2 891 892
+PLAYBOY / SPICE
+2 11311000 4 30000000 2 887 888
+PRIVATE BLUE / GOLD
+2 11311000 4 30000000 2 883 884
+REALITY
+2 11311000 4 30000000 2 867 868
+Multivision 1
+2 11661000 2 27500000 2 120 130
+Multivision 2
+2 11661000 2 27500000 2 220 230
+Multivision 3
+2 11661000 2 27500000 2 320 330
+Multivision 4
+2 11661000 2 27500000 2 420 430
+Multivision 5
+2 11661000 2 27500000 2 520 530
+Multivision 6
+2 11661000 2 27500000 2 620 630
+Multivision 7
+2 11661000 2 27500000 2 720 730
+AB 1
+2 11681000 4 27500000 2 160 80
+AB MOTEURS
+2 11681000 4 27500000 2 161 84
+ACTION
+2 11681000 4 27500000 2 169 116
+ANIMAUX
+2 11681000 4 27500000 2 162 88
+CHASSE &amp; PECHE
+2 11681000 4 27500000 2 163 92
+ENCYCLOPEDIA
+2 11681000 4 27500000 2 171 124
+ESCALES
+2 11681000 4 27500000 2 166 104
+FIT/CHAINE HISTOIRE
+2 11681000 4 27500000 2 167 108
+MANGAS
+2 11681000 4 27500000 2 170 120
+MUSIQUE CLASSIQUE
+2 11681000 4 27500000 2 165 100
+RFM-TV
+2 11681000 4 27500000 2 168 112
+RTL9
+2 11681000 4 27500000 2 172 128
+XXL
+2 11681000 4 27500000 2 164 96
+cart
+2 11843000 2 27500000 2 2433 2434
+cult
+2 11843000 2 27500000 2 2307 2308
+disc
+2 11843000 2 27500000 2 2436 2437
+ersp
+2 11843000 2 27500000 2 2317 2309
+tvl
+2 11843000 2 27500000 2 2439 2440
+univ
+2 11843000 2 27500000 2 2305 2306
+MOSAICO
+2 11862000 4 27500000 2 160 0
+P8
+2 11862000 4 27500000 2 163 96
+P9
+2 11862000 4 27500000 2 162 88
+P9 OFDM
+2 11862000 4 27500000 2 162 88
+cnn
+2 11881000 2 27500000 2 2433 2434
+euro
+2 11881000 2 27500000 2 2311 2312
+info
+2 11881000 2 27500000 2 517 700
+MPPV_PFShow
+2 11881000 2 27500000 2 2563 2564
+viag
+2 11881000 2 27500000 2 2308 2309
+CANAL D+
+2 11900000 4 27500000 2 165 100
+INTER CH.
+2 11900000 4 27500000 2 163 92
+MILAN CH.
+2 11900000 4 27500000 2 162 88
+MOSAICO
+2 11900000 4 27500000 2 160 0
+TST3
+2 11900000 4 27500000 2 164 96
+Test
+2 11919000 2 27500000 2 515 680
+E5500 Test
+2 11938000 4 27500000 2 34 33
+E5710 Test
+2 11938000 4 27500000 2 308 256
+NTV Int.-Detsky Mir
+2 11938000 4 27500000 2 162 84
+NTV Int.-HTB
+2 11938000 4 27500000 2 160 80
+NTV Int.-Nashe Kino
+2 11938000 4 27500000 2 161 82
+RTV
+2 11938000 4 27500000 2 101 89
+DISCOVERY
+2 11958000 2 27500000 2 161 84
+DISNEY CHANNEL
+2 11958000 2 27500000 2 160 80
+EUROSPORT
+2 11958000 2 27500000 2 162 88
+HAPPY CHANNEL
+2 11958000 2 27500000 2 163 92
+MATCH MUSIC
+2 11958000 2 27500000 2 164 96
+MTV
+2 11958000 2 27500000 2 165 100
+RaiSat CINEMA
+2 11958000 2 27500000 2 166 104
+RaiSat SHOW
+2 11958000 2 27500000 2 167 108
+cine movie
+2 11976000 4 27500000 2 2691 2692
+cine stream
+2 11976000 4 27500000 2 2689 2690
+s.verde
+2 11976000 4 27500000 2 2561 2562
+Stream2
+2 11976000 4 27500000 2 2433 2434
+mtch
+2 11977000 4 27500000 2 2435 2436
+s.verde
+2 11977000 4 27500000 2 2561 2562
+CLASSICA
+2 11996000 2 27500000 2 160 80
+HALLMARK
+2 11996000 2 27500000 2 163 92
+La 7
+2 11996000 2 27500000 2 166 104
+RaiSat ALBUM
+2 11996000 2 27500000 2 162 88
+RaiSat ART
+2 11996000 2 27500000 2 164 96
+RaiSat FICTION
+2 11996000 2 27500000 2 165 100
+RaiSat GAMBERO
+2 11996000 2 27500000 2 161 84
+TMC2
+2 11996000 2 27500000 2 167 108
+ALGERIAN TV
+2 12015000 4 27500000 2 521 740
+ART CHILDREN/TARAB
+2 12015000 4 27500000 2 513 660
+ART MOVIES
+2 12015000 4 27500000 2 514 670
+ART MUSIC
+2 12015000 4 27500000 2 515 680
+ART SPORT
+2 12015000 4 27500000 2 519 720
+LBC EUROPE
+2 12015000 4 27500000 2 165 100
+NILE DRAMA
+2 12015000 4 27500000 2 516 690
+NILE VARIETY
+2 12015000 4 27500000 2 518 710
+VARIETY EUROPE
+2 12015000 4 27500000 2 512 650
+CARTOON Network
+2 12034000 2 27500000 2 167 108
+RaiSat RAGAZZI
+2 12034000 2 27500000 2 166 104
+T+ 16:9
+2 12034000 2 27500000 2 164 96
+T+ BIANCO
+2 12034000 2 27500000 2 160 80
+T+ GRIGIO
+2 12034000 2 27500000 2 162 88
+T+ NERO
+2 12034000 2 27500000 2 161 84
+VETRINA
+2 12034000 2 27500000 2 165 100
+BBC
+2 12053000 4 27500000 2 161 84
+BBC WORLD
+2 12053000 4 27500000 2 161 84
+BLOOMBERG
+2 12053000 4 27500000 2 162 88
+CNBC
+2 12053000 4 27500000 2 163 92
+CNBC
+2 12053000 4 27500000 2 163 92
+CNN
+2 12053000 4 27500000 2 160 80
+CNN
+2 12053000 4 27500000 2 160 80
+ROCK TV
+2 12053000 4 27500000 2 165 100
+SKYNews
+2 12053000 4 27500000 2 164 96
+TV5
+2 12053000 4 27500000 2 166 104
+TV5
+2 12053000 4 27500000 2 166 104
+P2
+2 12072000 2 27500000 2 163 92
+P3
+2 12072000 2 27500000 2 164 96
+P4
+2 12072000 2 27500000 2 165 100
+P5
+2 12072000 2 27500000 2 166 104
+P6
+2 12072000 2 27500000 2 167 108
+PALCO 16:9
+2 12072000 2 27500000 2 162 88
+Satisfaction
+2 12092000 4 27500000 2 4192 4193
+BBC World
+2 12169000 4 27500000 2 514 670
+Cartoon
+2 12169000 4 27500000 2 515 680
+CCTV
+2 12169000 4 27500000 2 516 690
+Discovery
+2 12169000 4 27500000 2 512 650
+ET-1
+2 12169000 4 27500000 2 519 720
+MAD T.V
+2 12169000 4 27500000 2 518 710
+NET
+2 12169000 4 27500000 2 520 730
+SS Extra
+2 12169000 4 27500000 2 513 660
+TCM
+2 12169000 4 27500000 2 515 680
+&Acirc;&iuml;&otilde;&euml;&THORN;
+2 12169000 4 27500000 2 517 700
+GOURMET TV
+2 12245000 4 27500000 2 126 136
+MCM Europe
+2 12245000 4 27500000 2 122 132
+MEZZO
+2 12245000 4 27500000 2 125 135
+TTN
+2 12245000 4 27500000 2 124 134
+SLO-TV1
+2 12303000 2 27500000 2 200 201
+SLO-TV2
+2 12303000 2 27500000 2 203 204
+P10
+2 12341000 2 27500000 2 160 80
+P11
+2 12341000 2 27500000 2 161 84
+P12
+2 12341000 2 27500000 2 162 88
+P13
+2 12341000 2 27500000 2 163 92
+P14
+2 12341000 2 27500000 2 164 96
+P15
+2 12341000 2 27500000 2 165 100
+P16
+2 12341000 2 27500000 2 166 104
+PREMIUM
+2 12341000 2 27500000 2 167 108
+GAME ONE
+2 12380000 2 27500000 2 3027 3037
+Paris Premi&egrave;re
+2 12380000 2 27500000 2 3021 3031
+SF1
+2 12399000 4 27500000 2 160 80
+SF2
+2 12399000 4 27500000 2 163 92
+SFi
+2 12399000 4 27500000 2 167 102
+TSI1
+2 12399000 4 27500000 2 162 88
+TSI2
+2 12399000 4 27500000 2 166 100
+TSR1
+2 12399000 4 27500000 2 161 84
+TSR2
+2 12399000 4 27500000 2 164 96
+CANAL JIMMY
+2 12418000 2 27500000 2 162 88
+CINECINEMA1
+2 12418000 2 27500000 2 164 96
+CINECINEMA2
+2 12418000 2 27500000 2 165 100
+CINECLASSICS
+2 12418000 2 27500000 2 166 104
+INN
+2 12418000 2 27500000 2 163 92
+MARCOPOLO
+2 12418000 2 27500000 2 160 80
+MARCOPOLO
+2 12418000 2 27500000 2 160 80
+PLANETE
+2 12418000 2 27500000 2 161 84
+SEASONS
+2 12418000 2 27500000 2 167 108
+SEASONS POL
+2 12418000 2 27500000 2 167 109
+WISHLINE
+2 12418000 2 27500000 2 168 85
+HRT-TV1
+2 12520000 2 27500000 2 100 101
+HRT-TV2
+2 12520000 2 27500000 2 103 104
+HRT-TV3
+2 12520000 2 27500000 2 105 106
+MMOV_PF1
+2 12616000 4 27500000 2 2823 2822
+MMOV_PF2
+2 12616000 4 27500000 2 2825 2824
+MMOV_PF3
+2 12616000 4 27500000 2 2827 2826
+MMOV_PF4
+2 12616000 4 27500000 2 2829 2828
+MMOV_PF5
+2 12616000 4 27500000 2 2831 2830
+MMOV_PF6
+2 12616000 4 27500000 2 2833 2832
+sc 1
+2 12616000 4 27500000 2 2561 2562
+sc 2
+2 12616000 4 27500000 2 2564 2565
+sc 3
+2 12616000 4 27500000 2 2567 2568
+calcio ch.
+2 12635000 2 27500000 2 2697 2694
+MMOV_PF10
+2 12635000 2 27500000 2 2565 2564
+MMOV_PF7
+2 12635000 2 27500000 2 2947 2946
+MMOV_PF8
+2 12635000 2 27500000 2 2949 2948
+MMOV_PF9
+2 12635000 2 27500000 2 2563 2562
+sc 4
+2 12635000 2 27500000 2 2689 2690
+sc 5
+2 12635000 2 27500000 2 2696 2692
+CINE PALACE
+2 12692000 4 27500000 2 165 100
+ENCYCLOPEDIA
+2 12692000 4 27500000 2 163 92
+MANGAS
+2 12692000 4 27500000 2 162 88
+MEDYA TV
+2 12692000 4 27500000 2 168 112
+POLAR
+2 12692000 4 27500000 2 164 96
+RIRE
+2 12692000 4 27500000 2 167 108
+ROMANCE
+2 12692000 4 27500000 2 166 104
+MMOV_PF11
+2 12713000 2 27500000 2 2818 2819
+MMOV_PF12
+2 12713000 2 27500000 2 2820 2821
+MMOV_PF13
+2 12713000 2 27500000 2 2693 2692
+MMOV_PF14
+2 12713000 2 27500000 2 2691 2690
+MMOV_PF15
+2 12713000 2 27500000 2 2691 2690
+MMOV_PF16
+2 12713000 2 27500000 2 2691 2690
+cfn
+2 12731000 4 27500000 2 523 760
+comedy
+2 12731000 4 27500000 2 2308 2309
+duel
+2 12731000 4 27500000 2 2689 2690
+fox kids
+2 12731000 4 27500000 2 2691 2692
+nat geo
+2 12731000 4 27500000 2 2693 2694
+roma ch
+2 12731000 4 27500000 2 2310 2311
+RTL9
+0 12012000 2 27500000 2 164 96
+CNNI
+2 10930000 4 27500000 2 515 680
+FOX NEWS
+0 12441000 2 27500000 2 167 108
+FOX NEWS
+0 11686000 2 22000000 3 167 108
+BBC WORLD
+0 12266000 4 27500000 3 167 108
+Cartoon Network
+0 12246000 2 27500000 2 160 80
+Cartoon Network
+0 12168000 2 27500000 2 161 84
+MTV 2
+0 11608000 2 22000000 3 3091 3092
+MTV Base
+0 11608000 2 22000000 2 3051 3052
+MTV ESP
+0 11608000 2 22000000 2 3011 3012
+MTV Hits
+0 11608000 2 22000000 2 3041 3042
+VH1
+0 11608000 2 22000000 2 3061 3062
+VH1 Classic
+0 11608000 2 22000000 2 3071 3072
+KiKa
+0 11954000 4 27500000 3 310 320
+EUROSPORTNEWS
+2 11996000 2 27500000 2 168 112
+M6 Music
+2 10757000 2 27500000 2 820 830
diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c
index e4ef198ef..9cc331830 100644
--- a/src/demuxers/demux_ts.c
+++ b/src/demuxers/demux_ts.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: demux_ts.c,v 1.71 2002/12/21 12:56:46 miguelfreitas Exp $
+ * $Id: demux_ts.c,v 1.72 2002/12/27 00:53:49 guenter Exp $
*
* Demultiplexer for MPEG2 Transport Streams.
*
@@ -139,8 +139,7 @@
#include "xine_internal.h"
#include "xineutils.h"
#include "demux.h"
-
-#define VALID_MRLS "fifo,stdin,dvb,tcp"
+#include "events.h"
/*
#define TS_LOG
@@ -285,6 +284,9 @@ typedef struct {
demux_ts_spu_lang spu_langs[MAX_NO_SPU_LANGS];
int no_spu_langs;
int current_spu_channel;
+
+ /* dvb */
+ xine_event_queue_t *event_queue;
} demux_ts_t;
typedef struct {
@@ -1597,6 +1599,33 @@ static void demux_ts_parse_packet (demux_ts_t*this) {
}
}
+/*
+ * check for pids change events
+ */
+
+static void demux_ts_event_handler (demux_ts_t *this) {
+
+ xine_event_t *event;
+
+ while ((event = xine_event_get (this->event_queue))) {
+
+
+ switch (event->type) {
+
+ case XINE_EVENT_PIDS_CHANGE:
+
+ this->videoPid = INVALID_PID;
+ this->audioPid = INVALID_PID;
+ this->media_num = 0;
+ this->send_newpts = 1;
+
+ break;
+
+ }
+
+ xine_event_free (event);
+ }
+}
/*
* send a piece of data down the fifos
@@ -1606,14 +1635,15 @@ static int demux_ts_send_chunk (demux_plugin_t *this_gen) {
demux_ts_t*this = (demux_ts_t*)this_gen;
+ demux_ts_event_handler (this);
+
demux_ts_parse_packet(this);
/* DVBSUB: check if channel has changed. Dunno if I should, or
* even could, lock the xine object. */
- if (this->stream->spu_channel != this->current_spu_channel)
- {
- demux_ts_update_spu_channel(this);
- }
+ if (this->stream->spu_channel != this->current_spu_channel) {
+ demux_ts_update_spu_channel(this);
+ }
return this->status;
}
@@ -1629,6 +1659,9 @@ static void demux_ts_dispose (demux_plugin_t *this_gen) {
if (this->media[i].buf != NULL)
this->media[i].buf->free_buffer(this->media[i].buf);
}
+
+ xine_event_dispose_queue (this->event_queue);
+
free(this_gen);
}
@@ -1953,6 +1986,9 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen,
this->spu_pid = INVALID_PID;
this->no_spu_langs = 0;
this->current_spu_channel = this->stream->spu_channel;
+
+ /* dvb */
+ this->event_queue = xine_event_new_queue (this->stream);
return &this->demux_plugin;
}
diff --git a/src/input/Makefile.am b/src/input/Makefile.am
index d19cf63e5..1304163ab 100644
--- a/src/input/Makefile.am
+++ b/src/input/Makefile.am
@@ -3,9 +3,9 @@
##
if HAVE_DVDNAV
-SUBDIRS = libreal librtsp libdvdread
+SUBDIRS = ost libreal librtsp libdvdread
else
-SUBDIRS = libreal librtsp libdvdread libdvdnav
+SUBDIRS = ost libreal librtsp libdvdread libdvdnav
endif
LIBTOOL = $(SHELL) $(top_builddir)/libtool-nofpic
@@ -48,6 +48,7 @@ lib_LTLIBRARIES = \
$(in_vcd) \
xineplug_inp_mms.la \
xineplug_inp_stdin_fifo.la \
+ xineplug_inp_dvb.la \
xineplug_inp_pnm.la \
xineplug_inp_rtsp.la \
xineplug_inp_net.la
@@ -104,6 +105,10 @@ xineplug_inp_pnm_la_SOURCES = input_pnm.c net_buf_ctrl.c pnm.c
xineplug_inp_pnm_la_LIBADD = $(XINE_LIB)
xineplug_inp_pnm_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@
+xineplug_inp_dvb_la_SOURCES = input_dvb.c net_buf_ctrl.c
+xineplug_inp_dvb_la_LIBADD = $(XINE_LIB)
+xineplug_inp_dvb_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@
+
xineplug_inp_rtsp_la_SOURCES = input_rtsp.c net_buf_ctrl.c
xineplug_inp_rtsp_la_LIBADD = $(XINE_LIB) libreal/libreal.la librtsp/librtsp.la
xineplug_inp_rtsp_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@
diff --git a/src/input/input_dvb.c b/src/input/input_dvb.c
new file mode 100644
index 000000000..12ad6dd09
--- /dev/null
+++ b/src/input/input_dvb.c
@@ -0,0 +1,865 @@
+/*
+ * Copyright (C) 2000-2002 the xine project
+ *
+ * This file is part of xine, a free video player.
+ *
+ * xine is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * xine is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ *
+ * input plugin for Digital TV (Digital Video Broadcast - DVB) devices
+ * e.g. Hauppauge WinTV Nova supported by DVB drivers from Convergence
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <sys/poll.h>
+
+#include "ost/dmx.h"
+#include "ost/sec.h"
+#include "ost/frontend.h"
+
+#include "xine_internal.h"
+#include "xineutils.h"
+#include "events.h"
+#include "input_plugin.h"
+#include "net_buf_ctrl.h"
+
+/*
+#define LOG
+*/
+
+extern int errno;
+
+#define FRONTEND_DEVICE "/dev/ost/frontend"
+#define SEC_DEVICE "/dev/ost/sec"
+#define DEMUX_DEVICE "/dev/ost/demux"
+#define DVR_DEVICE "/dev/ost/dvr"
+
+#define BUFSIZE 4096
+
+#define NOPID 0xffff
+
+typedef struct {
+ int fd_frontend;
+ int fd_sec;
+ int fd_demuxa, fd_demuxv, fd_demuxtt;
+
+ FrontendInfo feinfo;
+ FrontendParameters front_param;
+
+ struct secCommand scmd;
+ struct secCmdSequence scmds;
+ struct dmxPesFilterParams pesFilterParamsV;
+ struct dmxPesFilterParams pesFilterParamsA;
+ struct dmxPesFilterParams pesFilterParamsTT;
+
+} tuner_t;
+
+typedef struct {
+
+ char *name;
+ int freq; /* freq - lof */
+ int tone; /* SEC_TONE_ON/OFF */
+ int volt; /* SC_VOLTAGE_13/18 */
+ int diseqcnr;
+ int srate;
+ int fec;
+ int vpid;
+ int apid;
+
+} channel_t;
+
+typedef struct {
+
+ input_class_t input_class;
+
+ xine_t *xine;
+
+ char *mrls[2];
+
+} dvb_input_class_t;
+
+typedef struct {
+ input_plugin_t input_plugin;
+
+ dvb_input_class_t *cls;
+
+ xine_stream_t *stream;
+
+ char *mrl;
+
+ off_t curpos;
+
+ nbc_t *nbc;
+
+ tuner_t *tuner;
+ channel_t *channels;
+ int fd;
+ int num_channels;
+ int channel;
+ pthread_mutex_t mutex;
+
+ osd_object_t *osd;
+
+ xine_event_queue_t *event_queue;
+
+ /* scratch buffer for forward seeking */
+ char seek_buf[BUFSIZE];
+
+ int out_fd; /* recording function */
+
+} dvb_input_plugin_t;
+
+
+static tuner_t *tuner_init () {
+
+ tuner_t *this;
+
+ this = malloc (sizeof (tuner_t));
+
+ if ((this->fd_frontend = open(FRONTEND_DEVICE, O_RDWR)) < 0){
+ perror("FRONTEND DEVICE: ");
+ free (this);
+ return NULL;
+ }
+
+ ioctl (this->fd_frontend, FE_GET_INFO, &this->feinfo);
+ if (this->feinfo.type==FE_QPSK) {
+
+ if ((this->fd_sec = open (SEC_DEVICE, O_RDWR)) < 0) {
+ perror ("SEC DEVICE: ");
+ free (this);
+ return NULL;
+ }
+ }
+
+ this->fd_demuxtt = open (DEMUX_DEVICE, O_RDWR);
+ if (this->fd_demuxtt < 0) {
+ perror ("DEMUX DEVICE tt: ");
+ free (this);
+ return NULL;
+ }
+
+ this->fd_demuxa = open (DEMUX_DEVICE, O_RDWR);
+ if (this->fd_demuxa < 0) {
+ perror ("DEMUX DEVICE audio: ");
+ free (this);
+ return NULL;
+ }
+
+ this->fd_demuxv=open (DEMUX_DEVICE, O_RDWR);
+ if (this->fd_demuxv < 0) {
+ perror ("DEMUX DEVICE video: ");
+ free (this);
+ return NULL;
+ }
+
+ return this;
+}
+
+static void tuner_dispose (tuner_t *this) {
+
+ close (this->fd_frontend);
+ close (this->fd_sec);
+ close (this->fd_demuxa);
+ close (this->fd_demuxv);
+ close (this->fd_demuxtt);
+
+ free (this);
+}
+
+static void tuner_set_vpid (tuner_t *this, ushort vpid) {
+
+ if (vpid==0 || vpid==NOPID || vpid==0x1fff) {
+ ioctl (this->fd_demuxv, DMX_STOP, 0);
+ return;
+ }
+
+ this->pesFilterParamsV.pid = vpid;
+ this->pesFilterParamsV.input = DMX_IN_FRONTEND;
+ this->pesFilterParamsV.output = DMX_OUT_TS_TAP;
+ this->pesFilterParamsV.pesType = DMX_PES_VIDEO;
+ this->pesFilterParamsV.flags = DMX_IMMEDIATE_START;
+ if (ioctl(this->fd_demuxv, DMX_SET_PES_FILTER,
+ &this->pesFilterParamsV) < 0)
+ perror("set_vpid");
+}
+
+static void tuner_set_apid (tuner_t *this, ushort apid) {
+ if (apid==0 || apid==NOPID || apid==0x1fff) {
+ ioctl (this->fd_demuxa, DMX_STOP, apid);
+ return;
+ }
+
+ this->pesFilterParamsA.pid = apid;
+ this->pesFilterParamsA.input = DMX_IN_FRONTEND;
+ this->pesFilterParamsA.output = DMX_OUT_TS_TAP;
+ this->pesFilterParamsA.pesType = DMX_PES_AUDIO;
+ this->pesFilterParamsA.flags = DMX_IMMEDIATE_START;
+ if (ioctl (this->fd_demuxa, DMX_SET_PES_FILTER,
+ &this->pesFilterParamsA) < 0)
+ perror("set_apid");
+}
+
+static void tuner_set_ttpid (tuner_t *this, ushort ttpid) {
+
+ if (ttpid==0 || ttpid== NOPID || ttpid==0x1fff) {
+ ioctl (this->fd_demuxtt, DMX_STOP, 0);
+ return;
+ }
+ this->pesFilterParamsTT.pid = ttpid;
+ this->pesFilterParamsTT.input = DMX_IN_FRONTEND;
+ this->pesFilterParamsTT.output = DMX_OUT_DECODER;
+ this->pesFilterParamsTT.pesType = DMX_PES_TELETEXT;
+ this->pesFilterParamsTT.flags = DMX_IMMEDIATE_START;
+ if (ioctl(this->fd_demuxtt, DMX_SET_PES_FILTER,
+ &this->pesFilterParamsTT) < 0) {
+ /* printf("PID=%04x\n", ttpid); */
+ perror("set_ttpid");
+ }
+}
+
+static void tuner_get_front (tuner_t *this) {
+ tuner_set_vpid (this, 0);
+ tuner_set_apid (this, 0);
+ tuner_set_ttpid(this, 0);
+ this->scmds.voltage = SEC_VOLTAGE_13;
+ this->scmds.miniCommand = SEC_MINI_NONE;
+ this->scmds.continuousTone = SEC_TONE_OFF;
+ this->scmds.numCommands = 1;
+ this->scmds.commands = &this->scmd;
+}
+
+static void tuner_set_diseqc_nr (tuner_t *this, int nr) {
+
+ this->scmd.type=0;
+ this->scmd.u.diseqc.addr = 0x10;
+ this->scmd.u.diseqc.cmd = 0x38;
+ this->scmd.u.diseqc.numParams = 1;
+ this->scmd.u.diseqc.params[0] = 0xF0 | ((nr * 4) & 0x0F) |
+ (this->scmds.continuousTone == SEC_TONE_ON ? 1 : 0) |
+ (this->scmds.voltage==SEC_VOLTAGE_18 ? 2 : 0);
+}
+
+static void tuner_set_tp (tuner_t *this, int freq, int tone,
+ int volt, int diseqcnr,
+ int srate, int fec) {
+
+ static const uint8_t rfectab[9] = {1,2,3,0,4,0,5,0,0};
+
+ this->front_param.Frequency = freq;
+ this->scmds.continuousTone = tone;
+ this->scmds.voltage = volt;
+ tuner_set_diseqc_nr (this, diseqcnr);
+ this->front_param.u.qpsk.SymbolRate = srate;
+ this->front_param.u.qpsk.FEC_inner = (CodeRate)rfectab[fec];
+ this->front_param.Inversion = INVERSION_AUTO;
+}
+
+static int tuner_tune_it (tuner_t *this, FrontendParameters *front_param) {
+ FrontendEvent event;
+ struct pollfd pfd[1];
+
+ if (ioctl(this->fd_frontend, FE_SET_FRONTEND, front_param) <0)
+ perror("setfront front");
+
+ pfd[0].fd=this->fd_frontend;
+ pfd[0].events=POLLIN;
+ if (poll(pfd,1,2000)) {
+ if (pfd[0].revents & POLLIN){
+ if (ioctl(this->fd_frontend, FE_GET_EVENT, &event)
+ == -EBUFFEROVERFLOW){
+ perror("fe get event");
+ return 0;
+ }
+ switch(event.type){
+ case FE_UNEXPECTED_EV:
+ perror("unexpected event\n");
+ return 0;
+ case FE_FAILURE_EV:
+ perror("failure event\n");
+ return 0;
+
+ case FE_COMPLETION_EV:
+ fprintf(stderr, "completion event\n");
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+
+static int tuner_set_front (tuner_t *this) {
+ this->scmds.miniCommand = SEC_MINI_NONE;
+ this->scmds.numCommands=1;
+ this->scmds.commands=&this->scmd;
+
+ tuner_set_vpid (this, 0);
+ tuner_set_apid (this, 0);
+ tuner_set_ttpid(this,0);
+
+ if (this->feinfo.type==FE_QPSK) {
+ if (ioctl(this->fd_sec, SEC_SEND_SEQUENCE, &this->scmds) < 0)
+ perror("setfront sec");
+ usleep(70000);
+ }
+ return tuner_tune_it(this, &this->front_param);
+}
+
+static void print_channel (channel_t *channel) {
+
+ printf ("input_dvb: channel '%s' diseqc %d freq %d volt %d srate %d fec %d vpid %d apid %d\n",
+ channel->name,
+ channel->diseqcnr,
+ channel->freq,
+ channel->volt,
+ channel->srate,
+ channel->fec,
+ channel->vpid,
+ channel->apid);
+
+}
+
+
+static int tuner_set_channel (tuner_t *this,
+ channel_t *c) {
+
+ print_channel (c);
+
+ tuner_get_front (this);
+ tuner_set_tp (this, c->freq, c->tone, c->volt, c->diseqcnr, c->srate, c->fec);
+ if (!tuner_set_front (this))
+ return 0;
+
+ tuner_set_vpid (this, c->vpid);
+ tuner_set_apid (this, c->apid);
+ tuner_set_ttpid (this, 0);
+
+ return 1; /* fixme: error handling */
+}
+
+static void osd_show_channel (dvb_input_plugin_t *this) {
+
+ printf ("input_dvb: channel=%d\n", this->channel);
+
+#if 0 /* FIXME */
+ int i, channel ;
+
+ if (!this->osd) {
+ this->osd = this->stream->osd_renderer->new_object (this->stream->osd_renderer,
+ 410, 410);
+ this->stream->osd_renderer->set_position (this->osd, 20, 20);
+ this->stream->osd_renderer->set_font (this->osd, "cetus", 32);
+ this->stream->osd_renderer->set_text_palette (this->osd,
+ TEXTPALETTE_WHITE_NONE_TRANSLUCID,
+ OSD_TEXT3);
+ }
+
+ this->stream->osd_renderer->filled_rect (this->osd, 0, 0, 395, 400, 2);
+
+ channel = this->channel - 5;
+
+ for (i=0; i<11; i++) {
+
+ if ( (channel >= 0) && (channel < this->num_channels) )
+ this->stream->osd_renderer->render_text (this->osd, 10, 10+i*35,
+ this->channels[channel].name,
+ OSD_TEXT3);
+ channel ++;
+ }
+
+ this->stream->osd_renderer->line (this->osd, 5, 183, 390, 183, 10);
+ this->stream->osd_renderer->line (this->osd, 5, 183, 5, 219, 10);
+ this->stream->osd_renderer->line (this->osd, 5, 219, 390, 219, 10);
+ this->stream->osd_renderer->line (this->osd, 390, 183, 390, 219, 10);
+
+ this->stream->osd_renderer->show (this->osd, 0);
+#endif
+
+}
+
+static void switch_channel (dvb_input_plugin_t *this) {
+
+ xine_event_t event;
+ xine_pids_data_t data;
+
+ pthread_mutex_lock (&this->mutex);
+
+ close (this->fd);
+
+ if (!tuner_set_channel (this->tuner, &this->channels[this->channel])) {
+ printf ("input_dvb: tuner_set_channel failed\n");
+ pthread_mutex_unlock (&this->mutex);
+ return;
+ }
+
+ event.type = XINE_EVENT_PIDS_CHANGE;
+ data.vpid = this->channels[this->channel].vpid;
+ data.apid = this->channels[this->channel].apid;
+ event.data = &data;
+ event.data_length = sizeof (xine_pids_data_t);
+
+ printf ("input_dvb: sending event\n");
+
+ xine_event_send (this->stream, &event);
+
+ this->fd = open (DVR_DEVICE, O_RDONLY);
+
+ pthread_mutex_unlock (&this->mutex);
+
+#if 0 /* FIXME */
+ this->stream->osd_renderer->hide (this->osd, 0);
+#endif
+}
+
+static void dvb_event_handler (dvb_input_plugin_t *this) {
+
+ xine_event_t *event;
+
+ while ((event = xine_event_get (this->event_queue))) {
+
+ if (this->fd<0) {
+ xine_event_free (event);
+ return;
+ }
+
+ switch (event->type) {
+
+ case XINE_EVENT_INPUT_NEXT:
+ if (this->channel < (this->num_channels-1))
+ this->channel++;
+ osd_show_channel (this);
+ break;
+
+ case XINE_EVENT_INPUT_PREVIOUS:
+ if (this->channel>0)
+ this->channel--;
+ osd_show_channel (this);
+ break;
+
+ case XINE_EVENT_INPUT_DOWN:
+ if (this->channel < (this->num_channels-1)) {
+ this->channel++;
+ switch_channel (this);
+ }
+ break;
+
+ case XINE_EVENT_INPUT_UP:
+ if (this->channel>0) {
+ this->channel--;
+ switch_channel (this);
+ }
+ break;
+
+ case XINE_EVENT_INPUT_SELECT:
+ switch_channel (this);
+ break;
+
+ case XINE_EVENT_INPUT_MENU3:
+ this->stream->osd_renderer->hide (this->osd, 0);
+ break;
+
+#if 0
+ default:
+ printf ("input_dvb: got an event, type 0x%08x\n", event->type);
+#endif
+ }
+
+ xine_event_free (event);
+ }
+}
+
+static off_t dvb_plugin_read (input_plugin_t *this_gen,
+ char *buf, off_t len) {
+ dvb_input_plugin_t *this = (dvb_input_plugin_t *) this_gen;
+ off_t n, total;
+
+ dvb_event_handler (this);
+
+#ifdef LOG
+ printf ("input_dvb: reading %lld bytes...\n", len);
+#endif
+
+ nbc_check_buffers (this->nbc);
+
+ pthread_mutex_lock( &this->mutex ); /* protect agains channel changes */
+ total=0;
+ while (total<len){
+ n = read (this->fd, &buf[total], len-total);
+
+#ifdef LOG
+ printf ("input_dvb: got %lld bytes (%lld/%lld bytes read)\n",
+ n,total,len);
+#endif
+
+ if (n > 0){
+ this->curpos += n;
+ total += n;
+ } else if (n<0 && errno!=EAGAIN) {
+ pthread_mutex_unlock( &this->mutex );
+ return total;
+ }
+ }
+
+ if (this->out_fd>0)
+ write (this->out_fd, buf, total);
+
+ pthread_mutex_unlock( &this->mutex );
+ return total;
+}
+
+static buf_element_t *dvb_plugin_read_block (input_plugin_t *this_gen,
+ fifo_buffer_t *fifo, off_t todo) {
+ /* dvb_input_plugin_t *this = (dvb_input_plugin_t *) this_gen; */
+ buf_element_t *buf = fifo->buffer_pool_alloc (fifo);
+ int total_bytes;
+
+
+#if 0
+ if (this->report_pids) {
+
+ printf ("input_dvb: reporting pids %d (video), %d (audio)\n",
+ this->channels[this->channel].vpid,
+ this->channels[this->channel].apid);
+
+ this->report_pids = 0;
+
+ }
+#endif
+
+ buf->content = buf->mem;
+ buf->type = BUF_DEMUX_BLOCK;
+
+ total_bytes = dvb_plugin_read (this_gen, buf->content, todo);
+
+ if (total_bytes != todo) {
+ buf->free_buffer (buf);
+ return NULL;
+ }
+
+ buf->size = total_bytes;
+
+ return buf;
+}
+
+static off_t dvb_plugin_seek (input_plugin_t *this_gen, off_t offset,
+ int origin) {
+
+ dvb_input_plugin_t *this = (dvb_input_plugin_t *) this_gen;
+
+#ifdef LOG
+ printf ("input_dvb: seek %lld bytes, origin %d\n",
+ offset, origin);
+#endif
+
+ /* only relative forward-seeking is implemented */
+
+ if ((origin == SEEK_CUR) && (offset >= 0)) {
+
+ for (;((int)offset) - BUFSIZE > 0; offset -= BUFSIZE) {
+ this->curpos += dvb_plugin_read (this_gen, this->seek_buf, BUFSIZE);
+ }
+
+ this->curpos += dvb_plugin_read (this_gen, this->seek_buf, offset);
+ }
+
+ return this->curpos;
+}
+
+static off_t dvb_plugin_get_length (input_plugin_t *this_gen) {
+ return 0;
+}
+
+static uint32_t dvb_plugin_get_capabilities (input_plugin_t *this_gen) {
+ return 0; /* where did INPUT_CAP_AUTOPLAY go ?!? */
+}
+
+static uint32_t dvb_plugin_get_blocksize (input_plugin_t *this_gen) {
+ return 0;
+}
+
+static off_t dvb_plugin_get_current_pos (input_plugin_t *this_gen){
+ dvb_input_plugin_t *this = (dvb_input_plugin_t *) this_gen;
+
+ return this->curpos;
+}
+
+static void dvb_plugin_dispose (input_plugin_t *this_gen) {
+ dvb_input_plugin_t *this = (dvb_input_plugin_t *) this_gen;
+
+ close(this->fd);
+ this->fd = -1;
+
+ if (this->nbc) {
+ nbc_close (this->nbc);
+ this->nbc = NULL;
+ }
+
+ if (this->out_fd>0)
+ close (this->out_fd);
+
+ xine_event_dispose_queue (this->event_queue);
+
+ free (this->mrl);
+ free (this);
+}
+
+static char* dvb_plugin_get_mrl (input_plugin_t *this_gen) {
+ dvb_input_plugin_t *this = (dvb_input_plugin_t *) this_gen;
+
+ return this->mrl;
+}
+
+static int dvb_plugin_get_optional_data (input_plugin_t *this_gen,
+ void *data, int data_type) {
+
+ return INPUT_OPTIONAL_UNSUPPORTED;
+}
+
+static channel_t *load_channels (int *num_ch) {
+
+ FILE *f;
+ unsigned char str[BUFSIZE];
+ unsigned char filename[BUFSIZE];
+ channel_t *channels;
+ int num_channels;
+
+ snprintf (filename, BUFSIZE, "%s/.xine/dvb_channels", xine_get_homedir());
+
+ f = fopen (filename, "rb");
+ if (!f) {
+ printf ("input_dvb: failed to open dvb channel file '%s'\n", filename);
+ return NULL;
+ }
+
+ /*
+ * count and alloc channels
+ */
+ num_channels = 0;
+ while ( fgets (str, BUFSIZE, f)) {
+ fgets (str, BUFSIZE, f);
+ num_channels++;
+ }
+ fclose (f);
+ printf ("input_dvb: %d channels found.\n", num_channels);
+
+ channels = malloc (sizeof (channel_t) * num_channels);
+
+ /*
+ * load channel list
+ */
+
+ f = fopen (filename, "rb");
+ num_channels = 0;
+ while ( fgets (str, BUFSIZE, f)) {
+
+ int freq;
+
+ channels[num_channels].name = strdup (str);
+
+ fgets (str, BUFSIZE, f);
+
+ sscanf (str, "%d %d %d %d %d %d %d\n",
+ &channels[num_channels].diseqcnr,
+ &freq,
+ &channels[num_channels].volt,
+ &channels[num_channels].srate,
+ &channels[num_channels].fec,
+ &channels[num_channels].vpid,
+ &channels[num_channels].apid);
+
+ if (freq > 11700000) {
+ channels[num_channels].freq = freq - 10600000;
+ channels[num_channels].tone = SEC_TONE_ON;
+ } else {
+ channels[num_channels].freq = freq - 9750000;
+ channels[num_channels].tone = SEC_TONE_OFF;
+ }
+
+#ifdef LOG
+ printf ("input: dvb channel %s loaded\n", channels[num_channels].name);
+#endif
+
+ num_channels++;
+ }
+
+ *num_ch = num_channels;
+ return channels;
+}
+
+static input_plugin_t *open_plugin (input_class_t *cls_gen,
+ xine_stream_t *stream,
+ const char *data) {
+
+ dvb_input_class_t *cls = (dvb_input_class_t *) cls_gen;
+ dvb_input_plugin_t *this;
+ tuner_t *tuner;
+ channel_t *channels;
+ int num_channels;
+ char *mrl = (char *) data;
+
+ if (strncasecmp (mrl, "dvb:/",5))
+ return NULL;
+
+ if ( !(tuner = tuner_init()) ) {
+ printf ("input_dvb: cannot open dvb device\n");
+ return NULL;
+ }
+
+ if ( !(channels = load_channels(&num_channels)) ) {
+ tuner_dispose (tuner);
+ return NULL;
+ }
+
+ this = (dvb_input_plugin_t *) xine_xmalloc (sizeof(dvb_input_plugin_t));
+
+ this->tuner = tuner;
+ this->channels = channels;
+
+ if ( sscanf (mrl, "dvb://%d", &this->channel) != 1)
+ this->channel = 0;
+
+ if (!tuner_set_channel (this->tuner, &this->channels[this->channel])) {
+ printf ("input_dvb: tuner_set_channel failed\n");
+ free (this);
+ return NULL;
+ }
+
+ if ((this->fd = open (DVR_DEVICE, O_RDONLY)) < 0){
+ printf ("input_dvb: cannot open dvr device '%s'\n", DVR_DEVICE);
+ free (this);
+ return NULL;
+ }
+
+ this->mrl = strdup(mrl);
+
+ this->curpos = 0;
+ this->nbc = nbc_init (stream);
+ this->stream = stream;
+ this->tuner = tuner;
+ this->channels = channels;
+ this->num_channels = num_channels;
+ this->osd = NULL;
+
+ this->input_plugin.get_capabilities = dvb_plugin_get_capabilities;
+ this->input_plugin.read = dvb_plugin_read;
+ this->input_plugin.read_block = dvb_plugin_read_block;
+ this->input_plugin.seek = dvb_plugin_seek;
+ this->input_plugin.get_current_pos = dvb_plugin_get_current_pos;
+ this->input_plugin.get_length = dvb_plugin_get_length;
+ this->input_plugin.get_blocksize = dvb_plugin_get_blocksize;
+ this->input_plugin.get_mrl = dvb_plugin_get_mrl;
+ this->input_plugin.get_optional_data = dvb_plugin_get_optional_data;
+ this->input_plugin.dispose = dvb_plugin_dispose;
+ this->input_plugin.input_class = cls_gen;
+ this->cls = cls;
+
+ /*
+ xine_register_event_listener (this->stream, dvb_event_listener, this);
+ */
+
+ pthread_mutex_init (&this->mutex, NULL);
+
+#if 0
+ this->out_fd = open ("foo.ts", O_CREAT | O_WRONLY | O_TRUNC, 0644);
+#else
+ this->out_fd = 0;
+#endif
+
+ this->event_queue = xine_event_new_queue (this->stream);
+
+ return (input_plugin_t *) this;
+}
+
+/*
+ * dvb input plugin class stuff
+ */
+
+static char *dvb_class_get_description (input_class_t *this_gen) {
+ return _("DVB (Digital TV) input plugin");
+}
+
+static char *dvb_class_get_identifier (input_class_t *this_gen) {
+ return "dvb";
+}
+
+static void dvb_class_dispose (input_class_t *this_gen) {
+
+ dvb_input_class_t *cls = (dvb_input_class_t *) this_gen;
+
+ free (cls->mrls[0]);
+
+ free (cls);
+}
+
+static int dvb_class_eject_media (input_class_t *this_gen) {
+ return 1;
+}
+
+static char ** dvb_class_get_autoplay_list (input_class_t *this_gen,
+ int *num_files) {
+ dvb_input_class_t *cls = (dvb_input_class_t *) this_gen;
+
+ *num_files = 1;
+ return cls->mrls;
+}
+
+static void *init_class (xine_t *xine, void *data) {
+
+ dvb_input_class_t *this;
+
+ this = (dvb_input_class_t *) xine_xmalloc (sizeof (dvb_input_class_t));
+
+ this->xine = xine;
+
+ this->input_class.open_plugin = open_plugin;
+ this->input_class.get_identifier = dvb_class_get_identifier;
+ this->input_class.get_description = dvb_class_get_description;
+ this->input_class.get_dir = NULL;
+ this->input_class.get_autoplay_list = dvb_class_get_autoplay_list;
+ this->input_class.dispose = dvb_class_dispose;
+ this->input_class.eject_media = dvb_class_eject_media;
+
+ this->mrls[0] = "dvb://";
+ this->mrls[1] = 0;
+
+ printf ("input_dvb: init class succeeded\n");
+
+ return this;
+}
+
+
+/*
+ * exported plugin catalog entry
+ */
+
+plugin_info_t xine_plugin_info[] = {
+ /* type, API, "name", version, special_info, init_function */
+ { PLUGIN_INPUT, 11, "DVB", XINE_VERSION_CODE, NULL, init_class },
+ { PLUGIN_NONE, 0, "", 0, NULL, NULL }
+};
diff --git a/src/input/ost/Makefile.am b/src/input/ost/Makefile.am
new file mode 100644
index 000000000..7c179a4af
--- /dev/null
+++ b/src/input/ost/Makefile.am
@@ -0,0 +1,22 @@
+noinst_HEADERS = \
+ demux.h \
+ dmx.h \
+ frontend.h \
+ sec.h
+
+debug:
+ @list='$(SUBDIRS)'; for subdir in $$list; do \
+ (cd $$subdir && $(MAKE) $@) || exit;\
+ done;
+ @$(MAKE) CFLAGS="$(DEBUG_CFLAGS)"
+
+install-debug: debug
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+mostlyclean-generic:
+ -rm -f *~ \#* .*~ .\#*
+
+maintainer-clean-generic:
+ -@echo "This command is intended for maintainers to use;"
+ -@echo "it deletes files that may require special tools to rebuild."
+ -rm -f Makefile.in
diff --git a/src/input/ost/README b/src/input/ost/README
new file mode 100644
index 000000000..5fc680215
--- /dev/null
+++ b/src/input/ost/README
@@ -0,0 +1,9 @@
+This directories contains header files for the Linux DVB drivers
+from convergence integrated media GmbH
+
+ Copyright (C) 2000 Ralph Metzler <ralph@convergence.de>
+ & Marcus Metzler <marcus@convergence.de>
+ for convergence integrated media GmbH
+
+released under the LGPL license. For details see the individual
+header files.
diff --git a/src/input/ost/ca.h b/src/input/ost/ca.h
new file mode 100644
index 000000000..226ef5c09
--- /dev/null
+++ b/src/input/ost/ca.h
@@ -0,0 +1,84 @@
+/*
+ * ca.h
+ *
+ * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de>
+ * & Marcus Metzler <marcus@convergence.de>
+ for convergence integrated media GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Lesser Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef _OST_CA_H_
+#define _OST_CA_H_
+
+/* slot interface types and info */
+
+typedef struct ca_slot_info_s {
+ int num; /* slot number */
+
+ int type; /* CA interface this slot supports */
+#define CA_CI 1 /* CI high level interface */
+#define CA_CI_LINK 2 /* CI link layer level interface */
+#define CA_CI_PHYS 4 /* CI physical layer level interface */
+#define CA_SC 128 /* simple smart card interface */
+
+ unsigned int flags;
+#define CA_CI_MODULE_PRESENT 1 /* module (or card) inserted */
+#define CA_CI_MODULE_READY 2
+} ca_slot_info_t;
+
+
+/* descrambler types and info */
+
+typedef struct ca_descr_info_s {
+ unsigned int num; /* number of available descramblers (keys) */
+ unsigned int type; /* type of supported scrambling system */
+#define CA_ECD 1
+#define CA_NDS 2
+#define CA_DSS 4
+} ca_descr_info_t;
+
+typedef struct ca_cap_s {
+ unsigned int slot_num; /* total number of CA card and module slots */
+ unsigned int slot_type; /* OR of all supported types */
+ unsigned int descr_num; /* total number of descrambler slots (keys) */
+ unsigned int descr_type; /* OR of all supported types */
+} ca_cap_t;
+
+/* a message to/from a CI-CAM */
+typedef struct ca_msg_s {
+ unsigned int index;
+ unsigned int type;
+ unsigned int length;
+ unsigned char msg[256];
+} ca_msg_t;
+
+typedef struct ca_descr_s {
+ unsigned int index;
+ unsigned int parity;
+ unsigned char cw[8];
+} ca_descr_t;
+
+#define CA_RESET _IOW('o', 128, int)
+#define CA_GET_CAP _IOR('o', 129, ca_cap_t *)
+#define CA_GET_SLOT_INFO _IOR('o', 130, ca_slot_info_t *)
+#define CA_GET_DESCR_INFO _IOR('o', 131, ca_descr_info_t *)
+#define CA_GET_MSG _IOR('o', 132, ca_msg_t *)
+#define CA_SEND_MSG _IOW('o', 133, ca_msg_t *)
+#define CA_SET_DESCR _IOW('o', 134, ca_descr_t *)
+
+#endif
+
diff --git a/src/input/ost/demux.h b/src/input/ost/demux.h
new file mode 100644
index 000000000..758e921b6
--- /dev/null
+++ b/src/input/ost/demux.h
@@ -0,0 +1,346 @@
+/* * demux.h * * Copyright (c) 2000 Nokia Research Center
+ * Tampere, FINLAND
+ *
+ * Project:
+ * Universal Broadcast Access
+ *
+ * Contains:
+ * Type definitions of a Linux kernel-level API for filtering MPEG-2 TS
+ * packets and MPEG-2 sections. Support for PES packet filtering will be
+ * added later.
+ *
+ * History:
+ * 12.01.2000/JPL File created - Initial version.
+ * 18.02.2000/JPL Minor corrections.
+ * 21.02.2000/JPL DMX_NAME_SIZE and dmx_in_use() removed, typos fixed,
+ * some names changed.
+ * 23.02.2000/JPL Added a parameter indicating the callback source in
+ * the callback functions.
+ * 10.03.2000/JPL Added the macros DMX_DIR_ENTRY() and DMX_FE_ENTRY().
+ * 15.03.2000/JPL Added the capabilities field to dmx_demux_t.
+ * 22.03.2000/JPL Corrected the callback parameter in the
+ * allocate_x_feed() functions.
+ * 03.04.2000/JPL Added support for optional resource conflict resolution
+ * and scarce resource handling.
+ * 05.04.2000/JPL Changed the dmx_resolve_conflict() to use resource
+ * type as a parameter.
+ * 12.04.2000/JPL Added a second buffer parameter for dmx_x_callback()
+ * functions to better handle buffer wrapping.
+ * 26.04.2000/JPL Added functions for section-level descrambling.
+ * 03.09.2000/JPL Removed support for conflict resolution and scarce
+ * resource handling. Otherwise only minor changes to
+ * data structures and function prototypes.
+ *
+ *
+ * Author:
+ * Juha-Pekka Luoma (JPL)
+ * Nokia Research Center
+ *
+ * Notes:
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+/* $Id: demux.h,v 1.1 2002/12/27 00:53:50 guenter Exp $ */
+
+#ifndef __DEMUX_H
+#define __DEMUX_H
+
+#ifndef __KERNEL__
+#define __KERNEL__
+#endif
+
+#include <linux/types.h> /* __u8, __u16, ... */
+#include <linux/list.h> /* list_entry(), struct list_head */
+#include <linux/time.h> /* struct timespec */
+#include <linux/errno.h> /* Function return values */
+
+/*--------------------------------------------------------------------------*/
+/* Common definitions */
+/*--------------------------------------------------------------------------*/
+
+/*
+ * DMX_MAX_FILTER_SIZE: Maximum length (in bytes) of a section/PES filter.
+ */
+
+#ifndef DMX_MAX_FILTER_SIZE
+#define DMX_MAX_FILTER_SIZE 18
+#endif
+/*
+ * dmx_success_t: Success codes for the Demux Callback API.
+ */
+
+typedef enum {
+ DMX_OK = 0, /* Received Ok */
+ DMX_LENGTH_ERROR, /* Incorrect length */
+ DMX_OVERRUN_ERROR, /* Receiver ring buffer overrun */
+ DMX_CRC_ERROR, /* Incorrect CRC */
+ DMX_FRAME_ERROR, /* Frame alignment error */
+ DMX_FIFO_ERROR, /* Receiver FIFO overrun */
+ DMX_MISSED_ERROR /* Receiver missed packet */
+} dmx_success_t;
+
+/*--------------------------------------------------------------------------*/
+/* TS packet reception */
+/*--------------------------------------------------------------------------*/
+
+/* TS filter type for set_type() */
+
+#define TS_PACKET 1 /* send TS packets (188 bytes) to callback (default) */
+#define TS_PAYLOAD_ONLY 2 /* in case TS_PACKET is set, only send the TS
+ payload (<=184 bytes per packet) to callback */
+#define TS_DECODER 4 /* send stream to built-in decoder (if present) */
+
+/* PES type for filters which write to built-in decoder */
+/* these should be kept identical to the types in dmx.h */
+
+typedef enum
+{
+ DMX_TS_PES_AUDIO, /* also send packets to audio decoder (if it exists) */
+ DMX_TS_PES_VIDEO, /* ... */
+ DMX_TS_PES_TELETEXT,
+ DMX_TS_PES_SUBTITLE,
+ DMX_TS_PES_PCR,
+ DMX_TS_PES_OTHER,
+} dmx_ts_pes_t;
+
+
+struct dmx_ts_feed_s {
+ int is_filtering; /* Set to non-zero when filtering in progress */
+ struct dmx_demux_s* parent; /* Back-pointer */
+ void* priv; /* Pointer to private data of the API client */
+ int (*set) (struct dmx_ts_feed_s* feed,
+ __u16 pid,
+ size_t callback_length,
+ size_t circular_buffer_size,
+ int descramble,
+ struct timespec timeout);
+ int (*start_filtering) (struct dmx_ts_feed_s* feed);
+ int (*stop_filtering) (struct dmx_ts_feed_s* feed);
+ int (*set_type) (struct dmx_ts_feed_s* feed,
+ int type,
+ dmx_ts_pes_t pes_type);
+};
+
+typedef struct dmx_ts_feed_s dmx_ts_feed_t;
+
+/*--------------------------------------------------------------------------*/
+/* PES packet reception (not supported yet) */
+/*--------------------------------------------------------------------------*/
+
+typedef struct dmx_pes_filter_s {
+ struct dmx_pes_s* parent; /* Back-pointer */
+ void* priv; /* Pointer to private data of the API client */
+} dmx_pes_filter_t;
+
+typedef struct dmx_pes_feed_s {
+ int is_filtering; /* Set to non-zero when filtering in progress */
+ struct dmx_demux_s* parent; /* Back-pointer */
+ void* priv; /* Pointer to private data of the API client */
+ int (*set) (struct dmx_pes_feed_s* feed,
+ __u16 pid,
+ size_t circular_buffer_size,
+ int descramble,
+ struct timespec timeout);
+ int (*start_filtering) (struct dmx_pes_feed_s* feed);
+ int (*stop_filtering) (struct dmx_pes_feed_s* feed);
+ int (*allocate_filter) (struct dmx_pes_feed_s* feed,
+ dmx_pes_filter_t** filter);
+ int (*release_filter) (struct dmx_pes_feed_s* feed,
+ dmx_pes_filter_t* filter);
+} dmx_pes_feed_t;
+
+/*--------------------------------------------------------------------------*/
+/* Section reception */
+/*--------------------------------------------------------------------------*/
+
+typedef struct {
+ __u8 filter_value [DMX_MAX_FILTER_SIZE];
+ __u8 filter_mask [DMX_MAX_FILTER_SIZE];
+ struct dmx_section_feed_s* parent; /* Back-pointer */
+ void* priv; /* Pointer to private data of the API client */
+} dmx_section_filter_t;
+
+struct dmx_section_feed_s {
+ int is_filtering; /* Set to non-zero when filtering in progress */
+ struct dmx_demux_s* parent; /* Back-pointer */
+ void* priv; /* Pointer to private data of the API client */
+ int (*set) (struct dmx_section_feed_s* feed,
+ __u16 pid,
+ size_t circular_buffer_size,
+ int descramble,
+ int check_crc);
+ int (*allocate_filter) (struct dmx_section_feed_s* feed,
+ dmx_section_filter_t** filter);
+ int (*release_filter) (struct dmx_section_feed_s* feed,
+ dmx_section_filter_t* filter);
+ int (*start_filtering) (struct dmx_section_feed_s* feed);
+ int (*stop_filtering) (struct dmx_section_feed_s* feed);
+};
+typedef struct dmx_section_feed_s dmx_section_feed_t;
+
+/*--------------------------------------------------------------------------*/
+/* Callback functions */
+/*--------------------------------------------------------------------------*/
+
+typedef int (*dmx_ts_cb) ( __u8 * buffer1,
+ size_t buffer1_length,
+ __u8 * buffer2,
+ size_t buffer2_length,
+ dmx_ts_feed_t* source,
+ dmx_success_t success);
+
+typedef int (*dmx_section_cb) ( __u8 * buffer1,
+ size_t buffer1_len,
+ __u8 * buffer2,
+ size_t buffer2_len,
+ dmx_section_filter_t * source,
+ dmx_success_t success);
+
+typedef int (*dmx_pes_cb) ( __u8 * buffer1,
+ size_t buffer1_len,
+ __u8 * buffer2,
+ size_t buffer2_len,
+ dmx_pes_filter_t* source,
+ dmx_success_t success);
+
+/*--------------------------------------------------------------------------*/
+/* DVB Front-End */
+/*--------------------------------------------------------------------------*/
+
+typedef enum {
+ DMX_OTHER_FE = 0,
+ DMX_SATELLITE_FE,
+ DMX_CABLE_FE,
+ DMX_TERRESTRIAL_FE,
+ DMX_LVDS_FE,
+ DMX_ASI_FE, /* DVB-ASI interface */
+ DMX_MEMORY_FE
+} dmx_frontend_source_t;
+
+typedef struct {
+ /* The following char* fields point to NULL terminated strings */
+ char* id; /* Unique front-end identifier */
+ char* vendor; /* Name of the front-end vendor */
+ char* model; /* Name of the front-end model */
+ struct list_head connectivity_list; /* List of front-ends that can
+ be connected to a particular
+ demux */
+ void* priv; /* Pointer to private data of the API client */
+ dmx_frontend_source_t source;
+} dmx_frontend_t;
+
+/*--------------------------------------------------------------------------*/
+/* MPEG-2 TS Demux */
+/*--------------------------------------------------------------------------*/
+
+/*
+ * Flags OR'ed in the capabilites field of struct dmx_demux_s.
+ */
+
+#define DMX_TS_FILTERING 1
+#define DMX_PES_FILTERING 2
+#define DMX_SECTION_FILTERING 4
+#define DMX_MEMORY_BASED_FILTERING 8 /* write() available */
+#define DMX_CRC_CHECKING 16
+#define DMX_TS_DESCRAMBLING 32
+#define DMX_SECTION_PAYLOAD_DESCRAMBLING 64
+#define DMX_MAC_ADDRESS_DESCRAMBLING 128
+
+/*
+ * Demux resource type identifier.
+*/
+
+/*
+ * DMX_FE_ENTRY(): Casts elements in the list of registered
+ * front-ends from the generic type struct list_head
+ * to the type * dmx_frontend_t
+ *.
+*/
+
+#define DMX_FE_ENTRY(list) list_entry(list, dmx_frontend_t, connectivity_list)
+
+struct dmx_demux_s {
+ /* The following char* fields point to NULL terminated strings */
+ char* id; /* Unique demux identifier */
+ char* vendor; /* Name of the demux vendor */
+ char* model; /* Name of the demux model */
+ __u32 capabilities; /* Bitfield of capability flags */
+ dmx_frontend_t* frontend; /* Front-end connected to the demux */
+ struct list_head reg_list; /* List of registered demuxes */
+ void* priv; /* Pointer to private data of the API client */
+ int users; /* Number of users */
+ int (*open) (struct dmx_demux_s* demux);
+ int (*close) (struct dmx_demux_s* demux);
+ int (*write) (struct dmx_demux_s* demux, const char* buf, size_t count);
+ int (*allocate_ts_feed) (struct dmx_demux_s* demux,
+ dmx_ts_feed_t** feed,
+ dmx_ts_cb callback);
+ int (*release_ts_feed) (struct dmx_demux_s* demux,
+ dmx_ts_feed_t* feed);
+ int (*allocate_pes_feed) (struct dmx_demux_s* demux,
+ dmx_pes_feed_t** feed,
+ dmx_pes_cb callback);
+ int (*release_pes_feed) (struct dmx_demux_s* demux,
+ dmx_pes_feed_t* feed);
+ int (*allocate_section_feed) (struct dmx_demux_s* demux,
+ dmx_section_feed_t** feed,
+ dmx_section_cb callback);
+ int (*release_section_feed) (struct dmx_demux_s* demux,
+ dmx_section_feed_t* feed);
+ int (*descramble_mac_address) (struct dmx_demux_s* demux,
+ __u8* buffer1,
+ size_t buffer1_length,
+ __u8* buffer2,
+ size_t buffer2_length,
+ __u16 pid);
+ int (*descramble_section_payload) (struct dmx_demux_s* demux,
+ __u8* buffer1,
+ size_t buffer1_length,
+ __u8* buffer2, size_t buffer2_length,
+ __u16 pid);
+ int (*add_frontend) (struct dmx_demux_s* demux,
+ dmx_frontend_t* frontend);
+ int (*remove_frontend) (struct dmx_demux_s* demux,
+ dmx_frontend_t* frontend);
+ struct list_head* (*get_frontends) (struct dmx_demux_s* demux);
+ int (*connect_frontend) (struct dmx_demux_s* demux,
+ dmx_frontend_t* frontend);
+ int (*disconnect_frontend) (struct dmx_demux_s* demux);
+
+
+ /* added because js cannot keep track of these himself */
+ int (*get_pes_pids) (struct dmx_demux_s* demux, __u16 *pids);
+};
+typedef struct dmx_demux_s dmx_demux_t;
+
+/*--------------------------------------------------------------------------*/
+/* Demux directory */
+/*--------------------------------------------------------------------------*/
+
+/*
+ * DMX_DIR_ENTRY(): Casts elements in the list of registered
+ * demuxes from the generic type struct list_head* to the type dmx_demux_t
+ *.
+ */
+
+#define DMX_DIR_ENTRY(list) list_entry(list, dmx_demux_t, reg_list)
+
+int dmx_register_demux (dmx_demux_t* demux);
+int dmx_unregister_demux (dmx_demux_t* demux);
+struct list_head* dmx_get_demuxes (void);
+
+#endif /* #ifndef __DEMUX_H */
+
diff --git a/src/input/ost/dmx.h b/src/input/ost/dmx.h
new file mode 100644
index 000000000..9c4bb6b6d
--- /dev/null
+++ b/src/input/ost/dmx.h
@@ -0,0 +1,141 @@
+/*
+ * dmx.h
+ *
+ * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de>
+ * & Ralph Metzler <ralph@convergence.de>
+ for convergence integrated media GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef _OST_DMX_H_
+#define _OST_DMX_H_
+
+#ifdef __KERNEL__
+#include <linux/types.h>
+#else
+#include <stdint.h>
+#endif
+
+#ifndef EBUFFEROVERFLOW
+#define EBUFFEROVERFLOW 769
+#endif
+
+/* pid_t conflicts with linux/include/linux/types.h !!!*/
+
+typedef uint16_t dvb_pid_t;
+
+#define DMX_FILTER_SIZE 16
+
+typedef enum
+{
+ DMX_OUT_DECODER, /* Streaming directly to decoder. */
+ DMX_OUT_TAP, /* Output going to a memory buffer */
+ /* (to be retrieved via the read command).*/
+ DMX_OUT_TS_TAP /* Output multiplexed into a new TS */
+ /* (to be retrieved by reading from the */
+ /* logical DVR device). */
+} dmxOutput_t;
+
+
+typedef enum
+{
+ DMX_IN_FRONTEND, /* Input from a front-end device. */
+ DMX_IN_DVR /* Input from the logical DVR device. */
+} dmxInput_t;
+
+
+typedef enum
+{
+ DMX_PES_AUDIO,
+ DMX_PES_VIDEO,
+ DMX_PES_TELETEXT,
+ DMX_PES_SUBTITLE,
+ DMX_PES_PCR,
+ DMX_PES_OTHER
+} dmxPesType_t;
+
+
+typedef enum
+{
+ DMX_SCRAMBLING_EV,
+ DMX_FRONTEND_EV
+} dmxEvent_t;
+
+
+typedef enum
+{
+ DMX_SCRAMBLING_OFF,
+ DMX_SCRAMBLING_ON
+} dmxScramblingStatus_t;
+
+
+typedef struct dmxFilter
+{
+ uint8_t filter[DMX_FILTER_SIZE];
+ uint8_t mask[DMX_FILTER_SIZE];
+} dmxFilter_t;
+
+
+struct dmxFrontEnd
+{
+ /*TBD tbd; */
+};
+
+
+struct dmxSctFilterParams
+{
+ dvb_pid_t pid;
+ dmxFilter_t filter;
+ uint32_t timeout;
+ uint32_t flags;
+#define DMX_CHECK_CRC 1
+#define DMX_ONESHOT 2
+#define DMX_IMMEDIATE_START 4
+#define DMX_KERNEL_CLIENT 0x8000
+};
+
+
+struct dmxPesFilterParams
+{
+ dvb_pid_t pid;
+ dmxInput_t input;
+ dmxOutput_t output;
+ dmxPesType_t pesType;
+ uint32_t flags;
+};
+
+
+struct dmxEvent
+{
+ dmxEvent_t event;
+ time_t timeStamp;
+ union
+ {
+ dmxScramblingStatus_t scrambling;
+ } u;
+};
+
+
+#define DMX_START _IOW('o',41,int)
+#define DMX_STOP _IOW('o',42,int)
+#define DMX_SET_FILTER _IOW('o',43,struct dmxSctFilterParams *)
+#define DMX_SET_PES_FILTER _IOW('o',44,struct dmxPesFilterParams *)
+#define DMX_SET_BUFFER_SIZE _IOW('o',45,unsigned long)
+#define DMX_GET_EVENT _IOR('o',46,struct dmxEvent *)
+#define DMX_GET_PES_PIDS _IOR('o',47,dvb_pid_t *)
+
+#endif /*_OST_DMX_H_*/
diff --git a/src/input/ost/frontend.h b/src/input/ost/frontend.h
new file mode 100644
index 000000000..57fb69e83
--- /dev/null
+++ b/src/input/ost/frontend.h
@@ -0,0 +1,208 @@
+/*
+ * frontend.h
+ *
+ * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de>
+ * & Ralph Metzler <ralph@convergence.de>
+ * for convergence integrated media GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef _FRONTEND_H_
+#define _FRONTEND_H_
+
+#include <asm/types.h>
+
+
+#define ENOSIGNAL 768
+#ifndef EBUFFEROVERFLOW
+#define EBUFFEROVERFLOW 769
+#endif
+
+
+typedef __u32 FrontendStatus;
+
+/* bit definitions for FrontendStatus */
+#define FE_HAS_POWER 1
+#define FE_HAS_SIGNAL 2
+#define FE_SPECTRUM_INV 4
+#define FE_HAS_LOCK 8
+#define FE_HAS_CARRIER 16
+#define FE_HAS_VITERBI 32
+#define FE_HAS_SYNC 64
+#define FE_TUNER_HAS_LOCK 128
+
+
+/* possible values for spectral inversion */
+typedef enum {
+ INVERSION_OFF,
+ INVERSION_ON,
+ INVERSION_AUTO
+} SpectralInversion;
+
+/* possible values for FEC_inner/FEC_outer */
+typedef enum {
+ FEC_AUTO,
+ FEC_1_2,
+ FEC_2_3,
+ FEC_3_4,
+ FEC_5_6,
+ FEC_7_8,
+ FEC_NONE
+} CodeRate;
+
+
+typedef enum {
+ QPSK,
+ QAM_16,
+ QAM_32,
+ QAM_64,
+ QAM_128,
+ QAM_256
+} Modulation;
+
+
+typedef enum {
+ TRANSMISSION_MODE_2K,
+ TRANSMISSION_MODE_8K
+} TransmitMode;
+
+typedef enum {
+ BANDWIDTH_8_MHZ,
+ BANDWIDTH_7_MHZ,
+ BANDWIDTH_6_MHZ
+} BandWidth;
+
+
+typedef enum {
+ GUARD_INTERVAL_1_32,
+ GUARD_INTERVAL_1_16,
+ GUARD_INTERVAL_1_8,
+ GUARD_INTERVAL_1_4
+} GuardInterval;
+
+
+typedef enum {
+ HIERARCHY_NONE,
+ HIERARCHY_1,
+ HIERARCHY_2,
+ HIERARCHY_4
+} Hierarchy;
+
+
+typedef struct {
+ __u32 SymbolRate; /* symbol rate in Symbols per second */
+ CodeRate FEC_inner; /* forward error correction (see above) */
+} QPSKParameters;
+
+
+typedef struct {
+ __u32 SymbolRate; /* symbol rate in Symbols per second */
+ CodeRate FEC_inner; /* forward error correction (see above) */
+ Modulation QAM; /* modulation type (see above) */
+} QAMParameters;
+
+
+typedef struct {
+ BandWidth bandWidth;
+ CodeRate HP_CodeRate; /* high priority stream code rate */
+ CodeRate LP_CodeRate; /* low priority stream code rate */
+ Modulation Constellation; /* modulation type (see above) */
+ TransmitMode TransmissionMode;
+ GuardInterval guardInterval;
+ Hierarchy HierarchyInformation;
+} OFDMParameters;
+
+
+typedef enum {
+ FE_QPSK,
+ FE_QAM,
+ FE_OFDM
+} FrontendType;
+
+
+typedef struct {
+ __u32 Frequency; /* (absolute) frequency in Hz for QAM/OFDM */
+ /* intermediate frequency in kHz for QPSK */
+ SpectralInversion Inversion; /* spectral inversion */
+ union {
+ QPSKParameters qpsk;
+ QAMParameters qam;
+ OFDMParameters ofdm;
+ } u;
+} FrontendParameters;
+
+
+typedef enum {
+ FE_UNEXPECTED_EV, /* unexpected event (e.g. loss of lock) */
+ FE_COMPLETION_EV, /* completion event, tuning succeeded */
+ FE_FAILURE_EV /* failure event, we couldn't tune */
+} EventType;
+
+
+typedef struct {
+ EventType type; /* type of event, FE_UNEXPECTED_EV, ... */
+
+ long timestamp; /* time in seconds since 1970-01-01 */
+
+ union {
+ struct {
+ FrontendStatus previousStatus; /* status before event */
+ FrontendStatus currentStatus; /* status during event */
+ } unexpectedEvent;
+ FrontendParameters completionEvent; /* parameters for which the
+ tuning succeeded */
+ FrontendStatus failureEvent; /* status at failure (e.g. no lock) */
+ } u;
+} FrontendEvent;
+
+typedef struct {
+ FrontendType type;
+ __u32 minFrequency;
+ __u32 maxFrequency;
+ __u32 maxSymbolRate;
+ __u32 minSymbolRate;
+ __u32 hwType;
+ __u32 hwVersion;
+} FrontendInfo;
+
+
+typedef enum {
+ FE_POWER_ON,
+ FE_POWER_STANDBY,
+ FE_POWER_SUSPEND,
+ FE_POWER_OFF
+} FrontendPowerState;
+
+
+#define FE_SELFTEST _IO('o', 61)
+#define FE_SET_POWER_STATE _IOW('o', 62, FrontendPowerState)
+#define FE_GET_POWER_STATE _IOR('o', 63, FrontendPowerState*)
+#define FE_READ_STATUS _IOR('o', 64, FrontendStatus*)
+#define FE_READ_BER _IOW('o', 65, __u32*)
+#define FE_READ_SIGNAL_STRENGTH _IOR('o', 66, __s32*)
+#define FE_READ_SNR _IOR('o', 67, __s32*)
+#define FE_READ_UNCORRECTED_BLOCKS _IOW('o', 68, __u32*)
+#define FE_GET_NEXT_FREQUENCY _IOW('o', 69, __u32*)
+#define FE_GET_NEXT_SYMBOL_RATE _IOW('o', 70, __u32*)
+
+#define FE_SET_FRONTEND _IOW('o', 71, FrontendParameters*)
+#define FE_GET_FRONTEND _IOR('o', 72, FrontendParameters*)
+#define FE_GET_INFO _IOR('o', 73, FrontendInfo*)
+#define FE_GET_EVENT _IOR('o', 74, FrontendEvent*)
+
+#endif /*_FRONTEND_H_*/
+
diff --git a/src/input/ost/sec.h b/src/input/ost/sec.h
new file mode 100644
index 000000000..8863df268
--- /dev/null
+++ b/src/input/ost/sec.h
@@ -0,0 +1,118 @@
+/*
+ * sec.h
+ *
+ * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de>
+ * & Marcus Metzler <marcus@convergence.de>
+ for convergence integrated media GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef _OST_SEC_H_
+#define _OST_SEC_H_
+
+#define SEC_MAX_DISEQC_PARAMS 3
+
+struct secDiseqcCmd {
+ uint8_t addr;
+ uint8_t cmd;
+ uint8_t numParams;
+ uint8_t params[SEC_MAX_DISEQC_PARAMS];
+};
+
+typedef uint32_t secVoltage;
+
+enum {
+ SEC_VOLTAGE_OFF,
+ SEC_VOLTAGE_LT,
+ SEC_VOLTAGE_13,
+ SEC_VOLTAGE_13_5,
+ SEC_VOLTAGE_18,
+ SEC_VOLTAGE_18_5
+};
+
+#define SEC_VOLTAGE_HORIZONTAL SEC_VOLTAGE_18
+#define SEC_VOLTAGE_VERTICAL SEC_VOLTAGE_13
+
+typedef uint32_t secToneMode;
+
+typedef enum {
+ SEC_TONE_ON,
+ SEC_TONE_OFF
+} secToneMode_t;
+
+
+typedef uint32_t secMiniCmd;
+
+typedef enum {
+ SEC_MINI_NONE,
+ SEC_MINI_A,
+ SEC_MINI_B
+} secMiniCmd_t;
+
+struct secStatus {
+ int32_t busMode;
+ secVoltage selVolt;
+ secToneMode contTone;
+};
+
+enum {
+ SEC_BUS_IDLE,
+ SEC_BUS_BUSY,
+ SEC_BUS_OFF,
+ SEC_BUS_OVERLOAD
+};
+
+struct secCommand {
+ int32_t type;
+ union {
+ struct secDiseqcCmd diseqc;
+ uint8_t vsec;
+ uint32_t pause;
+ } u;
+};
+
+struct secCmdSequence {
+ secVoltage voltage;
+ secMiniCmd miniCommand;
+ secToneMode continuousTone;
+
+ uint32_t numCommands;
+ struct secCommand* commands;
+};
+
+enum {
+ SEC_CMDTYPE_DISEQC,
+ SEC_CMDTYPE_VSEC,
+ SEC_CMDTYPE_PAUSE
+};
+
+
+#define SEC_GET_STATUS _IOR('o',91,struct secStatus *)
+#define SEC_RESET_OVERLOAD _IOW('o',92,void)
+#define SEC_SEND_SEQUENCE _IOW('o',93,struct secCmdSequence *)
+#define SEC_SET_TONE _IOW('o',94,secToneMode)
+#define SEC_SET_VOLTAGE _IOW('o',95,secVoltage)
+
+typedef enum {
+ SEC_DISEQC_SENT,
+ SEC_VSEC_SENT,
+ SEC_PAUSE_COMPLETE,
+ SEC_CALLBACK_ERROR
+} secCallback_t;
+
+
+#endif /*_OST_SEC_H_*/
diff --git a/src/xine-engine/audio_decoder.c b/src/xine-engine/audio_decoder.c
index b5c8bf79c..104539871 100644
--- a/src/xine-engine/audio_decoder.c
+++ b/src/xine-engine/audio_decoder.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: audio_decoder.c,v 1.95 2002/12/26 21:53:42 miguelfreitas Exp $
+ * $Id: audio_decoder.c,v 1.96 2002/12/27 00:53:50 guenter Exp $
*
*
* functions that implement audio decoding
@@ -195,7 +195,8 @@ void *audio_decoder_loop (void *stream_gen) {
while ( (i<stream->audio_track_map_entries) && (stream->audio_track_map[i]<buf->type) )
i++;
- if ( (i==stream->audio_track_map_entries) || (stream->audio_track_map[i] != buf->type) ) {
+ if ( (i==stream->audio_track_map_entries)
+ || (stream->audio_track_map[i] != buf->type) ) {
j = stream->audio_track_map_entries;
while (j>i) {
@@ -208,12 +209,23 @@ void *audio_decoder_loop (void *stream_gen) {
/* find out which audio type to decode */
+#ifdef LOG
+ printf ("audio_decoder: audio_channel_user = %d, map[0]=%08x\n",
+ stream->audio_channel_user,
+ stream->audio_track_map[0]);
+#endif
+
if (stream->audio_channel_user > -2) {
if (stream->audio_channel_user == -1) {
/* auto */
+#ifdef LOG
+ printf ("audio_decoder: audio_channel_auto = %d\n",
+ stream->audio_channel_auto);
+#endif
+
if (stream->audio_channel_auto>=0) {
if ((buf->type & 0xFF) == stream->audio_channel_auto) {
@@ -311,7 +323,7 @@ void audio_decoder_init (xine_stream_t *stream) {
*/
stream->audio_fifo = fifo_buffer_new (230, 8192);
stream->audio_channel_user = -1;
- stream->audio_channel_auto = 0;
+ stream->audio_channel_auto = -1;
stream->audio_track_map_entries = 0;
stream->audio_type = 0;
diff --git a/src/xine-engine/xine.c b/src/xine-engine/xine.c
index 1d1816eb4..063333178 100644
--- a/src/xine-engine/xine.c
+++ b/src/xine-engine/xine.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xine.c,v 1.203 2002/12/26 21:53:42 miguelfreitas Exp $
+ * $Id: xine.c,v 1.204 2002/12/27 00:53:50 guenter Exp $
*
* top-level xine functions
*
@@ -309,7 +309,7 @@ xine_stream_t *xine_stream_new (xine_t *this,
stream->spu_decoder_streamtype = -1;
stream->audio_out = ao;
stream->audio_channel_user = -1;
- stream->audio_channel_auto = 0;
+ stream->audio_channel_auto = -1;
stream->audio_decoder_plugin = NULL;
stream->audio_decoder_streamtype = -1;
stream->spu_channel_auto = -1;