Version 1.3.2

- Fixed resetting the EPG data versions after changing the preferred languages
  (thanks to Teemu Rantanen for reporting this one and helping to debug it).
- Added LinkageDescriptor handling to 'libsi' (thanks to Marcel Wiesweg).
- Added Russian language texts (thanks to Vyacheslav Dikonov).
  Plugin authors may want to add the new entries to their I18N texts and contact
  the translators to have their texts translated. Note that there are now 17
  different OSD languages, so please make sure you have 17 versions for each of
  your texts.
- Some corrections and additions to the Finnish OSD texts (thanks to Rolf
  Ahrenberg and Niko Tarnanen).
- Fixed a wrong 'delta' value in the call to the shutdown script (thanks to
  Stephan Epstein for reporting this one).
- Activated detection of radio channels (to avoid reports about "channels not
  being detected that used to be detected with the 'scan' utility or the
  original 'autopid' patch ;-).
- Channels with a zero VPID no longer write a PPID into channels.conf.
- Short channel names are now only stored if they actually differ from the
  full name.
- The EPG scan now scans newly found transponders together with already existing
  ones.
- The "Red" button in the "Setup/EPG" menu can now be used to force an EPG
  scan on a single DVB card system (see MANUAL for details).
- The new SVDRP command 'SCAN' can be used to force  an EPG scan on a single
  DVB card system (see MANUAL under Setup/EPG for details).
- Fixed handling PID changes in 'Transfer Mode'.
- Excess blanks in channel names read from the SDT are now removed.
- Fixed wrong parameter settings when scanning NITs for terrestrial transponders
  (thanks to Christian Tramnitz for pointing out this one).
- Fixed some out of bounds parameter settings when scanning NITs for cable
  and satellite transponders.
- Added 'libsi' include files to the 'include' directory, so that plugins can
  use them (thanks to Marcel Wiesweg).
- Now only processing NITs that contain the transponder they are actually
  broadcast on.
- Fixed setting the source type for newly detected terrestrial transponders
  (thanks to Christian Tramnitz for his support in debugging this).
This commit is contained in:
Klaus Schmidinger 2004-01-18 18:00:00 +01:00
parent a76a03c0d8
commit b8e837dbbb
29 changed files with 18529 additions and 107 deletions

View File

@ -641,6 +641,8 @@ Teemu Rantanen <tvr@iki.fi>
for reporting a problem in calculation of channel ids for tv stations that use
the undefined NID value 0
for adding EPG preferred languages
for reporting and helping to debug resetting the EPG data versions after changing
the preferred languages
Jan Ekholm <chakie@infa.abo.fi>
for adding/improving some Swedish language OSD texts
@ -654,6 +656,8 @@ Marcel Wiesweg <marcel.wiesweg@gmx.de>
for fixing volume display in case a plugin has its own OSD open
for providing 'libsi' and adapting the EIT mechanisms to it
for fixing testing for matching section filters in case they are turned off
for adding 'libsi' include files to the 'include' directory, so that plugins can
use them
Torsten Herz <torsten.herz@web.de>
for fixing a possible deadlock when using the "Blue" button in the "Schedules" menu
@ -902,3 +906,15 @@ Martin Holst <holstm@gmx.de>
Robert Huitl <vdr@huitl.de>
for fixing 'su' call in 'runvdr' to make it work on systems that require the
user name to appear before the command option
Vyacheslav Dikonov <sdiconov@mail.ru>
for translating OSD texts to the Russian language
Stephan Epstein <s.epstein@vinzenz.com>
for reporting a wrong 'delta' value in the call to the shutdown script
Christian Tramnitz <maillist@tramnitz.com>
for pointing out a problem with wrong parameter settings when scanning NITs
for terrestrial transponders
for his support in debugging a problem in setting the source type for newly
detected terrestrial transponders

39
HISTORY
View File

@ -2571,3 +2571,42 @@ Video Disk Recorder Revision History
scanned for channels during the next EPG scan. Note that only the satellite
branches are tested, cable and terrestrial need to be tested by somebody who
actually has such equipment.
2004-01-18: Version 1.3.2
- Fixed resetting the EPG data versions after changing the preferred languages
(thanks to Teemu Rantanen for reporting this one and helping to debug it).
- Added LinkageDescriptor handling to 'libsi' (thanks to Marcel Wiesweg).
- Added Russian language texts (thanks to Vyacheslav Dikonov).
Plugin authors may want to add the new entries to their I18N texts and contact
the translators to have their texts translated. Note that there are now 17
different OSD languages, so please make sure you have 17 versions for each of
your texts.
- Some corrections and additions to the Finnish OSD texts (thanks to Rolf
Ahrenberg and Niko Tarnanen).
- Fixed a wrong 'delta' value in the call to the shutdown script (thanks to
Stephan Epstein for reporting this one).
- Activated detection of radio channels (to avoid reports about "channels not
being detected that used to be detected with the 'scan' utility or the
original 'autopid' patch ;-).
- Channels with a zero VPID no longer write a PPID into channels.conf.
- Short channel names are now only stored if they actually differ from the
full name.
- The EPG scan now scans newly found transponders together with already existing
ones.
- The "Red" button in the "Setup/EPG" menu can now be used to force an EPG
scan on a single DVB card system (see MANUAL for details).
- The new SVDRP command 'SCAN' can be used to force an EPG scan on a single
DVB card system (see MANUAL under Setup/EPG for details).
- Fixed handling PID changes in 'Transfer Mode'.
- Excess blanks in channel names read from the SDT are now removed.
- Fixed wrong parameter settings when scanning NITs for terrestrial transponders
(thanks to Christian Tramnitz for pointing out this one).
- Fixed some out of bounds parameter settings when scanning NITs for cable
and satellite transponders.
- Added 'libsi' include files to the 'include' directory, so that plugins can
use them (thanks to Marcel Wiesweg).
- Now only processing NITs that contain the transponder they are actually
broadcast on.
- Fixed setting the source type for newly detected terrestrial transponders
(thanks to Christian Tramnitz for his support in debugging this).

