diff -ruN vdr-1.3.23/CONTRIBUTORS vdr-1.3.24/CONTRIBUTORS
--- vdr-1.3.23/CONTRIBUTORS	2005-03-20 14:27:01.000000000 +0100
+++ vdr-1.3.24/CONTRIBUTORS	2005-05-08 16:09:52.000000000 +0200
@@ -64,6 +64,8 @@
  for suggesting the SVDRP command CLRE
  for reporting a bug in handling one-shot timers that were already recording
  and had their start time changed into the future
+ for suggesting to give the timer status a bit that is set when that timer
+ is currently recording
 
 Miha Setina <mihasetina@softhome.net>
  for translating OSD texts to the Slovenian language
@@ -193,6 +195,8 @@
  for reporting several memory leaks that were introduced through the use of cString
  for adding MPEG1 replay capability to cPesAssembler
  for fixing handling symbolic links in cRecordings::ScanVideoDir()
+ for reporting a memory leak in tComponent
+ for fixing a memory leak in cDvbPlayer
 
 Ulrich Röder <roeder@efr-net.de>
  for pointing out that there are channels that have a symbol rate higher than 27500
@@ -763,6 +767,7 @@
  for reporting a problem when starting replay of a recording that has no Dolby
  Digital audio after switching to a channel that has DD and selecting the DD audio
  track
+ for reporting a bug in timeout handling in cRwLock::Lock()
 
 Malcolm Caldwell <malcolm.caldwell@ntu.edu.au>
  for modifying LOF handling to allow for C-band reception
@@ -936,6 +941,8 @@
  for fixing a possible freeze in pause mode in case a device's PlayPesPacket()
  function permanently returns 0
  for fixing a typo in detecting UTF-8
+ for fixing handling fragments of less than 3 byte in cPesAssembler
+ for some rearrangements in cDvbPlayer::Action() to avoid lockups on NPTL systems
 
 Richard Robson <richard_robson@beeb.net>
  for reporting freezing replay if a timer starts while in Transfer Mode from the
@@ -1158,6 +1165,10 @@
  for increasing POLLTIMEOUTS_BEFORE_DEVICECLEAR in transfer.c to 6 to avoid problems
  with the larger buffer reserve
  for adding support for setting the video display mode
+ for fixing handling transparent areas in cDvbSpuBitmap
+ for fixing a bug in libsi's SubtitlingDescriptor::getLength()
+ for removing scaling coordinates in letterbox mode from cDvbSpu
+ for fixing a wrong inheritance in libsi's SubtitlingDescriptor::Subtitling
 
 Jürgen Schmitz <j.schmitz@web.de>
  for reporting a bug in displaying the current channel when switching via the SVDRP
@@ -1202,6 +1213,7 @@
 
 Udo Richter <udo_richter@gmx.de>
  for refining the formula for making volume control more linear
+ for fixing handling lifetime when deciding whether to delete a recording
 
 Sven Kreiensen <svenk@kammer.uni-hannover.de>
  for his help in keeping 'channels.conf.terr' up to date
@@ -1300,10 +1312,22 @@
 
 Roman Krenický <free-rtk@gmx.de>
  for a patch that was used a a basis for changing a timer's day handling to full date
+ for considering the "EPG linger time" when saving the EPG data to file or listing
+ it via LSTE
 
 Ville Skyttä <ville.skytta@iki.fi>
  for reporting several compiler warnings in gcc 4.0
+ for including the optional user defined Make.config from the 'libsi' Makefile
 
 Steffen Beyer <cpunk@reactor.de>
  for fixing setting the colored button help after deleting a recording in case the next
  menu entry is a directory
+
+Daniel Thompson <daniel.thompson@st.com>
+ for fixing a memory leak in tComponent
+
+Matthias Lötzke <Matthias@Loetzke.de>
+ for adding missing text internationalization for "Starting EPG scan"
+
+Wolfgang Fritz <wolfgang.fritz@gmx.net>
+ for making recordings avoid zero sized video data files
diff -ruN vdr-1.3.23/HISTORY vdr-1.3.24/HISTORY
--- vdr-1.3.23/HISTORY	2005-03-20 16:15:42.000000000 +0100
+++ vdr-1.3.24/HISTORY	2005-05-08 16:10:04.000000000 +0200
@@ -3473,3 +3473,42 @@
   than 30 seconds.
 - Added a missing cMutexLock to cRemote::HasKeys() (thanks to Wolfgang Rohdewald).
 - All log entries regarding timers now contain a short description of the timer.
+
+2005-05-08: Version 1.3.24
+
+- Now including the optional user defined Make.config from the 'libsi' Makefile
+  (thanks to Ville Skyttä).
+- Updated the Danish OSD texts (thanks to Mogens Elneff).
+- Fixed a memory leak in tComponent (thanks to Stefan Huelswitt and Daniel Thompson).
+- Fixed a memory leak in cDvbPlayer (thanks to Stefan Huelswitt).
+- Added missing text internationalization for "Starting EPG scan" (thanks to
+  Matthias Lötzke).
+- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
+- Fixed handling transparent areas in cDvbSpuBitmap (thanks to Marco Schlüßler).
+- Now also considering the "EPG linger time" when saving the EPG data to file or
+  listing it via LSTE (thanks to Roman Krenický).
+- Fixed handling fragments of less than 3 byte in cPesAssembler (thanks to
+  Reinhard Nissl).
+- Fixed a bug in libsi's SubtitlingDescriptor::getLength() (thanks to Marco
+  Schlüßler).
+- When reading the channels.conf file, duplicate channels (i.e. ones that have
+  the same channel ID) are now automatically deleted and only the first one is
+  actually stored.
+- Fixed handling lifetime when deciding whether to delete a recording (thanks to
+  Udo Richter).
+- Fixed timeout handling in cRwLock::Lock() (thanks to Sascha Volkenandt for reporting
+  this one).
+- Since there are several places in thread.c where a timeout value is calculated,
+  this has been put into a separate function.
+- The timer status now has a new bit that is set when that timer is currently
+  recording (suggested by Matthias Schniedermeyer). See man vdr(5) for details.
+- Removed scaling coordinates in letterbox mode from cDvbSpu - the DVD plugin, which
+  was the only one needing this, doesn't need it any more (thanks to Marco Schlüßler).
+- No longer retuning or restarting a recording if only the language code of an
+  audio or dolby PID changes.
+- Now preferring budget cards when selecting a DVB device for recording.
+- Recordings now avoid zero sized video data files (thanks to Wolfgang Fitz).
+- Some rearrangements in cDvbPlayer::Action() to avoid lockups on NPTL systems
+  (thanks to Reinhard Nissl).
+- Fixed a wrong inheritance in libsi's SubtitlingDescriptor::Subtitling (thanks to
+  Marco Schlüßler).
diff -ruN vdr-1.3.23/channels.c vdr-1.3.24/channels.c
--- vdr-1.3.23/channels.c	2005-03-19 16:56:38.000000000 +0100
+++ vdr-1.3.24/channels.c	2005-05-07 15:14:32.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: channels.c 1.36 2005/03/19 15:56:38 kls Exp $
+ * $Id: channels.c 1.38 2005/05/07 13:14:32 kls Exp $
  */
 
 #include "channels.h"
