summaryrefslogtreecommitdiff
path: root/Tools/statdvb2vdr/ch.pl
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/statdvb2vdr/ch.pl')
-rw-r--r--Tools/statdvb2vdr/ch.pl250
1 files changed, 250 insertions, 0 deletions
diff --git a/Tools/statdvb2vdr/ch.pl b/Tools/statdvb2vdr/ch.pl
new file mode 100644
index 0000000..91e918d
--- /dev/null
+++ b/Tools/statdvb2vdr/ch.pl
@@ -0,0 +1,250 @@
+#!/usr/bin/perl
+
+# Reads the file statdvb.dat produced by the Siemens windows
+# software (1.50), which contains the scanned channels of an
+# DVB-C (-S). The file ist located in the windows directory.
+#
+# Output is suitable for VDR (channels.conf). Only tested for
+# the cable version. Should work with slight modifications for
+# the sat version.
+#
+# 8. März 2001 - Hans-Peter Raschke
+
+
+# file structure derived from "DvbGlobalDef.h" of the Siemens
+# DVB kit.
+
+# typedef int TABLETYPE;
+# enum TunStandard
+# {
+# PAL_BG, //B/G stereo or mono
+# PAL_I, //I mono (with Nicam stereo)
+# PAL_DK, //D/K mono
+# SECAM_L, //L mono (with Nicam stereo)
+# SECAM_LI, //Secam L’ (with Nicam stereo)
+# SECAM_DK,
+# SECAM_BG,
+# NTSC_M,
+# DVB_C,
+# DVB_S,
+# DVB_T
+# };
+#
+# typedef struct TunProgDataTag //xx bytes+1string
+# {
+# int nNumber; //logical number of the program
+# DWORD dwFrequency; //frequency in khz
+# CString csName; //name of the program
+# TunStandard eStandard; //standard of the program
+# DWORD dwExtraInfo; //specific info, like teletext,reserved data
+# //0x8 == external input 1-CVBS
+# //0x10 == external input 2-Y/C
+# //0x20 == scrambled Program stream
+# //0x40 == ASTRA Sattable
+# //0x80 == Eutelsat Sattable
+# //0xC0 == Sattable from File
+# //0x100 == Pulsed switch to other satellite dish
+# //0x1000-0xF000 = Other Satellite Nr(if Sattable from File)
+# //Digital only params beginning from here
+# WORD ProgNr; //DVB Nr for the prog (PAS related)
+# WORD wTS_ID; //Transport-Stream ID orig.
+# WORD wNW_ID; //Network ID orig.
+# WORD wService_ID; //Service /Programm Id
+# BYTE nModulation; //Modulation-Type QAM,QPSK,other
+# BYTE nFEC_outerinner; //outer(high nibble) and inner(low n.)
+# DWORD dwSymbolrate; //in symbol/s
+# BOOL b22kHz; //east or west(TRUE) position in Sat
+# BOOL bVertical_pos; //horizontal or vertical(TRUE) position in SAT
+# BYTE nProgtype; //type of service (e.g. tv, radio)
+# WORD wVideo_PID; //video-pid of the channel
+# WORD wAudio_PID; //audio-pid of the channel
+# WORD wPMT_PID; //PID of the associated PMT
+# WORD wTxt_PID; //teletext PID for the program
+# WORD wSubtitling_PID; //subtitling PID for the program
+# WORD wData_PID; //PID for data broadcast
+# BYTE nIPFilter; //filter for different ip's
+# DWORD dwReserved1; //Shows some extended Information LOWORD=DataBroadcast_Id,
+# //MSB showing Databroadcast, (HIWORD & 0xFF)=ComponentTag from the stream ident desc
+# DWORD dwReserved2; //reserved dword
+# }DVBTunProgData;
+#
+
+use strict;
+use FileHandle;
+
+# for a full dump
+my @varNames = ("nNumber", # logical number of the program
+ "dwFrequency", # frequency in khz
+ "csName", # name of the program
+ "eStandard", # standard of the program
+ "dwExtraInfo", # specific info, like teletext,reserved data
+ # 0x8 == external input 1-CVBS
+ # 0x10 == external input 2-Y/C
+ # 0x20 == scrambled Program stream
+ # 0x40 == ASTRA Sattable
+ # 0x80 == Eutelsat Sattable
+ # 0xC0 == Sattable from File
+ # 0x100 == Pulsed switch to other satellite dish
+ # 0x1000-0xF000 = Other Satellite Nr(if Sattable from File)
+ "ProgNr", # DVB Nr for the prog (PAS related)
+ "wTS_ID", # Transport-Stream ID orig.
+ "wNW_ID", # Network ID orig.
+ "wService_ID", # Service /Programm Id
+ "nModulation", # Modulation-Type QAM,QPSK,other
+ "nFEC_outerinner", # outer(high nibble) and inner(low n.)
+ "dwSymbolrate", # in symbol/s
+ "b22kHz", # east or west(TRUE) position in Sat
+ "bVertical_pos", # horizontal or vertical(TRUE) position in SAT
+ "nProgtype", # type of service (e.g. tv, radio)
+ "wVideo_PID", # video-pid of the channel
+ "wAudio_PID", # audio-pid of the channel
+ "wPMT_PID", # PID of the associated PMT
+ "wTxt_PID", # teletext PID for the program
+ "wSubtitling_PID", # subtitling PID for the program
+ "wData_PID"); # PID for data broadcast
+
+my @outVar = ("csName",
+ "dwFrequency",
+ "bVertical_pos",
+ "b22kHz",
+ "dwSymbolrate",
+ "wVideo_PID",
+ "wAudio_PID",
+ "wTxt_PID",
+ "dwExtraInfo",
+ "ProgNr");
+
+# channels that need a valid smartcard
+my @addCrypted = ("Extreme Sport",
+ "Bloomberg",
+ "Fashion TV",
+ "BET ON JAZZ",
+ "LANDSCAPE",
+ "Einstein",
+ "Single TV");
+
+my @chNames = (); # list of scanned channels
+my $camNo = 1; # number of CI/CAM to use
+my %chData; # all channel data
+my $buff; # input buffer
+my $fh = new FileHandle("$ARGV[0]") or die "Datei $ARGV[0] nicht gefunden!";
+
+binmode($fh); # could be run on windows
+$fh->seek(4, 0); # skip id
+
+my $chCnt = 0;
+while (!$fh->eof()) {
+ $chCnt++;
+
+ last if ($fh->read($buff, 7) != 7);
+ my ($nNumber,
+ $dwFrequency,
+ $sLen
+ ) = unpack("SLC", $buff);
+
+ last if ($fh->read($buff, $sLen) != $sLen);
+ my ($csName) = unpack("A$sLen", $buff);
+ $csName =~ s/:/./g;
+ $csName =~ s/^\s+//;
+ $csName =~ s/\s+$//;
+
+ last if ($fh->read($buff, 54) != 54);
+ my ($eStandard,
+ $dwExtraInfo,
+ $ProgNr,
+ $wTS_ID,
+ $wNW_ID,
+ $wService_ID,
+ $nModulation,
+ $nFEC_outerinner,
+ $dwSymbolrate,
+ $b22kHz,
+ $bVertical_pos,
+ $nProgtype,
+ $wVideo_PID,
+ $wAudio_PID,
+ $wPMT_PID,
+ $wTxt_PID,
+ $wSubtitling_PID,
+ $wData_PID
+ ) = unpack("LLSSSSCCLLLCSSSSSS", $buff);
+
+ # some modifications for VDR
+ $dwFrequency /= 1000;
+ $bVertical_pos = $bVertical_pos ? "v" : "h";
+ $dwSymbolrate /= 1000;
+ $dwExtraInfo = ($dwExtraInfo == 32 || grep(($_ cmp $csName) == 0, @addCrypted)) ? $camNo : 0;
+
+ my $x = 1;
+ my $orgName = $csName;
+ while (exists($chData{$csName})) {
+ $csName = "$orgName" . "_$x";
+ $x++;
+ }
+ push(@chNames, $csName);
+
+ my %tmp = ("nNumber" => $nNumber,
+ "dwFrequency" => $dwFrequency,
+ "csName" => $orgName,
+ "eStandard" => $eStandard,
+ "dwExtraInfo" => $dwExtraInfo,
+ "ProgNr" => $ProgNr,
+ "wTS_ID" => $wTS_ID,
+ "wNW_ID" => $wNW_ID,
+ "wService_ID" => $wService_ID,
+ "nModulation" => $nModulation,
+ "nFEC_outerinner" => $nFEC_outerinner,
+ "dwSymbolrate" => $dwSymbolrate,
+ "b22kHz" => $b22kHz,
+ "bVertical_pos" => $bVertical_pos,
+ "nProgtype" => $nProgtype,
+ "wVideo_PID" => $wVideo_PID,
+ "wAudio_PID" => $wAudio_PID,
+ "wPMT_PID" => $wPMT_PID,
+ "wTxt_PID" => $wTxt_PID,
+ "wSubtitling_PID" => $wSubtitling_PID,
+ "wData_PID" => $wData_PID);
+ $chData{$csName} = {%tmp};
+}
+
+print STDERR "$chCnt channels found!\n";
+
+# now we print the channels.conf
+# crypted TV
+print ":verschlüsselte Fernsehprogramme\n";
+for my $n (@chNames) {
+ my %tmp = %{$chData{$n}};
+ printChannel($chData{$n}) if ($tmp{"nProgtype"} == 1 && $tmp{"dwExtraInfo"});
+}
+
+# TV
+print ":Fernsehprogramme\n";
+for my $n (@chNames) {
+ my %tmp = %{$chData{$n}};
+ printChannel($chData{$n}) if ($tmp{"nProgtype"} == 1 && !$tmp{"dwExtraInfo"});
+}
+
+# crypted radio
+print ":verschlüsselte Radioprogramme\n";
+for my $n (@chNames) {
+ my %tmp = %{$chData{$n}};
+ printChannel($chData{$n}) if ($tmp{"nProgtype"} == 2 && $tmp{"dwExtraInfo"});
+}
+
+# radio
+print ":Radioprogramme\n";
+for my $n (@chNames) {
+ my %tmp = %{$chData{$n}};
+ printChannel($chData{$n}) if ($tmp{"nProgtype"} == 2 && !$tmp{"dwExtraInfo"});
+}
+
+sub printChannel {
+ my $p = shift;
+ my @tmp = ();
+
+ for my $n (@outVar) {
+ push(@tmp, ${$p}{$n});
+ }
+
+ print join(":", @tmp), "\n";
+}