9
MANUAL
View File

@ -482,6 +482,7 @@ Version 1.2
be taken. Note that in order to set the system time from
the transponder data the option "Set system time" must also
be enabled.
Preferred languages = 0
Some tv stations broadcast their EPG data in various
different languages. This option allows you to define
@ -496,6 +497,14 @@ Version 1.2
different languages, the preferred languages are checked
in the given order to decide which one to take.
Scan The "Red" button in the "Setup/EPG" menu can be used to
force an EPG scan on a single DVB card system. If pressed,
and the primary DVB device is currently not recording or
replaying, it will loop through the transponders once and
then switch back to the original channel. Any user activity
during the EPG scan will also stop the scan and bring back
the original channel.
DVB:
Primary DVB interface = 1

View File

@ -4,7 +4,7 @@
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
# $Id: Makefile 1.63 2004/01/10 14:11:57 kls Exp $
# $Id: Makefile 1.65 2004/01/18 14:16:53 kls Exp $
.DELETE_ON_ERROR:
@ -42,6 +42,9 @@ OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o d
FIXFONT_ISO8859_1 = -adobe-courier-bold-r-normal--25-*-100-100-m-*-iso8859-1
OSDFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--23-*-100-100-p-*-iso8859-1
SMLFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--18-*-100-100-p-*-iso8859-1
FIXFONT_ISO8859_5 = -rfx-courier-bold-r-normal--24-*-75-75-m-*-iso8859-5
OSDFONT_ISO8859_5 = -rfx-helvetica-medium-r-normal--24-*-75-75-p-*-iso8859-5
SMLFONT_ISO8859_5 = -rfx-helvetica-medium-r-normal--18-*-75-75-p-*-iso8859-5
FIXFONT_ISO8859_7 = --user-medium-r-normal--26-171-110-110-m-140-iso8859-7
OSDFONT_ISO8859_7 = --user-medium-r-normal--23-179-85-85-m-120-iso8859-7
SMLFONT_ISO8859_7 = --user-medium-r-normal--19-160-72-72-m-110-iso8859-7
@ -70,6 +73,7 @@ endif
all: vdr
font: genfontfile\
fontfix.c fontosd.c fontsml.c\
fontfix_iso8859_5.c fontosd_iso8859_5.c fontsml_iso8859_5.c\
fontfix_iso8859_7.c fontosd_iso8859_7.c fontsml_iso8859_7.c
@echo "font files created."
@ -100,11 +104,17 @@ fontosd.c:
./genfontfile "cFont::tPixelData FontOsd_iso8859_1" "$(OSDFONT_ISO8859_1)" > $@
fontsml.c:
./genfontfile "cFont::tPixelData FontSml_iso8859_1" "$(SMLFONT_ISO8859_1)" > $@
fontfix_iso8859_1.c:
fontfix_iso8859_5.c:
./genfontfile "cFont::tPixelData FontFix_iso8859_5" "$(FIXFONT_ISO8859_5)" > $@
fontosd_iso8859_5.c:
./genfontfile "cFont::tPixelData FontOsd_iso8859_5" "$(OSDFONT_ISO8859_5)" > $@
fontsml_iso8859_5.c:
./genfontfile "cFont::tPixelData FontSml_iso8859_5" "$(SMLFONT_ISO8859_5)" > $@
fontfix_iso8859_7.c:
./genfontfile "cFont::tPixelData FontFix_iso8859_7" "$(FIXFONT_ISO8859_7)" > $@
fontosd_iso8859_1.c:
fontosd_iso8859_7.c:
./genfontfile "cFont::tPixelData FontOsd_iso8859_7" "$(OSDFONT_ISO8859_7)" > $@
fontsml_iso8859_1.c:
fontsml_iso8859_7.c:
./genfontfile "cFont::tPixelData FontSml_iso8859_7" "$(SMLFONT_ISO8859_7)" > $@
# The font file generator:
@ -122,6 +132,8 @@ $(SILIB):
include-dir:
@mkdir -p include/vdr
@(cd include/vdr; for i in ../../*.h; do ln -fs $$i .; done)
@mkdir -p include/libsi
@(cd include/libsi; for i in ../../libsi/*.h; do ln -fs $$i .; done)
# Plugins:

View File

@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: i18n.c 1.3 2002/06/23 13:05:59 kls Exp $
* $Id: i18n.c 1.4 2004/01/16 13:28:23 kls Exp $
*/
#include "i18n.h"
@ -24,6 +24,8 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Привет!",
},
{ "Hello world!",
"Hallo Welt!",
@ -40,6 +42,8 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Здравствуй мир!",
},
{ "Howdy folks!",
"Tach zusammen!",
@ -56,6 +60,8 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Как поживаете?",
},
{ "A friendly greeting",
"Ein freundlicher Gruß",
@ -72,6 +78,8 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Дружеское приветствие",
},
{ "Greeting time (s)",
"Dauer des Grußes (s)",
@ -88,6 +96,8 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Продолжительность приветствия",
},
{ "Use alternate greeting",
"Alternativen Gruß verwenden",
@ -104,6 +114,8 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Альтернативное приветствие",
},
{ NULL }
};