@@ -389,15 +389,21 @@
      }
 }
 
-static bool IntArraysDiffer(const int *a, const int *b, const char na[][4] = NULL, const char nb[][4] = NULL)
+#define STRDIFF 0x01
+#define VALDIFF 0x02
+
+static int IntArraysDiffer(const int *a, const int *b, const char na[][4] = NULL, const char nb[][4] = NULL)
 {
-  int i = 0;
-  while (a[i] && b[i]) {
-        if (a[i] != b[i] || na && nb && strcmp(na[i], nb[i]) != 0)
-           return true;
-        i++;
-        }
-  return a[i] != b[i] || a[i] && na && nb && strcmp(na[i], nb[i]) != 0;
+  int result = 0;
+  for (int i = 0; a[i] || b[i]; i++) {
+      if (a[i] && na && nb && strcmp(na[i], nb[i]) != 0)
+         result |= STRDIFF;
+      if (a[i] != b[i])
+         result |= VALDIFF;
+      if (!a[i] || !b[i])
+         break;
+      }
+  return result;
 }
 
 static int IntArrayToString(char *s, const int *a, int Base = 10, const char n[][4] = NULL)
@@ -418,10 +424,15 @@
 
 void cChannel::SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][4], int *Dpids, char DLangs[][4], int Tpid)
 {
-  bool modified = vpid != Vpid || ppid != Ppid || tpid != Tpid;
-  if (!modified)
-     modified = IntArraysDiffer(apids, Apids, alangs, ALangs) || IntArraysDiffer(dpids, Dpids, dlangs, DLangs);
-  if (modified) {
+  int mod = CHANNELMOD_NONE;
+  if (vpid != Vpid || ppid != Ppid || tpid != Tpid)
+     mod |= CHANNELMOD_PIDS;
+  int m = IntArraysDiffer(apids, Apids, alangs, ALangs) | IntArraysDiffer(dpids, Dpids, dlangs, DLangs);
+  if (m & STRDIFF)
+     mod |= CHANNELMOD_LANGS;
+  if (m & VALDIFF)
+     mod |= CHANNELMOD_PIDS;
+  if (mod) {
      char OldApidsBuf[(MAXAPIDS + MAXDPIDS) * 10 + 10]; // 10: 5 digits plus delimiting ',' or ';' plus optional '=cod', +10: paranoia
      char NewApidsBuf[(MAXAPIDS + MAXDPIDS) * 10 + 10];
      char *q = OldApidsBuf;
@@ -450,7 +461,7 @@
          strn0cpy(dlangs[i], DLangs[i], 4);
          }
      tpid = Tpid;
-     modification |= CHANNELMOD_PIDS;
+     modification |= mod;
      Channels.SetModified();
      }
 }
@@ -648,7 +659,7 @@
   return ToText(this);
 }
 
-bool cChannel::Parse(const char *s, bool AllowNonUniqueID)
+bool cChannel::Parse(const char *s)
 {
   bool ok = true;
   if (*s == ':') {
@@ -791,10 +802,6 @@
            esyslog("ERROR: channel data results in invalid ID!");
            return false;
            }
-        if (!AllowNonUniqueID && Channels.GetByChannelID(GetChannelID())) {
-           esyslog("ERROR: channel data not unique!");
-           return false;
-           }
         }
      else
         return false;
@@ -817,9 +824,30 @@
   modified = CHANNELSMOD_NONE;
 }
 