View File

@ -31,7 +31,6 @@ Here's a list of the highlights - and what _not_ to expect yet
- Improved CAM support. Channels with conditional access now automatically
use the device that contains the proper CAM.
- No NVOD or "linked services" support yet.
- No radio support yet.
Note that this is currently work in progress, so there may be some
areas that don't work as smooth as expected, yet.

View File

@ -6,7 +6,7 @@ Das Erste:11836:hC34:S19.2E:27500:101:102:104:0:28106:1:1101:0
Bayerisches FS:11836:hC34:S19.2E:27500:201:202:204:0:28107:1:1101:0
hessen fernsehen:11836:hC34:S19.2E:27500:301:302:304:0:28108:1:1101:0
NDR FS MV:12109:hC34:S19.2E:27500:2401:2402:2404:0:28224:1:1073:0
SR Fernsehen Suedwest:11836:hC34:S19.2E:27500:501:502:504:0:28110:1:1101:0
SR Fernsehen Südwest:11836:hC34:S19.2E:27500:501:502:504:0:28110:1:1101:0
WDR Köln:11836:hC34:S19.2E:27500:601:602:604:0:28111:1:1101:0
BR-alpha:11836:hC34:S19.2E:27500:701:702:704:0:28112:1:1101:0
SÜDWEST BW:11836:hC34:S19.2E:27500:801:802:804:0:28113:1:1101:0
@ -63,7 +63,6 @@ SPORT 1,PREMIERE SPORT 1:11719:hC34:S19.2E:27500:255:256,257:0:1702,1722,1801:17
SPORT 2,PREMIERE SPORT 2:12031:hC34:S19.2E:27500:3839:3840,3841:0:1702,1722,1801:27:133:4:0
:Beta Digital
N24:12480:vC34:S19.2E:27500:2047:2048:36:0:47:133:33:0
CNBC:11953:hC34:S19.2E:27500:510:520:530:0:28010:1:1079:0
Liberty TV.com:12610:vC56:S19.2E:22000:941:943:0:0:12199:1:1112:0
:-
ProSieben Austria:12051:vC34:S19.2E:27500:161:84:36:0:20002:1:1082:0
@ -84,7 +83,6 @@ RTL TELE Letzebuerg:12552:vC56:S19.2E:22000:168:144,146:74:0:3994:1:1108:0
Yorin:12574:hC56:S19.2E:22000:512+8190:84:33:622,602,100:5010:53:1109:0
MTV2 Pop Channel:12226:hC34:S19.2E:27500:513:661:577:0:28640:1:1091:0
Via 1 - Schöner Reisen:12148:h:S19.2E:27500:511:512:0:0:44:0:0:0
Video Italia:12610:v:S19.2E:22000:121:122:0:0:12220:0:0:0
VIVA:12669:vC56:S19.2E:22000:309:310:311:0:12732:1:1116:0
VIVA PLUS:12552:vC56:S19.2E:22000:171:172:173:0:12120:1:1108:0
MTV Central:11739:vC34:S19.2E:27500:3031:3032:3034:0:28653:1:1066:0

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: config.h 1.182 2004/01/06 16:47:41 kls Exp $
* $Id: config.h 1.183 2004/01/11 21:42:23 kls Exp $
*/
#ifndef __CONFIG_H
@ -20,8 +20,8 @@
#include "i18n.h"
#include "tools.h"
#define VDRVERSION "1.3.1"
#define VDRVERSNUM 10301 // Version * 10000 + Major * 100 + Minor
#define VDRVERSION "1.3.2"
#define VDRVERSNUM 10302 // Version * 10000 + Major * 100 + Minor
#define MAXPRIORITY 99
#define MAXLIFETIME 99

View File