+void cChannels::DeleteDuplicateChannels(void)
+{
+  for (cChannel *channel = First(); channel; channel = Next(channel)) {
+      if (!channel->GroupSep()) {
+         tChannelID ChannelID = channel->GetChannelID();
+         cChannel *other = Next(channel);
+         while (other) {
+               cChannel *d = NULL;
+               if (!other->GroupSep() && other->GetChannelID() == ChannelID)
+                  d = other;
+               other = Next(other);
+               if (d) {
+                  dsyslog("deleting duplicate channel %s", *d->ToText());
+                  Del(d);
+                  }
+               }
+         }
+      }
+}
+
 bool cChannels::Load(const char *FileName, bool AllowComments, bool MustExist)
 {
   if (cConfig<cChannel>::Load(FileName, AllowComments, MustExist)) {
+     DeleteDuplicateChannels();
      ReNumber();
      return true;
      }
diff -ruN vdr-1.3.23/channels.conf vdr-1.3.24/channels.conf
--- vdr-1.3.23/channels.conf	2005-03-20 16:22:50.000000000 +0100
+++ vdr-1.3.24/channels.conf	2005-05-08 16:25:36.000000000 +0200
@@ -29,7 +29,7 @@
 EURONEWS;CSAT:11817:vC34:S19.2E:27500:163:92=fra,93=eng,94=ita,95=esl,91=rus,98=por,99=deu:0:0:8004:1:1070:0
 rbb Brandenburg;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28205:1:1073:0
 Sky News;BSkyB:11597:vC56:S19.2E:22000:305+131:306=eng:0:0:28707:1:1026:0
-Veronica/JETIX;CANAL+:12574:hC56:S19.2E:22000:518+8190:92=dut:38:622,602,100:5020:53:1109:0
+Veronica/JETIX;CANAL+:12574:hC56:S19.2E:22000:518+8190:92=dut:38:622,100:5020:53:1109:0
 BVN;CANAL+:12574:hC56:S19.2E:22000:515+8190:96=dut:36:0:5025:53:1109:0
 n-tv;RTL World:12187:hC34:S19.2E:27500:169:73=deu:80:0:12090:1:1089:0
 Al Jazeera;CANALSATELLITE:11567:vC56:S19.2E:22000:55:56=ara:0:0:9021:1:1024:0
@@ -37,7 +37,7 @@
 Eurosport;ZDFvision:11953:hC34:S19.2E:27500:410:420=deu:430:0:28009:1:1079:0
 EinsExtra;ARD:12109:hC34:S19.2E:27500:101:102=deu:0:0:28201:1:1073:0
 EinsFestival;ARD:12109:hC34:S19.2E:27500:201:202=deu:0:0:28202:1:1073:0
-EinsMuXx;ARD:12109:hC34:S19.2E:27500:301:302=deu:0:0:28203:1:1073:0
+EinsPlus;ARD:12109:hC34:S19.2E:27500:301:302=deu:0:0:28203:1:1073:0
 ZDFtheaterkanal;ZDFvision:11953:hC34:S19.2E:27500:1110:1120=deu:130:0:28016:1:1079:0
 ZDFdokukanal;ZDFvision:11953:hC34:S19.2E:27500:660:670=deu:130:0:28014:1:1079:0
 MDR FERNSEHEN;ARD:12109:hC34:S19.2E:27500:401:402=deu:404:0:28204:1:1073:0
@@ -51,7 +51,7 @@
 PREMIERE 5,PREM 5;PREMIERE:11797:hC34:S19.2E:27500:1279:1280=deu,1281=deu:32:1801,1722,1702:29:133:2:0
 PREMIERE 6,PREM 6;PREMIERE:11797:hC34:S19.2E:27500:1535:1536=deu:32:1702,1722,1801:41:133:2:0
 PREMIERE 7,PREM 7;PREMIERE:11797:hC34:S19.2E:27500:1023:1024=deu:32:1722,1702,1801:20:133:2:0
-DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:0:1722,1801,1702:34:133:17:0
+DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32:1722,1801,1702:34:133:17:0
 :Premiere Direkt
 PREMIERE DIREKT,DIREKT;PREMIERE:12031:hC34:S19.2E:27500:2815:2816=deu,2817=deu;2819=deu:0:0:18:133:4:0
 :PW Erotic
@@ -69,7 +69,7 @@
 Kabel 1 Austria;ProSiebenSat.1:12051:vC34:S19.2E:27500:166:167=deu:169:0:20004:1:1082:0
 ProSieben Schweiz;ProSiebenSat.1:12051:vC34:S19.2E:27500:289:290=deu:33:0:20001:1:1082:0
 FRANCE 5;CSAT:12207:vC34:S19.2E:27500:160:80=fra:32:500,100:8501:1:1090:0
-LCP;CSAT:12207:vC34:S19.2E:27500:165:100=fra:0:0:8506:1:1090:0
+LCP;CSAT:12207:vC34:S19.2E:27500:2047+8191:0:0:0:8506:1:1090:0
 ESCALES;ABSAT:12285:vC34:S19.2E:27500:165:100:41:500,100:17025:1:1094:0
 Best of Shopping;CSAT:12324:vC34:S19.2E:27500:160:80=fra:0:0:8612:1:1096:0
 ASTRA-Mosaic;ASTRA:12551:vC56:S19.2E:22000:175:176=fra:0:0:3988:1:1108:0
@@ -89,9 +89,9 @@
 TELE 5;BetaDigital:12480:vC34:S19.2E:27500:1535:1536=deu:38:0:51:133:33:0
 :@201 Sky
 Sky One;BSkyB:12226:hC23:S28.2E:27500:2305+2304:2306=eng:2307:960,961:4705:2:2027:0
-Sky Mix;BSkyB:12226:hC23:S28.2E:27500:2314+2304:2315=eng,2316=NAR:2317:960,961:5104:2:2027:0
+Sky Mix;BSkyB:12226:hC23:S28.2E:27500:2311+2304:2312=eng,2313=NAR:2314:960,961:5104:2:2027:0
 ITV2;BSkyB:10906:vC56:S28.2E:22000:2350:2351=eng:2353:960,961:10240:2:2054:0
-Sci-Fi;BSkyB:12148:hC23:S28.2E:27500:2320+2304:2321=eng:2322:960,961:4905:2:2023:0
+Sci-Fi;BSkyB:12148:hC23:S28.2E:27500:512+8190:640=eng:576:960,961:4905:2:2023:0
 Paramount;BSkyB:12187:hC23:S28.2E:27500:2313+2304:2317=eng,2318=NAR:2315:960,961:5904:2:2025:0
 Discovery;BSkyB:11875:hC23:S28.2E:27500:2304:2306=eng,2307=NAR:2305:960,961:6201:2:2009:0
 Sky Movies 1;BSkyB:11836:hC23:S28.2E:27500:518+8190:646=eng,653=NAR;686=eng:582:960,961:4303:2:2007:0
@@ -113,7 +113,7 @@
 S1T;BSkyB:12285:vC23:S28.2E:27500:513+8190:641=eng,661=NAR:577:960,961:4409:2:2030:0
 CNN;BSkyB:12051:vC23:S28.2E:27500:2313:2315=eng:2314:0:7140:2:2018:0
 BBC PARL'MNT:12129:vC23:S28.2E:27500:2304:2306=eng,2307=eng:2305:0:7300:2:2022:0
-JOLLY FILM;T-Systems/MTI:11200:vC56:S13.0E:27500:413:414=ita:0:0:4733:318:13400:0
+BTL TV;T-Systems/MTI:11200:vC56:S13.0E:27500:413:414=ita:0:0:4733:318:13400:0
 Euro1080;EURO1080:12168:vC34:S19.2E:27500:308:256:0:FF:21100:1:1088:0
 Astra HD:12441:vC34:S19.2E:27500:133+80:134=eng:0:FF:29700:0:0:0
 eng-WRN-multi;WRN:12597:vC34:S13.0E:27500:0:2132:0:0:8230:318:9400:0
diff -ruN vdr-1.3.23/channels.h vdr-1.3.24/channels.h
--- vdr-1.3.23/channels.h	2005-02-20 15:05:24.000000000 +0100
+++ vdr-1.3.24/channels.h	2005-05-07 15:07:09.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: channels.h 1.26 2005/02/20 14:05:24 kls Exp $
+ * $Id: channels.h 1.28 2005/05/07 13:07:09 kls Exp $
  */
 
 #ifndef __CHANNELS_H
@@ -24,6 +24,7 @@
 #define CHANNELMOD_ID       0x04
 #define CHANNELMOD_CA       0x10
 #define CHANNELMOD_TRANSP   0x20
+#define CHANNELMOD_LANGS    0x40
 #define CHANNELMOD_RETUNE   (CHANNELMOD_PIDS | CHANNELMOD_CA | CHANNELMOD_TRANSP)
 
 #define CHANNELSMOD_NONE    0
@@ -135,7 +136,7 @@
   ~cChannel();
   cChannel& operator= (const cChannel &Channel);
   cString ToText(void) const;
-  bool Parse(const char *s, bool AllowNonUniqueID = false);
+  bool Parse(const char *s);
   bool Save(FILE *f);
   const char *Name(void) const { return name; }
   const char *ShortName(bool OrName = false) const { return (OrName && isempty(shortName)) ? name : shortName; }
@@ -198,6 +199,7 @@
   int maxNumber;
   int modified;
   int beingEdited;
+  void DeleteDuplicateChannels(void);
 public:
   cChannels(void);
   bool Load(const char *FileName, bool AllowComments = false, bool MustExist = false);
diff -ruN vdr-1.3.23/config.h vdr-1.3.24/config.h
--- vdr-1.3.23/config.h	2005-03-05 16:44:35.000000000 +0100
+++ vdr-1.3.24/config.h	2005-05-05 13:04:18.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: config.h 1.216 2005/03/05 15:44:35 kls Exp $
+ * $Id: config.h 1.217 2005/05/05 11:04:18 kls Exp $
  */
 
 #ifndef __CONFIG_H
@@ -20,8 +20,8 @@
 #include "i18n.h"
 #include "tools.h"
 
-#define VDRVERSION  "1.3.23"
-#define VDRVERSNUM   10323  // Version * 10000 + Major * 100 + Minor
+#define VDRVERSION  "1.3.24"
+#define VDRVERSNUM   10324  // Version * 10000 + Major * 100 + Minor
 
 #define MAXPRIORITY 99
 #define MAXLIFETIME 99
diff -ruN vdr-1.3.23/device.c vdr-1.3.24/device.c
--- vdr-1.3.23/device.c	2005-02-27 14:55:15.000000000 +0100
+++ vdr-1.3.24/device.c	2005-05-07 17:04:17.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: device.c 1.99 2005/02/27 13:55:15 kls Exp $
+ * $Id: device.c 1.101 2005/05/07 15:04:17 kls Exp $
  */
 
 #include "device.h"
@@ -34,7 +34,7 @@
   int ExpectedLength(void) { return PacketSize(data); }
   static int PacketSize(const uchar *data);
   int Length(void) { return length; }
-  const uchar *Data(void) { return data; }
+  const uchar *Data(void) { return data; } // only valid if Length() >= 4
   void Reset(void);
   void Put(uchar c);
   void Put(const uchar *Data, int Length);
@@ -76,7 +76,7 @@
 
 void cPesAssembler::Put(uchar c)
 {
-  if (!length) {
+  if (length < 4) {
      tag = (tag << 8) | c;
      if ((tag & 0xFFFFFF00) == 0x00000100) {
         if (Realloc(4)) {
@@ -84,6 +84,8 @@
            length = 4;
            }
         }
+     else if (length < 3)
+        length++;
      }
   else if (Realloc(length + 1))
      data[length++] = c;
@@ -91,7 +93,7 @@
 
 void cPesAssembler::Put(const uchar *Data, int Length)
 {
-  while (!length && Length > 0) {
+  while (length < 4 && Length > 0) {
         Put(*Data++);
         Length--;
         }
@@ -268,7 +270,7 @@
 cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers)
 {
   cDevice *d = NULL;
-  int select = 7, pri;
+  int select = 8, pri;
 
   for (int i = 0; i < numDevices; i++) {
       bool ndr;
@@ -277,16 +279,18 @@
             pri = 0; // receiving and allows additional receivers
          else if (d && !device[i]->Receiving() && device[i]->ProvidesCa(Channel) < d->ProvidesCa(Channel))
             pri = 1; // free and fewer Ca's
+         else if (!device[i]->Receiving() && !device[i]->HasDecoder())
+            pri = 2; // free and not a full featured card
          else if (!device[i]->Receiving() && !device[i]->IsPrimaryDevice())
-            pri = 2; // free and not the primary device
+            pri = 3; // free and not the primary device
          else if (!device[i]->Receiving())
-            pri = 3; // free
+            pri = 4; // free
          else if (d && device[i]->Priority() < d->Priority())
-            pri = 4; // receiving but priority is lower
+            pri = 5; // receiving but priority is lower
          else if (d && device[i]->Priority() == d->Priority() && device[i]->ProvidesCa(Channel) < d->ProvidesCa(Channel))
-            pri = 5; // receiving with same priority but fewer Ca's
+            pri = 6; // receiving with same priority but fewer Ca's
          else
-            pri = 6; // all others
+            pri = 7; // all others
          if (pri < select) {
             select = pri;
             d = device[i];
diff -ruN vdr-1.3.23/dvbplayer.c vdr-1.3.24/dvbplayer.c
--- vdr-1.3.23/dvbplayer.c	2005-01-14 15:00:56.000000000 +0100
+++ vdr-1.3.24/dvbplayer.c	2005-05-08 16:52:49.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: dvbplayer.c 1.30 2005/01/14 14:00:56 kls Exp $
+ * $Id: dvbplayer.c 1.33 2005/05/08 14:52:49 kls Exp $
  */
 
 #include "dvbplayer.h"
@@ -263,6 +263,7 @@
 {
   Detach();
   Save();
+  delete readFrame; // might not have been stored in the buffer in Action()
   delete index;
   delete fileName;
   delete backTrace;
@@ -296,6 +297,7 @@
      nonBlockingFileReader->Clear();
   if ((readIndex = backTrace->Get(playDir == pdForward)) < 0)
      readIndex = writeIndex;
+  delete readFrame; // might not have been stored in the buffer in Action()
   readFrame = NULL;
   playFrame = NULL;
   ringBuffer->Clear();
@@ -370,9 +372,14 @@
 
   nonBlockingFileReader = new cNonBlockingFileReader;
   int Length = 0;
+  bool Sleep = false;
 
   running = true;
   while (running && (NextFile() || readIndex >= 0 || ringBuffer->Available() || !DeviceFlush(100))) {
+        if (Sleep) {
+           cCondWait::SleepMs(3); // this keeps the CPU load low
+           Sleep = false;
+           }
         cPoller Poller;
         if (DevicePoll(Poller, 100)) {
 
@@ -380,8 +387,8 @@
 
            // Read the next frame from the file:
 
-           if (!readFrame && (replayFile >= 0 || readIndex >= 0)) {
-              if (playMode != pmStill) {
+           if (playMode != pmStill && playMode != pmPause) {
+              if (!readFrame && (replayFile >= 0 || readIndex >= 0)) {
                  if (!nonBlockingFileReader->Reading()) {
                     if (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) {
                        uchar FileNumber;
@@ -438,16 +445,16 @@
                     break;
                     }
                  }
-              else
-                 cCondWait::SleepMs(3); // this keeps the CPU load low
-              }
 
-           // Store the frame in the buffer:
+              // Store the frame in the buffer:
 
-           if (readFrame) {
-              if (ringBuffer->Put(readFrame))
-                 readFrame = NULL;
+              if (readFrame) {
+                 if (ringBuffer->Put(readFrame))
+                    readFrame = NULL;
+                 }
               }
+           else
+              Sleep = true;
 
            // Get the next frame from the buffer:
 
diff -ruN vdr-1.3.23/dvbspu.c vdr-1.3.24/dvbspu.c
--- vdr-1.3.23/dvbspu.c	2005-02-06 10:54:51.000000000 +0100
+++ vdr-1.3.24/dvbspu.c	2005-05-07 13:13:48.000000000 +0200
@@ -8,7 +8,7 @@
  *
  * parts of this file are derived from the OMS program.
  *
- * $Id: dvbspu.c 1.12 2005/02/06 09:54:51 kls Exp $
+ * $Id: dvbspu.c 1.14 2005/05/07 11:13:48 kls Exp $
  */
 
 #include <assert.h>
@@ -143,6 +143,8 @@
     if (ret)
         DEBUG("MinSize: (%d, %d) x (%d, %d)\n",
               size.x1, size.y1, size.x2, size.y2);
+    if (size.x1 > size.x2 || size.y1 > size.y2)
+       return false;
 
     return ret;
 }
@@ -304,24 +306,6 @@
     hlpsize.y2 = -1;
 }
 
-int cDvbSpuDecoder::ScaleYcoord(int value)
-{
-    if (scaleMode == eSpuLetterBox) {
-        int offset = cDevice::PrimaryDevice()->GetVideoSystem() == vsPAL ? 72 : 60;
-        return lround((value * 3.0) / 4.0) + offset;
-        }
-    else
-        return value;
-}
-
-int cDvbSpuDecoder::ScaleYres(int value)
-{
-    if (scaleMode == eSpuLetterBox)
-        return lround((value * 3.0) / 4.0);
-    else
-        return value;
-}
-
 sDvbSpuRect cDvbSpuDecoder::CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDvbSpuRect bgsize, cBitmap *bgbmp)
 {
     sDvbSpuRect size;
@@ -365,22 +349,15 @@
     sDvbSpuRect hlsize;
 
     hlsize.x1 = hlpsize.x1;
-    hlsize.y1 = ScaleYcoord(hlpsize.y1);
+    hlsize.y1 = hlpsize.y1;
     hlsize.x2 = hlpsize.x2;
-    hlsize.y2 = ScaleYcoord(hlpsize.y2);
+    hlsize.y2 = hlpsize.y2;
 
     if (highlight)
         fg = spubmp->getBitmap(hlpDescr, palette, hlsize);
 
-    if (spubmp->getMinSize(palDescr, bgsize)) {
+    if (spubmp->getMinSize(palDescr, bgsize))
         bg = spubmp->getBitmap(palDescr, palette, bgsize);
-        if (scaleMode == eSpuLetterBox) {
-            // the coordinates have to be modified for letterbox
-            int y1 = ScaleYres(bgsize.y1) + bgsize.height();
-            bgsize.y2 = y1 + bgsize.height();
-            bgsize.y1 = y1;
-        }
-    }
 
     sDvbSpuRect areaSize = CalcAreaSize(hlsize, fg, bgsize, bg);
 
diff -ruN vdr-1.3.23/dvbspu.h vdr-1.3.24/dvbspu.h
--- vdr-1.3.23/dvbspu.h	2005-02-20 12:20:43.000000000 +0100
+++ vdr-1.3.24/dvbspu.h	2005-05-07 13:14:03.000000000 +0200
@@ -8,7 +8,7 @@
  *
  * parts of this file are derived from the OMS program.
  *
- * $Id: dvbspu.h 1.8 2005/02/20 11:20:43 kls Exp $
+ * $Id: dvbspu.h 1.9 2005/05/07 11:14:03 kls Exp $
  */
 
 #ifndef __DVBSPU_H
@@ -129,8 +129,6 @@
         return ((spu[0] << 8) | spu[1]);
     };
 
-    int ScaleYcoord(int value);
-    int ScaleYres(int value);
     sDvbSpuRect CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDvbSpuRect bgsize, cBitmap *bgbmp);
 
   public:
diff -ruN vdr-1.3.23/eitscan.c vdr-1.3.24/eitscan.c
--- vdr-1.3.23/eitscan.c	2004-10-31 17:19:49.000000000 +0100
+++ vdr-1.3.24/eitscan.c	2005-05-05 15:05:00.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: eitscan.c 1.23 2004/10/31 16:19:49 kls Exp $
+ * $Id: eitscan.c 1.24 2005/05/05 13:05:00 kls Exp $
  */
 
 #include "eitscan.h"
@@ -152,7 +152,7 @@
                                   if ((!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= 0x0100) && Device->ProvidesTransponder(Channel)) {
                                      if (Device == cDevice::PrimaryDevice() && !currentChannel) {
                                         currentChannel = Device->CurrentChannel();
-                                        Skins.Message(mtInfo, "Starting EPG scan");
+                                        Skins.Message(mtInfo, tr("Starting EPG scan"));
                                         }
                                      currentDevice = Device;//XXX see also dvbdevice.c!!!
                                      Device->SwitchChannel(Channel, false);
diff -ruN vdr-1.3.23/epg.c vdr-1.3.24/epg.c
--- vdr-1.3.23/epg.c	2005-03-20 13:34:19.000000000 +0100
+++ vdr-1.3.24/epg.c	2005-05-05 15:53:19.000000000 +0200
@@ -7,7 +7,7 @@
  * Original version (as used in VDR before 1.3.0) written by
  * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
  *
- * $Id: epg.c 1.27 2005/03/20 12:34:19 kls Exp $
+ * $Id: epg.c 1.29 2005/05/05 13:53:19 kls Exp $
  */
 
 #include "epg.h"
@@ -29,9 +29,7 @@
 {
   unsigned int Stream, Type;
   int n = sscanf(s, "%X %02X %3c %a[^\n]", &Stream, &Type, language, &description);
-  if (n != 4)
-     description = NULL;
-  else if (isempty(description)) {
+  if (n != 4 || isempty(description)) {
      free(description);
      description = NULL;
      }
@@ -225,7 +223,7 @@
 
 void cEvent::Dump(FILE *f, const char *Prefix) const
 {
-  if (startTime + duration >= time(NULL)) {
+  if (startTime + duration + Setup.EPGLinger * 60 >= time(NULL)) {
      fprintf(f, "%sE %u %ld %d %X\n", Prefix, eventID, startTime, duration, tableID);
      if (!isempty(title))
         fprintf(f, "%sT %s\n", Prefix, title);
diff -ruN vdr-1.3.23/i18n.c vdr-1.3.24/i18n.c
--- vdr-1.3.23/i18n.c	2005-03-12 11:43:16.000000000 +0100
+++ vdr-1.3.24/i18n.c	2005-05-05 15:12:54.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: i18n.c 1.185 2005/03/12 10:43:16 kls Exp $
+ * $Id: i18n.c 1.188 2005/05/05 13:12:54 kls Exp $
  *
  * Translations provided by:
  *
@@ -89,7 +89,7 @@
     "Português",
     "Français",
     "Norsk",
-    "suomi", // this is not a typo - it's really lowercase!
+    "suomi", // Finnish (this is not a typo - it's really lowercase!)
     "Polski",
     "Español",
     "ÅëëçíéêÜ", // Greek
@@ -1334,7 +1334,7 @@
     "PID de Vídeo",
     "PID Vidéo",
     "Vpid",
-    "Kuva PID",
+    "Kuva-PID",
     "Vpid",
     "Vpid",
     "Bßíôåï PID",
@@ -1355,7 +1355,7 @@
     "Ppid",
     "Ppid",
     "Ppid",
-    "Aikatieto PID",
+    "Aikatieto-PID",
     "Ppid",
     "Ppid",
     "Ppid",
@@ -1376,7 +1376,7 @@
     "PID Áudio (1)",
     "PID Audio (1)",
     "Apid1",
-    "Ääni PID1",
+    "Ääni-PID (1)",
     "Apid1",
     "Apid1",
     "Apid1",
@@ -1397,7 +1397,7 @@
     "Apid2",
     "PID Audio (2)",
     "Apid2",
-    "Ääni PID2",
+    "Ääni-PID (2)",
     "Apid2",
     "Apid2",
     "Apid2",
@@ -1418,7 +1418,7 @@
     "PID AC3 (1)",
     "PID AC3 (1)",
     "AC3pid1",
-    "Dolby PID1",
+    "Dolby-PID (1)",
     "Dpid1",
     "Dpid1",
     "Dpid1",
@@ -1439,7 +1439,7 @@
     "PID AC3 (2)",
     "PID AC3 (2)",
     "AC3pid2",
-    "Dolby PID2",
+    "Dolby-PID (2)",
     "Dpid2",
     "Dpid2",
     "Dpid2",
@@ -1460,7 +1460,7 @@
     "PID Teletexto",
     "PID Télétexte",
     "Tekst-TV pid",
-    "Teksti-TV PID",
+    "Teksti-TV-PID",
     "Tpid",
     "Tpid",
     "Tpid",
@@ -1502,7 +1502,7 @@
     "Sid",
     "Sid",
     "Sid",
-    "Palvelu ID",
+    "Palvelu-ID",
     "Sid",
     "Sid",
     "Sid",
@@ -3113,7 +3113,7 @@
     "ÈØàÞÚÞíÚàÐÝÝÞÕ Ø×ÞÑàÐÖÕÝØÕ",
     "",//TODO
     "",//TODO
-    "",//TODO
+    "Video display format",
   },
   { "pan&scan",
     "pan&scan",
@@ -5241,6 +5241,27 @@
     "Saate edastamise peatamine...",
     "Pausere live udsendelse...",
   },
+  { "Starting EPG scan",
+    "Beginne mit EPG-Scan",
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "Ohjelmaoppaan päivitys aloitettu",
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "",// TODO
+  },
   { "This plugin has no setup parameters!",
     "Dieses Plugin hat keine Setup-Parameter!",
     "Ta plugin nima nastavitvenih parametrov!",
diff -ruN vdr-1.3.23/libsi/Makefile vdr-1.3.24/libsi/Makefile
--- vdr-1.3.23/libsi/Makefile	2004-10-16 15:31:50.000000000 +0200
+++ vdr-1.3.24/libsi/Makefile	2005-05-05 13:01:46.000000000 +0200
@@ -1,7 +1,7 @@
 #
 # Makefile for a libsi
 #
-# $Id: Makefile 1.3 2004/10/16 13:31:50 kls Exp $
+# $Id: Makefile 1.4 2005/05/05 11:01:46 kls Exp $
 
 ### The C++ compiler and options:
 
@@ -11,6 +11,8 @@
 ARFLAGS = ru
 RANLIB = ranlib
 
+-include ../Make.config
+
 ### The directory environment:
 
 INCLUDES +=
diff -ruN vdr-1.3.23/libsi/descriptor.h vdr-1.3.24/libsi/descriptor.h
--- vdr-1.3.23/libsi/descriptor.h	2004-06-06 15:51:29.000000000 +0200
+++ vdr-1.3.24/libsi/descriptor.h	2005-05-08 16:08:19.000000000 +0200
@@ -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.10 2004/06/06 13:51:29 kls Exp $
+ *   $Id: descriptor.h 1.12 2005/05/08 14:08:19 kls Exp $
  *                                                                         *
  ***************************************************************************/
 
@@ -283,13 +283,13 @@
 
 class SubtitlingDescriptor : public Descriptor {
 public:
-   class Subtitling : public Descriptor {
+   class Subtitling : public LoopElement {
    public:
       char languageCode[4];
       int getSubtitlingType() const;
       int getCompositionPageId() const;
       int getAncillaryPageId() const;
-      virtual int getLength() { return sizeof(item_nvod_reference); }
+      virtual int getLength() { return sizeof(item_subtitling); }
    protected:
       virtual void Parse();
    private:
diff -ruN vdr-1.3.23/recording.c vdr-1.3.24/recording.c
--- vdr-1.3.23/recording.c	2005-02-12 11:17:47.000000000 +0100
+++ vdr-1.3.24/recording.c	2005-05-07 17:25:15.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: recording.c 1.96 2005/02/12 10:17:47 kls Exp $
+ * $Id: recording.c 1.98 2005/05/07 15:25:15 kls Exp $
  */
 
 #include "recording.h"
@@ -126,7 +126,7 @@
            while (r) {
                  if (!r->IsEdited() && r->lifetime < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever
                     if ((r->lifetime == 0 && Priority > r->priority) || // the recording has no guaranteed lifetime and the new recording has higher priority
-                        (time(NULL) - r->start) / SECSINDAY > r->lifetime) { // the recording's guaranteed lifetime has expired
+                        (r->lifetime > 0 && (time(NULL) - r->start) / SECSINDAY >= r->lifetime)) { // the recording's guaranteed lifetime has expired
                        if (r0) {
                           if (r->priority < r0->priority || (r->priority == r0->priority && r->start < r0->start))
                              r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities)
@@ -1124,8 +1124,21 @@
      fileNumber = Number;
      sprintf(pFileNumber, RECORDFILESUFFIX, fileNumber);
      if (record) {
-        if (access(fileName, F_OK) == 0) // file exists, let's try next suffix
-           return SetOffset(Number + 1);
+        if (access(fileName, F_OK) == 0) {
+           // files exists, check if it has non-zero size
+           struct stat buf;
+           if (stat(fileName, &buf) == 0) {
+              if (buf.st_size != 0)
+                 return SetOffset(Number + 1); // file exists and has non zero size, let's try next suffix
+              else {
+                 // zero size file, remove it
+                 dsyslog ("cFileName::SetOffset: removing zero-sized file %s\n", fileName);
+                 unlink (fileName);
+                 }
+              }
+           else
+              return SetOffset(Number + 1); // error with fstat - should not happen, just to be on the safe side
+           }
         else if (errno != ENOENT) { // something serious has happened
            LOG_ERROR_STR(fileName);
            return -1;
diff -ruN vdr-1.3.23/svdrp.c vdr-1.3.24/svdrp.c
--- vdr-1.3.23/svdrp.c	2005-03-20 16:04:00.000000000 +0100
+++ vdr-1.3.24/svdrp.c	2005-05-06 15:47:39.000000000 +0200
@@ -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.69 2005/03/20 15:04:00 kls Exp $
+ * $Id: svdrp.c 1.70 2005/05/06 13:47:39 kls Exp $
  */
 
 #include "svdrp.h"
@@ -875,7 +875,7 @@
         cChannel *channel = Channels.GetByNumber(n);
         if (channel) {
            cChannel ch;
-           if (ch.Parse(tail, true)) {
+           if (ch.Parse(tail)) {
               if (Channels.HasUniqueChannelID(&ch, channel)) {
                  *channel = ch;
                  Channels.ReNumber();
@@ -948,7 +948,7 @@
 {
   if (*Option) {
      cChannel ch;
-     if (ch.Parse(Option, true)) {
+     if (ch.Parse(Option)) {
         if (Channels.HasUniqueChannelID(&ch)) {
            cChannel *channel = new cChannel;
            *channel = ch;
diff -ruN vdr-1.3.23/thread.c vdr-1.3.24/thread.c
--- vdr-1.3.23/thread.c	2005-01-14 14:59:48.000000000 +0100
+++ vdr-1.3.24/thread.c	2005-05-06 16:39:15.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: thread.c 1.41 2005/01/14 13:59:48 kls Exp $
+ * $Id: thread.c 1.42 2005/05/06 14:39:15 kls Exp $
  */
 
 #include "thread.h"
@@ -17,6 +17,22 @@
 #include <unistd.h>
 #include "tools.h"
 
+static bool GetAbsTime(struct timespec *Abstime, int MillisecondsFromNow)
+{
+  struct timeval now;
+  if (gettimeofday(&now, NULL) == 0) {           // get current time
+     now.tv_usec += MillisecondsFromNow * 1000;  // add the timeout
+     while (now.tv_usec >= 1000000) {            // take care of an overflow
+           now.tv_sec++;
+           now.tv_usec -= 1000000;
+           }
+     Abstime->tv_sec = now.tv_sec;          // seconds
+     Abstime->tv_nsec = now.tv_usec * 1000; // nano seconds
+     return true;
+     }
+  return false;
+}
+
 // --- cCondWait -------------------------------------------------------------
 
 cCondWait::cCondWait(void)
@@ -44,15 +60,8 @@
   pthread_mutex_lock(&mutex);
   if (!signaled) {
      if (TimeoutMs) {
-        struct timeval now;
-        if (gettimeofday(&now, NULL) == 0) {  // get current time
-           now.tv_usec += TimeoutMs * 1000;   // add the timeout
-           int sec = now.tv_usec / 1000000;
-           now.tv_sec += sec;
-           now.tv_usec -= sec * 1000000;
-           struct timespec abstime;              // build timespec for timedwait
-           abstime.tv_sec = now.tv_sec;          // seconds
-           abstime.tv_nsec = now.tv_usec * 1000; // nano seconds
+        struct timespec abstime;
+        if (GetAbsTime(&abstime, TimeoutMs)) {
            while (!signaled) {
                  if (pthread_cond_timedwait(&cond, &mutex, &abstime) == ETIMEDOUT)
                     break;
@@ -105,17 +114,8 @@
   bool r = true; // true = condition signaled false = timeout
 
   if (Mutex.locked) {
-     struct timeval now;                   // unfortunately timedwait needs the absolute time, not the delta :-(
-     if (gettimeofday(&now, NULL) == 0) {  // get current time
-        now.tv_usec += TimeoutMs * 1000;   // add the timeout
-        while (now.tv_usec >= 1000000) {   // take care of an overflow
-              now.tv_sec++;
-              now.tv_usec -= 1000000;
-              }
-        struct timespec abstime;              // build timespec for timedwait
-        abstime.tv_sec = now.tv_sec;          // seconds
-        abstime.tv_nsec = now.tv_usec * 1000; // nano seconds
-
+     struct timespec abstime;
+     if (GetAbsTime(&abstime, TimeoutMs)) {
         int locked = Mutex.locked;
         Mutex.locked = 0; // have to clear the locked count here, as pthread_cond_timedwait
                           // does an implizit unlock of the mutex.
@@ -150,8 +150,8 @@
   int Result = 0;
   struct timespec abstime;
   if (TimeoutMs) {
-     abstime.tv_sec = TimeoutMs / 1000;
-     abstime.tv_nsec = (TimeoutMs % 1000) * 1000000;
+     if (!GetAbsTime(&abstime, TimeoutMs))
+        TimeoutMs = 0;
      }
   if (Write)
      Result = TimeoutMs ? pthread_rwlock_timedwrlock(&rwlock, &abstime) : pthread_rwlock_wrlock(&rwlock);
diff -ruN vdr-1.3.23/timers.c vdr-1.3.24/timers.c
--- vdr-1.3.23/timers.c	2005-03-20 15:50:37.000000000 +0100
+++ vdr-1.3.24/timers.c	2005-05-07 13:10:56.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: timers.c 1.30 2005/03/20 14:50:37 kls Exp $
+ * $Id: timers.c 1.31 2005/05/07 11:10:56 kls Exp $
  */
 
 #include "timers.h"
@@ -441,6 +441,10 @@
 void cTimer::SetRecording(bool Recording)
 {
   recording = Recording;
+  if (recording)
+     SetFlags(tfRecording);
+  else
+     ClrFlags(tfRecording);
   isyslog("timer %s %s", *ToDescr(), recording ? "start" : "stop");
 }
 
diff -ruN vdr-1.3.23/timers.h vdr-1.3.24/timers.h
--- vdr-1.3.23/timers.h	2005-03-20 15:47:45.000000000 +0100
+++ vdr-1.3.24/timers.h	2005-05-07 12:36:35.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: timers.h 1.18 2005/03/20 14:47:45 kls Exp $
+ * $Id: timers.h 1.19 2005/05/07 10:36:35 kls Exp $
  */
 
 #ifndef __TIMERS_H
@@ -19,6 +19,7 @@
                    tfActive    = 0x0001,
                    tfInstant   = 0x0002,
                    tfVps       = 0x0004,
+                   tfRecording = 0x0008,
                    tfAll       = 0xFFFF,
                  };
 enum eTimerMatch { tmNone, tmPartial, tmFull };
diff -ruN vdr-1.3.23/vdr.5 vdr-1.3.24/vdr.5
--- vdr-1.3.23/vdr.5	2005-03-19 16:20:47.000000000 +0100
+++ vdr-1.3.24/vdr.5	2005-05-07 12:40:23.000000000 +0200
@@ -8,7 +8,7 @@
 .\" License as specified in the file COPYING that comes with the
 .\" vdr distribution.
 .\"
-.\" $Id: vdr.5 1.35 2005/03/19 15:20:47 kls Exp $
+.\" $Id: vdr.5 1.36 2005/05/07 10:40:23 kls Exp $
 .\"
 .TH vdr 5 "19 Mar 2005" "1.3.23" "Video Disk Recorder Files"
 .SH NAME
@@ -210,6 +210,7 @@
 \fB1\fR@the timer is active (and will record if it hits)
 \fB2\fR@this is an instant recording timer
 \fB4\fR@this timer uses VPS
+\fB8\fR@this timer is currently recording (may only be up-to-date with SVDRP)
 .TE
 Bits other than these can be used by external programs to mark active timers
 and recognize if the user has modified them. When a user modifies an active