@ -4,58 +4,48 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: eitscan.c 1.18 2004/01/11 15:50:59 kls Exp $
* $Id: eitscan.c 1.20 2004/01/17 15:38:11 kls Exp $
*/
#include "eitscan.h"
#include <stdlib.h>
#include "channels.h"
#include "dvbdevice.h"
#include "interface.h"
// --- cScanData -------------------------------------------------------------
class cScanData : public cListObject {
private:
int source;
int transponder;
cChannel channel;
public:
cScanData(int Source, int Transponder);
cScanData(const cChannel *Channel);
virtual bool operator< (const cListObject &ListObject);
int Source(void) { return source; }
int Transponder(void) { return transponder; }
cChannel *GetChannel(cList<cChannel> *Channels);
int Source(void) { return channel.Source(); }
int Transponder(void) { return channel.Transponder(); }
const cChannel *GetChannel(void) { return &channel; }
};
cScanData::cScanData(int Source, int Transponder)
cScanData::cScanData(const cChannel *Channel)
{
source = Source;
transponder = Transponder;
channel = *Channel;
}
bool cScanData::operator< (const cListObject &ListObject)
{
cScanData *sd = (cScanData *)&ListObject;
return source < sd->source || source == sd->source && transponder < sd->transponder;
}
cChannel *cScanData::GetChannel(cList<cChannel> *Channels)
{
for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
if (!Channel->GroupSep() && Channel->Source() == source && ISTRANSPONDER(Channel->Transponder(), transponder))
return Channel;
}
return NULL;
return Source() < sd->Source() || Source() == sd->Source() && Transponder() < sd->Transponder();
}
// --- cScanList -------------------------------------------------------------
class cScanList : public cList<cScanData> {
public:
cScanList(cList<cChannel> *Channels);
void AddTransponders(cList<cChannel> *Channels);
void AddTransponder(const cChannel *Channel);
};
cScanList::cScanList(cList<cChannel> *Channels)
void cScanList::AddTransponders(cList<cChannel> *Channels)
{
for (cChannel *ch = Channels->First(); ch; ch = Channels->Next(ch))
AddTransponder(ch);
@ -64,11 +54,13 @@ cScanList::cScanList(cList<cChannel> *Channels)
void cScanList::AddTransponder(const cChannel *Channel)
{
for (cScanData *sd = First(); sd; sd = Next(sd)) {
if (sd->Source() == Channel->Source() && ISTRANSPONDER(sd->Transponder(), Channel->Transponder()))
return;
}
Add(new cScanData(Channel->Source(), Channel->Transponder()));
if (Channel->Source() && Channel->Transponder()) {
for (cScanData *sd = First(); sd; sd = Next(sd)) {
if (sd->Source() == Channel->Source() && ISTRANSPONDER(sd->Transponder(), Channel->Transponder()))
return;
}
Add(new cScanData(Channel));
}
}
// --- cTransponderList ------------------------------------------------------
@ -98,7 +90,6 @@ cEITScanner::cEITScanner(void)
lastScan = lastActivity = time(NULL);
currentDevice = NULL;
currentChannel = 0;
numScan = 0;
scanList = NULL;
transponderList = NULL;
}
@ -116,6 +107,11 @@ void cEITScanner::AddTransponder(cChannel *Channel)
transponderList->AddTransponder(Channel);
}
void cEITScanner::ForceScan(void)
{
lastActivity = 0;
}
void cEITScanner::Activity(void)
{
if (currentChannel) {
@ -131,11 +127,15 @@ void cEITScanner::Process(void)
time_t now = time(NULL);
if (now - lastScan > ScanTimeout && now - lastActivity > ActivityTimeout) {
if (Channels.Lock(false, 10)) {
cList<cChannel> *ChannelList = &Channels;
if (numScan % 2 == 0 && transponderList) // switch between the list of new transponders and the actual channels in case there are transponders w/o any channels
ChannelList = transponderList;
if (!scanList)
scanList = new cScanList(ChannelList);
if (!scanList) {
scanList = new cScanList;
scanList->AddTransponders(&Channels);
if (transponderList) {
scanList->AddTransponders(transponderList);
delete transponderList;
transponderList = NULL;
}
}
for (bool AnyDeviceSwitched = false; !AnyDeviceSwitched; ) {
cScanData *ScanData = NULL;
for (int i = 0; i < cDevice::NumDevices(); i++) {
@ -144,12 +144,14 @@ void cEITScanner::Process(void)
if (Device) {
if (Device != cDevice::PrimaryDevice() || (cDevice::NumDevices() == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) {
if (!(Device->Receiving(true) || Device->Replaying())) {
cChannel *Channel = ScanData->GetChannel(ChannelList);
const cChannel *Channel = ScanData->GetChannel();
if (Channel) {
//XXX if (Device->ProvidesTransponder(Channel)) {
if ((!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= 0x0100) && Device->ProvidesTransponder(Channel)) { //XXX temporary for the 'sky' plugin
if (Device == cDevice::PrimaryDevice() && !currentChannel)
if (Device == cDevice::PrimaryDevice() && !currentChannel) {
currentChannel = Device->CurrentChannel();
Interface->Info("Starting EPG scan");
}
currentDevice = Device;//XXX see also dvbdevice.c!!!
Device->SwitchChannel(Channel, false);
currentDevice = NULL;
@ -172,11 +174,8 @@ void cEITScanner::Process(void)
if (!scanList->Count()) {
delete scanList;
scanList = NULL;
numScan++;
if (ChannelList == transponderList) {
delete transponderList;
transponderList = NULL;
}
if (lastActivity == 0) // this was a triggered scan
Activity();
break;
}
}

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: eitscan.h 1.6 2004/01/11 14:11:25 kls Exp $
* $Id: eitscan.h 1.8 2004/01/17 15:36:24 kls Exp $
*/
#ifndef __EITSCAN_H
@ -24,15 +24,15 @@ private:
time_t lastScan, lastActivity;
cDevice *currentDevice;
int currentChannel;
int numScan;
cScanList *scanList;
cTransponderList *transponderList;
public:
cEITScanner(void);
~cEITScanner();
bool Active(void) { return currentChannel; }
bool Active(void) { return currentChannel || lastActivity == 0; }
bool UsesDevice(const cDevice *Device) { return currentDevice == Device; }
void AddTransponder(cChannel *Channel);
void ForceScan(void);
void Activity(void);
void Process(void);
};

12
font.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: font.c 1.4 2003/10/24 12:59:35 kls Exp $
* $Id: font.c 1.5 2004/01/16 13:17:57 kls Exp $
*/
#include "font.h"
@ -14,18 +14,24 @@
#include "fontosd.c"
#include "fontsml.c"
#include "fontfix-iso8859-5.c"
#include "fontosd-iso8859-5.c"
#include "fontsml-iso8859-5.c"
#include "fontfix-iso8859-7.c"
#include "fontosd-iso8859-7.c"
#include "fontsml-iso8859-7.c"
static void *FontData[eDvbCodeSize][eDvbFontSize] = {
{ FontOsd_iso8859_1, FontFix_iso8859_1, FontSml_iso8859_1 },
{ FontOsd_iso8859_7, FontFix_iso8859_7, FontSml_iso8859_7 }
{ FontOsd_iso8859_5, FontFix_iso8859_5, FontSml_iso8859_5 },
{ FontOsd_iso8859_7, FontFix_iso8859_7, FontSml_iso8859_7 },
};
static const char *FontCode[eDvbCodeSize] = {
"iso8859-1",
"iso8859-7"
"iso8859-5",
"iso8859-7",
};
eDvbCode cFont::code = code_iso8859_1;

5
font.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: font.h 1.4 2003/10/24 12:59:45 kls Exp $
* $Id: font.h 1.5 2004/01/16 13:18:28 kls Exp $
*/
#ifndef __FONT_H
@ -21,7 +21,8 @@ enum eDvbFont {
enum eDvbCode {
code_iso8859_1,
code_iso8859_7
code_iso8859_5,
code_iso8859_7,
#define eDvbCodeSize (code_iso8859_7 + 1)
};

6051
fontfix-iso8859-5.c Normal file

File diff suppressed because it is too large Load Diff

5602
fontosd-iso8859-5.c Normal file

File diff suppressed because it is too large Load Diff

6274
fontsml-iso8859-5.c Normal file

File diff suppressed because it is too large Load Diff

263
i18n.c

File diff suppressed because it is too large Load Diff

4
i18n.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: i18n.h 1.8 2004/01/06 15:56:53 kls Exp $
* $Id: i18n.h 1.9 2004/01/16 12:43:47 kls Exp $
*/
#ifndef __I18N_H
@ -12,7 +12,7 @@
#include <stdio.h>
const int I18nNumLanguages = 16;
const int I18nNumLanguages = 17;
typedef const char *tI18nPhrase[I18nNumLanguages];

View File

@ -6,7 +6,7 @@
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* $Id: descriptor.c 1.2 2003/12/13 10:42:05 kls Exp $
* $Id: descriptor.c 1.3 2004/01/12 16:17:20 kls Exp $
* *
***************************************************************************/
@ -492,6 +492,28 @@ void MultilingualServiceNameDescriptor::Name::Parse() {
name.setData(data+offset, mid->service_name_length);
}
void LinkageDescriptor::Parse() {
unsigned int offset=0;
data.setPointerAndOffset<const descr_linkage>(s, offset);
privateData.assign(data.getData(offset), getLength()-offset);
}
int LinkageDescriptor::getTransportStreamId() const {
return HILO(s->transport_stream_id);
}
int LinkageDescriptor::getOriginalNetworkId() const {
return HILO(s->original_network_id);
}
int LinkageDescriptor::getServiceId() const {
return HILO(s->service_id);
}
LinkageType LinkageDescriptor::getLinkageType() const {
return (LinkageType)s->linkage_type;
}
void ApplicationSignallingDescriptor::Parse() {
entryLoop.setData(data+sizeof(descr_application_signalling), getLength()-sizeof(descr_application_signalling));
}

View File

@ -6,7 +6,7 @@
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* $Id: descriptor.h 1.2 2003/12/13 10:42:08 kls Exp $
* $Id: descriptor.h 1.3 2004/01/12 16:17:47 kls Exp $
* *
***************************************************************************/
@ -361,6 +361,19 @@ protected:
virtual void Parse();
};
class LinkageDescriptor : public Descriptor {
public:
int getTransportStreamId() const;
int getOriginalNetworkId() const;
int getServiceId() const;
LinkageType getLinkageType() const;
CharArray privateData;
protected:
virtual void Parse();
private:
const descr_linkage *s;
};
//a descriptor currently unimplemented in this library
class UnimplementedDescriptor : public Descriptor {
protected:

View File

@ -6,7 +6,7 @@
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* $Id: si.c 1.4 2004/01/05 11:04:17 kls Exp $
* $Id: si.c 1.5 2004/01/12 22:19:34 kls Exp $
* *
***************************************************************************/
@ -320,6 +320,9 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain)
case ApplicationSignallingDescriptorTag:
d=new ApplicationSignallingDescriptor();
break;
case LinkageDescriptorTag:
d=new LinkageDescriptor();
break;
//note that it is no problem to implement one
//of the unimplemented descriptors.
@ -348,7 +351,6 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain)
case VBITeletextDescriptorTag:
case CountryAvailabilityDescriptorTag:
case MocaicDescriptorTag:
case LinkageDescriptorTag:
case TeletextDescriptorTag:
case TelephoneDescriptorTag:
case LocalTimeOffsetDescriptorTag:

View File

@ -6,7 +6,7 @@
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* $Id: si.h 1.5 2004/01/09 15:59:53 kls Exp $
* $Id: si.h 1.6 2004/01/12 16:19:11 kls Exp $
* *
***************************************************************************/
@ -154,6 +154,18 @@ enum RunningStatus { RunningStatusUndefined = 0,
RunningStatusRunning = 4
};
enum LinkageType { LinkageTypeInformationService = 0x01,
LinkageTypeEPGService = 0x02,
LinkageTypeCaReplacementService = 0x03,
LinkageTypeTSContainingCompleteNetworkBouquetSi = 0x04,
LinkageTypeServiceReplacementService = 0x05,
LinkageTypeDataBroadcastService = 0x06,
LinkageTypeRCSMap = 0x07,
LinkageTypeMobileHandover = 0x08,
LinkageTypeSystemSoftwareUpdateService = 0x09,
LinkageTypeTSContainingSsuBatOrNit = 0x0A
};
/* Some principles:
- Objects that return references to other objects contained in their data must make sure
that the returned objects have been parsed.
@ -167,6 +179,7 @@ public:
Object(CharArray &d);
//can only be called once since data is immutable
void setData(const unsigned char*data, unsigned int size, bool doCopy=true);
CharArray getData() { return data; }
virtual int getLength() = 0;
protected:
CharArray data;
@ -224,9 +237,6 @@ private:
class LoopElement : public Object {
};
class SubStructure : public LoopElement {
};
class Descriptor : public LoopElement {
public:
virtual int getLength();

19
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menu.c 1.279 2004/01/11 15:40:32 kls Exp $
* $Id: menu.c 1.281 2004/01/17 14:17:00 kls Exp $
*/
#include "menu.h"
@ -16,6 +16,7 @@
#include "channels.h"
#include "config.h"
#include "cutter.h"
#include "eitscan.h"
#include "i18n.h"
#include "menuitems.h"
#include "plugin.h"
@ -2044,6 +2045,7 @@ cMenuSetupEPG::cMenuSetupEPG(void)
;
originalNumLanguages = numLanguages;
SetSection(tr("EPG"));
SetHelp(tr("Scan"));
Setup();
}
@ -2068,10 +2070,6 @@ void cMenuSetupEPG::Setup(void)
eOSState cMenuSetupEPG::ProcessKey(eKeys Key)
{
int oldnumLanguages = numLanguages;
int oldSetSystemTime = data.SetSystemTime;
eOSState state = cMenuSetupBase::ProcessKey(Key);
if (Key == kOk) {
bool Modified = numLanguages != originalNumLanguages;
if (!Modified) {
@ -2085,7 +2083,12 @@ eOSState cMenuSetupEPG::ProcessKey(eKeys Key)
if (Modified)
cSchedules::ResetVersions();
}
else if (Key != kNone) {
int oldnumLanguages = numLanguages;
int oldSetSystemTime = data.SetSystemTime;
eOSState state = cMenuSetupBase::ProcessKey(Key);
if (Key != kNone) {
if (numLanguages != oldnumLanguages || data.SetSystemTime != oldSetSystemTime) {
for (int i = oldnumLanguages; i < numLanguages; i++) {
data.EPGLanguages[i] = 0;
@ -2104,6 +2107,10 @@ eOSState cMenuSetupEPG::ProcessKey(eKeys Key)
data.EPGLanguages[numLanguages] = -1;
Setup();
}
if (Key == kRed) {
EITScanner.ForceScan();
return osEnd;
}
}
return state;
}

99
nit.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: nit.c 1.1 2004/01/11 15:42:51 kls Exp $
* $Id: nit.c 1.5 2004/01/18 16:32:45 kls Exp $
*/
#include "nit.h"
@ -17,12 +17,16 @@
cNitFilter::cNitFilter(void)
{
numNits = 0;
networkId = 0;
Set(0x10, 0x40); // NIT
}
void cNitFilter::SetStatus(bool On)
{
cFilter::SetStatus(On);
numNits = 0;
networkId = 0;
sectionSyncer.Reset();
}
@ -31,7 +35,59 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
SI::NIT nit(Data, false);
if (!nit.CheckCRCAndParse())
return;
if (!sectionSyncer.Sync(nit.getVersionNumber(), nit.getSectionNumber(), nit.getLastSectionNumber()))
// Some broadcasters send more than one NIT, with no apparent way of telling which
// one is the right one to use. This is an attempt to find the NIT that contains
// the transponder it was transmitted on and use only that one:
int ThisNIT = -1;
if (!networkId) {
for (int i = 0; i < numNits; i++) {
if (nits[i].networkId == nit.getNetworkId()) {
if (nit.getSectionNumber() == 0) {
// all NITs have passed by
for (int j = 0; j < numNits; j++) {
if (nits[j].hasTransponder) {
networkId = nits[j].networkId;
//printf("taking NIT with network ID %d\n", networkId);
//XXX what if more than one NIT contaisn this transponder???
break;
}
}
if (!networkId) {
//printf("none of the NITs contains transponder %d\n", Transponder());
return;
}
}
else {
ThisNIT = i;
break;
}
}
}
if (!networkId && ThisNIT < 0 && numNits < MAXNITS) {
if (nit.getSectionNumber() == 0) {
*nits[numNits].name = 0;
SI::Descriptor *d;
for (SI::Loop::Iterator it; (d = nit.commonDescriptors.getNext(it)); ) {
switch (d->getDescriptorTag()) {
case SI::NetworkNameDescriptorTag: {
SI::NetworkNameDescriptor *nnd = (SI::NetworkNameDescriptor *)d;
nnd->name.getText(nits[numNits].name);
}
break;
default: ;
}
}
nits[numNits].networkId = nit.getNetworkId();
nits[numNits].hasTransponder = false;
//printf("NIT[%d] %5d '%s'\n", numNits, nits[numNits].networkId, nits[numNits].name);
ThisNIT = numNits;
numNits++;
}
}
}
else if (networkId != nit.getNetworkId())
return; // ignore all other NITs
else if (!sectionSyncer.Sync(nit.getVersionNumber(), nit.getSectionNumber(), nit.getLastSectionNumber()))
return;
if (!Channels.Lock(true, 10))
return;
@ -46,9 +102,16 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
int Frequency = BCD2INT(sd->getFrequency()) / 100;
static char Polarizations[] = { 'h', 'v', 'l', 'r' };
char Polarization = Polarizations[sd->getPolarization()];
static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE };
static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE };
int CodeRate = CodeRates[sd->getFecInner()];
int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
if (ThisNIT >= 0) {
if (ISTRANSPONDER(Frequency, Transponder())) {
nits[ThisNIT].hasTransponder = true;
//printf("has transponder %d\n", Transponder());
}
break;
}
bool found = false;
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
@ -72,11 +135,18 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
int Source = cSource::FromData(cSource::stCable);
int Frequency = BCD2INT(sd->getFrequency()) / 10;
//XXX FEC_outer???
static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE };
static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE };
int CodeRate = CodeRates[sd->getFecInner()];
static int Modulations[] = { QPSK, QAM_16, QAM_32, QAM_64, QAM_128, QAM_256 };
int Modulation = Modulations[sd->getModulation()];
static int Modulations[] = { QPSK, QAM_16, QAM_32, QAM_64, QAM_128, QAM_256, QAM_AUTO };
int Modulation = Modulations[min(sd->getModulation(), 6)];
int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
if (ThisNIT >= 0) {
if (ISTRANSPONDER(Frequency / 1000, Transponder())) {
nits[ThisNIT].hasTransponder = true;
//printf("has transponder %d\n", Transponder());
}
break;
}
bool found = false;
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
@ -97,21 +167,28 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
break;
case SI::TerrestrialDeliverySystemDescriptorTag: {
SI::TerrestrialDeliverySystemDescriptor *sd = (SI::TerrestrialDeliverySystemDescriptor *)d;
int Source = cSource::FromData(cSource::stCable);
int Source = cSource::FromData(cSource::stTerr);
int Frequency = sd->getFrequency() * 10;
static int Bandwidths[] = { BANDWIDTH_6_MHZ, BANDWIDTH_7_MHZ, BANDWIDTH_8_MHZ, BANDWIDTH_AUTO, BANDWIDTH_AUTO, BANDWIDTH_AUTO, BANDWIDTH_AUTO, BANDWIDTH_AUTO };
static int Bandwidths[] = { BANDWIDTH_8_MHZ, BANDWIDTH_7_MHZ, BANDWIDTH_6_MHZ, BANDWIDTH_AUTO, BANDWIDTH_AUTO, BANDWIDTH_AUTO, BANDWIDTH_AUTO, BANDWIDTH_AUTO };
int Bandwidth = Bandwidths[sd->getBandwidth()];
static int Constellations[] = { QPSK, QAM_16, QAM_64, QAM_AUTO };
int Constellation = Constellations[sd->getConstellation()];
static int Hierarchies[] = { HIERARCHY_NONE, HIERARCHY_1, HIERARCHY_2, HIERARCHY_4 };
static int Hierarchies[] = { HIERARCHY_NONE, HIERARCHY_1, HIERARCHY_2, HIERARCHY_4, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO };
int Hierarchy = Hierarchies[sd->getHierarchy()];
static int CodeRates[] = { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_NONE, FEC_NONE, FEC_NONE };
static int CodeRates[] = { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO };
int CodeRateHP = CodeRates[sd->getCodeRateHP()];
int CodeRateLP = CodeRates[sd->getCodeRateLP()];
static int GuardIntervals[] = { GUARD_INTERVAL_1_4, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_32 };
static int GuardIntervals[] = { GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_4 };
int GuardInterval = GuardIntervals[sd->getGuardInterval()];
static int TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_AUTO };
int TransmissionMode = TransmissionModes[sd->getTransmissionMode()];
if (ThisNIT >= 0) {
if (ISTRANSPONDER(Frequency / 1000000, Transponder())) {
nits[ThisNIT].hasTransponder = true;
//printf("has transponder %d\n", Transponder());
}
break;
}
bool found = false;
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {

16
nit.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: nit.h 1.1 2004/01/11 14:31:05 kls Exp $
* $Id: nit.h 1.2 2004/01/18 11:13:48 kls Exp $
*/
#ifndef __NIT_H
@ -12,9 +12,23 @@
#include "filter.h"
#define MAXNITS 16
#define MAXNETWORKNAME 256
class cNitFilter : public cFilter {
private:
class cNit {
public:
u_short networkId;
char name[MAXNETWORKNAME];
bool hasTransponder;
};
cSectionSyncer sectionSyncer;
cNit nits[MAXNITS];
u_short networkId;
int numNits;
protected:
virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length);
public:

4
pat.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: pat.c 1.4 2004/01/05 11:42:30 kls Exp $
* $Id: pat.c 1.5 2004/01/16 15:43:34 kls Exp $
*/
#include "pat.h"
@ -369,7 +369,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
}
}
if (Setup.UpdateChannels >= 2) {
Channel->SetPids(Vpid, Ppid, Apids[0], Apids[1], Dpids[0], Dpids[1], Tpid);
Channel->SetPids(Vpid, Vpid ? Ppid : 0, Apids[0], Apids[1], Dpids[0], Dpids[1], Tpid);
Channel->SetCaIds(CaDescriptors->CaIds());
Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors));
}

8
sdt.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: sdt.c 1.4 2004/01/11 14:28:28 kls Exp $
* $Id: sdt.c 1.7 2004/01/17 17:27:49 kls Exp $
*/
#include "sdt.h"
@ -53,7 +53,7 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
SI::ServiceDescriptor *sd = (SI::ServiceDescriptor *)d;
switch (sd->getServiceType()) {
case 0x01: // digital television service
//XXX TODO case 0x02: // digital radio sound service
case 0x02: // digital radio sound service
//XXX TODO case 0x04: // NVOD reference service
//XXX TODO case 0x05: // NVOD time-shifted service
{
@ -78,11 +78,13 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
}
*pn = *ps = 0;
pn = NameBuf;
if (*NameBuf && *ShortNameBuf) {
if (*NameBuf && *ShortNameBuf && strcmp(NameBuf, ShortNameBuf) != 0) {
*ps++ = ',';
strcpy(ps, NameBuf);
pn = ShortNameBuf;
}
pn = compactspace(pn);
ps = compactspace(ps);
if (channel) {
channel->SetId(sdt.getOriginalNetworkId(), sdt.getTransportStreamId(), SiSdtService.getServiceId());
if (Setup.UpdateChannels >= 1)

13
svdrp.c
View File

@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection.
*
* $Id: svdrp.c 1.57 2003/12/28 10:09:30 kls Exp $
* $Id: svdrp.c 1.58 2004/01/17 13:47:39 kls Exp $
*/
#include "svdrp.h"
@ -29,6 +29,7 @@
#include "channels.h"
#include "config.h"
#include "device.h"
#include "eitscan.h"
#include "keys.h"
#include "remote.h"
#include "timers.h"
@ -251,6 +252,9 @@ const char *HelpPages[] = {
" format defined in vdr(5) for the 'epg.data' file. A '.' on a line\n"
" by itself terminates the input and starts processing of the data (all\n"
" entered data is buffered until the terminating '.' is seen).",
"SCAN\n"
" Forces an EPG scan. If this is a single DVB device system, the scan\n"
" will be done on the primary device unless it is currently recording.",
"STAT disk\n"
" Return information about disk usage (total, free, percent).",
"UPDT <settings>\n"
@ -954,6 +958,12 @@ void cSVDRP::CmdPUTE(const char *Option)
DELETENULL(PUTEhandler);
}
void cSVDRP::CmdSCAN(const char *Option)
{
EITScanner.ForceScan();
Reply(250, "EPG scan triggered");
}
void cSVDRP::CmdSTAT(const char *Option)
{
if (*Option) {
@ -1062,6 +1072,7 @@ void cSVDRP::Execute(char *Cmd)
else if (CMD("NEWT")) CmdNEWT(s);
else if (CMD("NEXT")) CmdNEXT(s);
else if (CMD("PUTE")) CmdPUTE(s);
else if (CMD("SCAN")) CmdSCAN(s);
else if (CMD("STAT")) CmdSTAT(s);
else if (CMD("UPDT")) CmdUPDT(s);
else if (CMD("VOLU")) CmdVOLU(s);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: svdrp.h 1.19 2003/04/27 14:09:59 kls Exp $
* $Id: svdrp.h 1.20 2004/01/17 13:30:52 kls Exp $
*/
#ifndef __SVDRP_H
@ -73,6 +73,7 @@ private:
void CmdNEWT(const char *Option);
void CmdNEXT(const char *Option);
void CmdPUTE(const char *Option);
void CmdSCAN(const char *Option);
void CmdSTAT(const char *Option);
void CmdUPDT(const char *Option);
void CmdVOLU(const char *Option);

6
vdr.c
View File

@ -22,7 +22,7 @@
*
* The project's page is at http://www.cadsoft.de/vdr
*
* $Id: vdr.c 1.172 2004/01/04 11:12:05 kls Exp $
* $Id: vdr.c 1.174 2004/01/17 16:56:57 kls Exp $
*/
#include <getopt.h>
@ -52,6 +52,7 @@
#include "sources.h"
#include "timers.h"
#include "tools.h"
#include "transfer.h"
#include "videodir.h"
#define MINCHANNELWAIT 10 // seconds to wait between failed channel switchings
@ -520,7 +521,7 @@ int main(int argc, char *argv[])
if (Channel && Channel->Modification(CHANNELMOD_RETUNE)) {
cRecordControls::ChannelDataModified(Channel);
if (Channel->Number() == cDevice::CurrentChannel()) {
if (!cDevice::PrimaryDevice()->Replaying()) {
if (!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice()) {
isyslog("retuning due to modification of channel %d", Channel->Number());
Channels.SwitchTo(Channel->Number());
}
@ -795,6 +796,7 @@ int main(int argc, char *argv[])
if (Interface->Confirm(tr("Press any key to cancel shutdown"), UserShutdown ? 5 : SHUTDOWNWAIT, true)) {
int Channel = timer ? timer->Channel()->Number() : 0;
const char *File = timer ? timer->File() : "";
Delta = Next - time(NULL); // compensates for Confirm() timeout
char *cmd;
asprintf(&cmd, "%s %ld %ld %d \"%s\" %d", Shutdown, Next, Delta, Channel, strescape(File, "\"$"), UserShutdown);
isyslog("executing '%s'", cmd);