diff -ruN vdr-1.7.10/CONTRIBUTORS vdr-1.7.11/CONTRIBUTORS
--- vdr-1.7.10/CONTRIBUTORS	2009-11-22 15:29:33.000000000 +0100
+++ vdr-1.7.11/CONTRIBUTORS	2010-01-06 12:41:14.000000000 +0100
@@ -600,6 +600,9 @@
  for suggesting to improve logging system time changes to avoid problems on slow
  systems under heavy load
  for making the SVDRP command PUTE support reading the EPG data from a given file
+ for a patch that was used to implement the command line options --edit and
+ --genindex
+ for suggesting to disable EPG processing for a while after a CLRE command
 
 Jeremy Hall <jhall@UU.NET>
  for fixing an incomplete initialization of the filter parameters in eit.c
@@ -1083,6 +1086,10 @@
  contain UTF-8 characters
  for fixing wrong bracketing in cChannel::SubtitlingType() etc.
  for fixing handling DVB subtitles for PES recordings
+ for fixing compiler warnings "format not a string literal and no format arguments"
+ in some syslog calls
+ for a patch that was used to implement handling the "component descriptor" ("genre")
+ for a patch that was used to implement handling the "parental rating descriptor"
 
 Ralf Klueber <ralf.klueber@vodafone.com>
  for reporting a bug in cutting a recording if there is only a single editing mark
@@ -1361,6 +1368,8 @@
  for fixing handling numeric keys in the channel display after switching channel
  groups
  for adding some missing 'const' statements to cBitmap
+ for making cDevice::AddPid() store the stream type of the given pid
+ for adding cFont::FontName() and cFont::Size()
 
 Thomas Bergwinkl <Thomas.Bergwinkl@vr-web.de>
  for fixing the validity check for channel IDs, because some providers use TIDs
@@ -1570,12 +1579,13 @@
 Kimmo Tykkala <tykkala@iki.fi>
  for pointing out a problem in showing the replay mode if the OSD is currently in use
 
-Arthur Konovalov <kasjas@hot.ee>
+Arthur Konovalov <artlov@gmail.com>
  for translating OSD texts to the Estonian language
  for fixing a missing ',' in the Greek OSD texts
  for fixing a missing ',' in the Swedish OSD texts
  for reporting problems with CAMs when checking the CAM status too frequently
  for reporting references to old *.vdr file names in MANUAL
+ for reporting that the video stream type was set to 2 even if the vpid was 0
 
 Milos Kapoun <m.kapoun@cra.cz>
  for suggesting to skip code table info in SI data
@@ -1651,6 +1661,7 @@
  for reporting wrong variable types in cIndexFile
  for reporting a problem with cDevice::PlayTsVideo() and cDevice::PlayTsAudio() in
  case only part of the buffer has been accepted by the device
+ for reporting missing defines for large files in the 'newplugin' script
 
 Sven Kreiensen <svenk@kammer.uni-hannover.de>
  for his help in keeping 'channels.conf.terr' up to date
@@ -1687,6 +1698,8 @@
  for reporting a problem with cStatus::MsgOsdTextItem() being called without a text
  for reporting a missing install-i18n in the install target in the Makefile
  for adding a missing 'const' to cRecording::FramesPerSecond()
+ for modifying cCharSetConv so that it can be used to convert from "whatever VDR uses"
+ to a given code
 
 Sascha Klek <sklek@gmx.de>
  for reporting a problem with the '0' key in the "Day" item of the "Timers" menu
@@ -2250,6 +2263,8 @@
  for suggesting to change the default for LOCDIR in Makefile and Make.config.template
  to "./locale", so that internationalization works by default when running VDR
  from within its source directory
+ for fixing stopping subtitle display when switching the primary device
+ for fixing plugin arguments corruption with glibc 2.11 on x86_64
 
 Antti Hartikainen <ami+vdr@ah.fi>
  for updating 'S13E' in 'sources.conf'
@@ -2459,6 +2474,8 @@
 
 Winfried K�hler <w_koehl@gmx.de>
  for fixing wrong value for TableIdBAT in libsi/si.h
+ for making several code modifications to avoid compiler warnings
+ for improving the description of the transponder parameters in vdr.5
 
 Igor M. Liplianin <liplianin@tut.by>
  for a patch that was used to convert VDR to the S2API driver API
@@ -2473,6 +2490,10 @@
  for fixing incrementing the continuity counter in cPatPmtGenerator::GetPmt()
  for pointing out that "DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
  -D_LARGEFILE64_SOURCE" should be added to Make.config.
+ for adding stream type 11172 AUDIO to cPatPmtParser::ParsePmt()
+ for removing the workaround for short channel names of "Kabel Deutschland"
+ for some fixes to dvbspu.[hc]
+ for fixing a busy loop when moving editing marks
 
 Timo Helkio <timolavi@mbnet.fi>
  for reporting a hangup when replaying a TS recording with subtitles activated
@@ -2481,6 +2502,7 @@
  for fixing handling the 'new' indicator in the recordings menu for TS recordings
  for reporting a problem with HD NTSC broadcasts that split frames over several payload
  units
+ for updating sources.conf
 
 Marcel Unbehaun <frostworks@gmx.de>
  for adding cRecordingInfo::GetEvent()
@@ -2514,3 +2536,10 @@
 
 Andreas Schaefers <andreas_schaefers@gmx.de>
  for adding the audio id to the call of PlayAudio() in cDevice::PlayTsAudio()
+
+Matthieu Castet <castet.matthieu@free.fr>
+ for improving SPU handling on devices with limited OSD capabilities
+
+Francesco Saverio Schiavarelli <fschiava@libero.it>
+  for reporting a problem with channels that have some encrypted components that
+  VDR doesn't use
diff -ruN vdr-1.7.10/HISTORY vdr-1.7.11/HISTORY
--- vdr-1.7.10/HISTORY	2009-11-22 15:29:14.000000000 +0100
+++ vdr-1.7.11/HISTORY	2010-01-06 12:40:54.000000000 +0100
@@ -6196,3 +6196,82 @@
   cause nothing but trouble. Besides, the core VDR doesn't use this, anyway.
 - Fixed the default value for "Pause key handling" in the MANUAL (reported by
   Diego Pierotto).
+
+2010-01-06: Version 1.7.11
+
+- Fixed resetting the file size when regenerating the index file.
+- The new function cDevice::PatPmtParser() can be used in derived devices to access
+  the PAT/PMT of the currently replayed material.
+- Updated the Italian OSD texts (thanks to Diego Pierotto).
+- The PCR pid in generated PMTs is now set to 0x1FFF ("no PCR pid") in
+  cPatPmtGenerator::GeneratePmt(), because VDR doesn't record the PCR pid.
+- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
+- The 'sky' plugin is no longer part of the VDR source.
+- Improved SPU handling on devices with limited OSD capabilities (thanks to
+  Matthieu Castet).
+- Several code modifications to avoid compiler warnings (thanks to Winfried K�hler).
+- Added stream type 11172 AUDIO to cPatPmtParser::ParsePmt() (thanks to Johann
+  Friedrichs).
+- Removed debug output of '-' from cTransfer::Receive().
+- Added defines for large files to the 'newplugin' script (reported by Udo Richter).
+- Removed the workaround for short channel names of "Kabel Deutschland", because
+  apparently they now have their data according to the DVB standard (thanks to
+  Johann Friedrichs).
+- Some fixes to dvbspu.[hc] (thanks to Johann Friedrichs).
+- Fixed a busy loop when moving editing marks (thanks to Johann Friedrichs).
+- Updated sources.conf (thanks to Derek Kelly).
+- Modified cCharSetConv so that it can be used to convert from "whatever VDR uses"
+  to a given code (thanks to Joachim Wilke).
+- Channel names containing commas are now handled correctly in channels.conf.
+  If a channel's short name contains a comma, it is replaced with a '.'.
+- cDevice now logs the device number when a new device is created.
+- Fixed handling STREAMTYPE_11172_AUDIO in cPatPmtParser::ParsePmt().
+- cParsePatPmt now has functions to retrieve the audio, dolby and subtitle pids.
+- cPatFilter::Process() now only stores CA descriptors for video and audio pids
+  (thanks to Francesco Saverio Schiavarelli for reporting a problem with channels
+  that have some encrypted components that VDR doesn't use).
+- cDevice::AddPid() now stores the stream type of the given pid (thanks to Andreas
+  Regel).
+- Added cFont::FontName() and cFont::Size() (thanks to Andreas Regel).
+- cPatPmtParser now also stores the audio stream types.
+- The support for full featured DVB cards of the TT/FuSi design has been moved
+  into the new plugin 'dvbsddevice'. On systems that use such a card as their
+  primary device, this plugin now needs to be loaded when running VDR in order
+  to view live or recorded video. If the plugin is not loaded, the card will
+  be treated like a budget DVB card, and there will be no OSD or viewing
+  capability.
+- Fixed handling the "CA PMT" generation (revised a change not mentioned in version
+  1.7.9's changes, which caused a malfunction with Conax and Viaccess CAMs).
+- Fixed stopping subtitle display when switching the primary device (thanks to
+  Anssi Hannula).
+  IMPORTANT NOTE TO PLUGIN AUTHORS: a plugin that implements a derived cDevice
+  class that can replay video must now call the MakePrimaryDevice() function of
+  its base class.
+- Fixed compiler warnings "format not a string literal and no format arguments"
+  in some syslog calls (thanks to Rolf Ahrenberg).
+- The new command line options --edit and --genindex can be used to edit a
+  recording or generate its index without actually starting the entire VDR
+  (based on a patch from Helmut Auer).
+- Improved the description of the transponder parameters in vdr.5 (thanks to
+  Winfried K�hler).
+- Avoiding setting the video stream type to 2 if the vpid is 0 (problem reported
+  by Arthur Konovalov).
+- Implemented handling the "Content Descriptor" (based on a patch from Rolf
+  Ahrenberg). The 'classic', 'sttng' and 'curses' skins display the textual
+  representation of the content descriptors as "genre". The epg.data file stores
+  the genre using the tag character 'G'.
+- Implemented handling the "Parental Rating Descriptor" (based on a patch from Rolf
+  Ahrenberg). The 'classic', 'sttng' and 'curses' skins display the parental
+  rating (if given) in their event displays. The epg.data file stores
+  the parental rating using the tag character 'R'.
+  IMPORTANT NOTE: if VDR doesn't display a parental rating, this does not
+  necessarily mean that the given programme is suitable for all audiences!
+- Rearranged cEvent members to minimize memory waste.
+- After a CLRE command, no further EPG processing is now done for 10 seconds,
+  so that data sent with subsequent PUTE commands doesn't interfere with data
+  from the broadcasters (suggested by Helmut Auer).
+- Added support for DVB cards with multiple fontends. Note that this only
+  works for DVB cards where each frontend can be used independently of all
+  the others on the same adapter.
+- Fixed plugin arguments corruption with glibc 2.11 on x86_64 (thanks to
+  Anssi Hannula).
diff -ruN vdr-1.7.10/Makefile vdr-1.7.11/Makefile
--- vdr-1.7.10/Makefile	2009-10-18 15:59:25.000000000 +0200
+++ vdr-1.7.11/Makefile	2009-12-29 12:20:50.000000000 +0100
@@ -4,7 +4,7 @@
 # See the main source file 'vdr.c' for copyright information and
 # how to reach the author.
 #
-# $Id: Makefile 2.4 2009/10/18 13:59:25 kls Exp $
+# $Id: Makefile 2.5 2009/12/29 11:20:50 kls Exp $
 
 .DELETE_ON_ERROR:
 
@@ -36,7 +36,7 @@
 
 SILIB    = $(LSIDIR)/libsi.a
 
-OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o dvbosd.o\
+OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\
        dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
        lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\
        receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
diff -ruN vdr-1.7.10/PLUGINS/src/dvbsddevice/COPYING vdr-1.7.11/PLUGINS/src/dvbsddevice/COPYING
--- vdr-1.7.10/PLUGINS/src/dvbsddevice/COPYING	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/dvbsddevice/COPYING	2009-12-28 13:53:28.000000000 +0100
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program 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.
+
+    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 General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff -ruN vdr-1.7.10/PLUGINS/src/dvbsddevice/HISTORY vdr-1.7.11/PLUGINS/src/dvbsddevice/HISTORY
--- vdr-1.7.10/PLUGINS/src/dvbsddevice/HISTORY	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/dvbsddevice/HISTORY	2010-01-04 15:16:11.000000000 +0100
@@ -0,0 +1,12 @@
+VDR Plugin 'dvbsddevice' Revision History
+-----------------------------------------
+
+2009-12-28: Version 0.0.1
+
+- Initial revision.
+
+2010-01-04: Version 0.0.2
+
+- Calling the MakePrimaryDevice() function of the base class to allow
+  the cDevice to stop displaying subtitles.
+- Added support for DVB cards with multiple fontends.
diff -ruN vdr-1.7.10/PLUGINS/src/dvbsddevice/Makefile vdr-1.7.11/PLUGINS/src/dvbsddevice/Makefile
--- vdr-1.7.10/PLUGINS/src/dvbsddevice/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/dvbsddevice/Makefile	2009-12-29 12:53:18.000000000 +0100
@@ -0,0 +1,112 @@
+#
+# Makefile for a Video Disk Recorder plugin
+#
+# $Id: Makefile 1.1 2009/12/29 11:53:18 kls Exp $
+
+# The official name of this plugin.
+# This name will be used in the '-P...' option of VDR to load the plugin.
+# By default the main source file also carries this name.
+# IMPORTANT: the presence of this macro is important for the Make.config
+# file. So it must be defined, even if it is not used here!
+#
+PLUGIN = dvbsddevice
+
+### The version number of this plugin (taken from the main source file):
+
+VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
+
+### The C++ compiler and options:
+
+CXX      ?= g++
+CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
+
+### The directory environment:
+
+VDRDIR = ../../..
+LIBDIR = ../../lib
+TMPDIR = /tmp
+
+### Allow user defined options to overwrite defaults:
+
+-include $(VDRDIR)/Make.config
+
+### The version number of VDR's plugin API (taken from VDR's "config.h"):
+
+APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
+
+### The name of the distribution archive:
+
+ARCHIVE = $(PLUGIN)-$(VERSION)
+PACKAGE = vdr-$(ARCHIVE)
+
+### Includes and Defines (add further entries here):
+
+INCLUDES += -I$(VDRDIR)/include
+
+DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
+
+DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
+
+### The object files (add further files here):
+
+OBJS = $(PLUGIN).o dvbsdffdevice.o dvbsdffosd.o
+
+### The main target:
+
+all: libvdr-$(PLUGIN).so i18n
+
+### Implicit rules:
+
+%.o: %.c
+	$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
+
+### Dependencies:
+
+MAKEDEP = $(CXX) -MM -MG
+DEPFILE = .dependencies
+$(DEPFILE): Makefile
+	@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
+
+-include $(DEPFILE)
+
+### Internationalization (I18N):
+
+PODIR     = po
+LOCALEDIR = $(VDRDIR)/locale
+I18Npo    = $(wildcard $(PODIR)/*.po)
+I18Nmsgs  = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
+I18Npot   = $(PODIR)/$(PLUGIN).pot
+
+%.mo: %.po
+	msgfmt -c -o $@ $<
+
+$(I18Npot): $(wildcard *.c)
+	xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<see README>' -o $@ $^
+
+%.po: $(I18Npot)
+	msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
+	@touch $@
+
+$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
+	@mkdir -p $(dir $@)
+	cp $< $@
+
+.PHONY: i18n
+i18n: $(I18Nmsgs) $(I18Npot)
+
+### Targets:
+
+libvdr-$(PLUGIN).so: $(OBJS)
+	$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
+	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+
+dist: clean
+	@-rm -rf $(TMPDIR)/$(ARCHIVE)
+	@mkdir $(TMPDIR)/$(ARCHIVE)
+	@cp -a * $(TMPDIR)/$(ARCHIVE)
+	@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
+	@-rm -rf $(TMPDIR)/$(ARCHIVE)
+	@echo Distribution package created as $(PACKAGE).tgz
+
+clean:
+	@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot
diff -ruN vdr-1.7.10/PLUGINS/src/dvbsddevice/README vdr-1.7.11/PLUGINS/src/dvbsddevice/README
--- vdr-1.7.10/PLUGINS/src/dvbsddevice/README	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/dvbsddevice/README	2009-12-29 13:00:29.000000000 +0100
@@ -0,0 +1,20 @@
+This is a "plugin" for the Video Disk Recorder (VDR).
+
+Written by:                  Klaus Schmidinger <Klaus.Schmidinger@tvdr.de>
+
+Project's homepage:          http://www.tvdr.de
+
+Latest version available at: ftp://ftp.tvdr.de/vdr
+
+This program 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.
+See the file COPYING for more information.
+
+Description:
+
+The 'dvbsddevice' plugin implements the output device for the
+"Full Featured" DVB cards based on the TechnoTrend/Fujitsu-Siemens
+design. This code was originally part of the core VDR source, and
+was moved into this plugin in VDR version 1.7.11.
diff -ruN vdr-1.7.10/PLUGINS/src/dvbsddevice/dvbsddevice.c vdr-1.7.11/PLUGINS/src/dvbsddevice/dvbsddevice.c
--- vdr-1.7.10/PLUGINS/src/dvbsddevice/dvbsddevice.c	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/dvbsddevice/dvbsddevice.c	2010-01-01 16:01:01.000000000 +0100
@@ -0,0 +1,35 @@
+/*
+ * dvbsddevice.c: A plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id: dvbsddevice.c 1.2 2010/01/01 15:01:01 kls Exp $
+ */
+
+#include <vdr/plugin.h>
+#include "dvbsdffdevice.h"
+
+static const char *VERSION        = "0.0.2";
+static const char *DESCRIPTION    = "SD Full Featured DVB device";
+
+class cPluginDvbsddevice : public cPlugin {
+private:
+  cDvbSdFfDeviceProbe *probe;
+public:
+  cPluginDvbsddevice(void);
+  virtual ~cPluginDvbsddevice();
+  virtual const char *Version(void) { return VERSION; }
+  virtual const char *Description(void) { return DESCRIPTION; }
+  };
+
+cPluginDvbsddevice::cPluginDvbsddevice(void)
+{
+  probe = new cDvbSdFfDeviceProbe;
+}
+
+cPluginDvbsddevice::~cPluginDvbsddevice()
+{
+  delete probe;
+}
+
+VDRPLUGINCREATOR(cPluginDvbsddevice); // Don't touch this!
diff -ruN vdr-1.7.10/PLUGINS/src/dvbsddevice/dvbsdffdevice.c vdr-1.7.11/PLUGINS/src/dvbsddevice/dvbsdffdevice.c
--- vdr-1.7.10/PLUGINS/src/dvbsddevice/dvbsdffdevice.c	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/dvbsddevice/dvbsdffdevice.c	2010-01-04 13:56:56.000000000 +0100
@@ -0,0 +1,799 @@
+/*
+ * dvbsdffdevice.h: The DVB SD Full Featured device interface
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id: dvbsdffdevice.c 2.25 2010/01/04 12:56:56 kls Exp $
+ */
+
+#include "dvbsdffdevice.h"
+#include <errno.h>
+#include <limits.h>
+#include <linux/videodev2.h>
+#include <linux/dvb/audio.h>
+#include <linux/dvb/dmx.h>
+#include <linux/dvb/video.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include "dvbsdffosd.h"
+#include "vdr/eitscan.h"
+#include "vdr/transfer.h"
+
+// --- cDvbSdFfDevice --------------------------------------------------------
+
+int cDvbSdFfDevice::devVideoOffset = -1;
+
+cDvbSdFfDevice::cDvbSdFfDevice(int Adapter, int Frontend)
+:cDvbDevice(Adapter, Frontend)
+{
+  spuDecoder = NULL;
+  digitalAudio = false;
+  playMode = pmNone;
+
+  // Devices that are only present on cards with decoders:
+
+  fd_osd      = DvbOpen(DEV_DVB_OSD,    adapter, frontend, O_RDWR);
+  fd_video    = DvbOpen(DEV_DVB_VIDEO,  adapter, frontend, O_RDWR | O_NONBLOCK);
+  fd_audio    = DvbOpen(DEV_DVB_AUDIO,  adapter, frontend, O_RDWR | O_NONBLOCK);
+  fd_stc      = DvbOpen(DEV_DVB_DEMUX,  adapter, frontend, O_RDWR);
+
+  // The offset of the /dev/video devices:
+
+  if (devVideoOffset < 0) { // the first one checks this
+     FILE *f = NULL;
+     char buffer[PATH_MAX];
+     for (int ofs = 0; ofs < 100; ofs++) {
+         snprintf(buffer, sizeof(buffer), "/proc/video/dev/video%d", ofs);
+         if ((f = fopen(buffer, "r")) != NULL) {
+            if (fgets(buffer, sizeof(buffer), f)) {
+               if (strstr(buffer, "DVB Board")) { // found the _first_ DVB card
+                  devVideoOffset = ofs;
+                  dsyslog("video device offset is %d", devVideoOffset);
+                  break;
+                  }
+               }
+            else
+               break;
+            fclose(f);
+            }
+         else
+            break;
+         }
+     if (devVideoOffset < 0)
+        devVideoOffset = 0;
+     if (f)
+        fclose(f);
+     }
+  devVideoIndex = devVideoOffset >= 0 ? devVideoOffset++ : -1;
+
+  // Video format:
+
+  SetVideoFormat(Setup.VideoFormat);
+}
+
+cDvbSdFfDevice::~cDvbSdFfDevice()
+{
+  delete spuDecoder;
+  // We're not explicitly closing any device files here, since this sometimes
+  // caused segfaults. Besides, the program is about to terminate anyway...
+}
+
+void cDvbSdFfDevice::MakePrimaryDevice(bool On)
+{
+  if (On)
+     new cDvbOsdProvider(fd_osd);
+  cDvbDevice::MakePrimaryDevice(On);
+}
+
+bool cDvbSdFfDevice::HasDecoder(void) const
+{
+  return true;
+}
+
+cSpuDecoder *cDvbSdFfDevice::GetSpuDecoder(void)
+{
+  if (!spuDecoder && IsPrimaryDevice())
+     spuDecoder = new cDvbSpuDecoder();
+  return spuDecoder;
+}
+
+uchar *cDvbSdFfDevice::GrabImage(int &Size, bool Jpeg, int Quality, int SizeX, int SizeY)
+{
+  if (devVideoIndex < 0)
+     return NULL;
+  char buffer[PATH_MAX];
+  snprintf(buffer, sizeof(buffer), "%s%d", DEV_VIDEO, devVideoIndex);
+  int videoDev = open(buffer, O_RDWR);
+  if (videoDev >= 0) {
+     uchar *result = NULL;
+     // set up the size and RGB
+     v4l2_format fmt;
+     memset(&fmt, 0, sizeof(fmt));
+     fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+     fmt.fmt.pix.width = SizeX;
+     fmt.fmt.pix.height = SizeY;
+     fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_BGR24;
+     fmt.fmt.pix.field = V4L2_FIELD_ANY;
+     if (ioctl(videoDev, VIDIOC_S_FMT, &fmt) == 0) {
+        v4l2_requestbuffers reqBuf;
+        memset(&reqBuf, 0, sizeof(reqBuf));
+        reqBuf.count = 2;
+        reqBuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+        reqBuf.memory = V4L2_MEMORY_MMAP;
+        if (ioctl(videoDev, VIDIOC_REQBUFS, &reqBuf) >= 0) {
+           v4l2_buffer mbuf;
+           memset(&mbuf, 0, sizeof(mbuf));
+           mbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+           mbuf.memory = V4L2_MEMORY_MMAP;
+           if (ioctl(videoDev, VIDIOC_QUERYBUF, &mbuf) == 0) {
+              int msize = mbuf.length;
+              unsigned char *mem = (unsigned char *)mmap(0, msize, PROT_READ | PROT_WRITE, MAP_SHARED, videoDev, 0);
+              if (mem && mem != (unsigned char *)-1) {
+                 v4l2_buffer buf;
+                 memset(&buf, 0, sizeof(buf));
+                 buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+                 buf.memory = V4L2_MEMORY_MMAP;
+                 buf.index = 0;
+                 if (ioctl(videoDev, VIDIOC_QBUF, &buf) == 0) {
+                    v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+                    if (ioctl (videoDev, VIDIOC_STREAMON, &type) == 0) {
+                       memset(&buf, 0, sizeof(buf));
+                       buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+                       buf.memory = V4L2_MEMORY_MMAP;
+                       buf.index = 0;
+                       if (ioctl(videoDev, VIDIOC_DQBUF, &buf) == 0) {
+                          if (ioctl(videoDev, VIDIOC_STREAMOFF, &type) == 0) {
+                             // make RGB out of BGR:
+                             int memsize = fmt.fmt.pix.width * fmt.fmt.pix.height;
+                             unsigned char *mem1 = mem;
+                             for (int i = 0; i < memsize; i++) {
+                                 unsigned char tmp = mem1[2];
+                                 mem1[2] = mem1[0];
+                                 mem1[0] = tmp;
+                                 mem1 += 3;
+                                 }
+
+                             if (Quality < 0)
+                                Quality = 100;
+
+                             dsyslog("grabbing to %s %d %d %d", Jpeg ? "JPEG" : "PNM", Quality, fmt.fmt.pix.width, fmt.fmt.pix.height);
+                             if (Jpeg) {
+                                // convert to JPEG:
+                                result = RgbToJpeg(mem, fmt.fmt.pix.width, fmt.fmt.pix.height, Size, Quality);
+                                if (!result)
+                                   esyslog("ERROR: failed to convert image to JPEG");
+                                }
+                             else {
+                                // convert to PNM:
+                                char buf[32];
+                                snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", fmt.fmt.pix.width, fmt.fmt.pix.height);
+                                int l = strlen(buf);
+                                int bytes = memsize * 3;
+                                Size = l + bytes;
+                                result = MALLOC(uchar, Size);
+                                if (result) {
+                                   memcpy(result, buf, l);
+                                   memcpy(result + l, mem, bytes);
+                                   }
+                                else
+                                   esyslog("ERROR: failed to convert image to PNM");
+                                }
+                             }
+                          else
+                             esyslog("ERROR: video device VIDIOC_STREAMOFF failed");
+                          }
+                       else
+                          esyslog("ERROR: video device VIDIOC_DQBUF failed");
+                       }
+                    else
+                       esyslog("ERROR: video device VIDIOC_STREAMON failed");
+                    }
+                 else
+                    esyslog("ERROR: video device VIDIOC_QBUF failed");
+                 munmap(mem, msize);
+                 }
+              else
+                 esyslog("ERROR: failed to memmap video device");
+              }
+           else
+              esyslog("ERROR: video device VIDIOC_QUERYBUF failed");
+           }
+        else
+           esyslog("ERROR: video device VIDIOC_REQBUFS failed");
+        }
+     else
+        esyslog("ERROR: video device VIDIOC_S_FMT failed");
+     close(videoDev);
+     return result;
+     }
+  else
+     LOG_ERROR_STR(buffer);
+  return NULL;
+}
+
+void cDvbSdFfDevice::SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat)
+{
+  cDevice::SetVideoDisplayFormat(VideoDisplayFormat);
+  if (Setup.VideoFormat) {
+     CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_LETTER_BOX));
+     }
+  else {
+     switch (VideoDisplayFormat) {
+       case vdfPanAndScan:
+            CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_PAN_SCAN));
+            break;
+       case vdfLetterBox:
+            CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_LETTER_BOX));
+            break;
+       case vdfCenterCutOut:
+            CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_CENTER_CUT_OUT));
+            break;
+       default: esyslog("ERROR: unknown video display format %d", VideoDisplayFormat);
+       }
+     }
+}
+
+void cDvbSdFfDevice::SetVideoFormat(bool VideoFormat16_9)
+{
+  CHECK(ioctl(fd_video, VIDEO_SET_FORMAT, VideoFormat16_9 ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3));
+  SetVideoDisplayFormat(eVideoDisplayFormat(Setup.VideoDisplayFormat));
+}
+
+eVideoSystem cDvbSdFfDevice::GetVideoSystem(void)
+{
+  eVideoSystem VideoSystem = vsPAL;
+  if (fd_video >= 0) {
+     video_size_t vs;
+     if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) {
+        if (vs.h == 480 || vs.h == 240)
+           VideoSystem = vsNTSC;
+        }
+     else
+        LOG_ERROR;
+     }
+  return VideoSystem;
+}
+
+void cDvbSdFfDevice::GetVideoSize(int &Width, int &Height, double &VideoAspect)
+{
+  if (fd_video >= 0) {
+     video_size_t vs;
+     if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) {
+        Width = vs.w;
+        Height = vs.h;
+        switch (vs.aspect_ratio) {
+          default:
+          case VIDEO_FORMAT_4_3:   VideoAspect =  4.0 / 3.0; break;
+          case VIDEO_FORMAT_16_9:  VideoAspect = 16.0 / 9.0; break;
+          case VIDEO_FORMAT_221_1: VideoAspect =       2.21; break;
+          }
+        return;
+        }
+     else
+        LOG_ERROR;
+     }
+  cDevice::GetVideoSize(Width, Height, VideoAspect);
+}
+
+void cDvbSdFfDevice::GetOsdSize(int &Width, int &Height, double &PixelAspect)
+{
+  if (fd_video >= 0) {
+     video_size_t vs;
+     if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) {
+        Width = 720;
+        if (vs.h != 480 && vs.h != 240)
+           Height = 576; // PAL
+        else
+           Height = 480; // NTSC
+        switch (Setup.VideoFormat ? vs.aspect_ratio : VIDEO_FORMAT_4_3) {
+          default:
+          case VIDEO_FORMAT_4_3:   PixelAspect =  4.0 / 3.0; break;
+          case VIDEO_FORMAT_221_1: // FF DVB cards only distinguish between 4:3 and 16:9
+          case VIDEO_FORMAT_16_9:  PixelAspect = 16.0 / 9.0; break;
+          }
+        PixelAspect /= double(Width) / Height;
+        return;
+        }
+     else
+        LOG_ERROR;
+     }
+  cDevice::GetOsdSize(Width, Height, PixelAspect);
+}
+
+bool cDvbSdFfDevice::SetAudioBypass(bool On)
+{
+  if (setTransferModeForDolbyDigital != 1)
+     return false;
+  return ioctl(fd_audio, AUDIO_SET_BYPASS_MODE, On) == 0;
+}
+
+//                                   ptAudio        ptVideo        ptPcr        ptTeletext        ptDolby        ptOther
+static dmx_pes_type_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_PCR, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER };
+
+bool cDvbSdFfDevice::SetPid(cPidHandle *Handle, int Type, bool On)
+{
+  if (Handle->pid) {
+     dmx_pes_filter_params pesFilterParams;
+     memset(&pesFilterParams, 0, sizeof(pesFilterParams));
+     if (On) {
+        if (Handle->handle < 0) {
+           Handle->handle = DvbOpen(DEV_DVB_DEMUX, adapter, frontend, O_RDWR | O_NONBLOCK, true);
+           if (Handle->handle < 0) {
+              LOG_ERROR;
+              return false;
+              }
+           }
+        pesFilterParams.pid     = Handle->pid;
+        pesFilterParams.input   = DMX_IN_FRONTEND;
+        pesFilterParams.output  = (Type <= ptTeletext && Handle->used <= 1) ? DMX_OUT_DECODER : DMX_OUT_TS_TAP;
+        pesFilterParams.pes_type= PesTypes[Type < ptOther ? Type : ptOther];
+        pesFilterParams.flags   = DMX_IMMEDIATE_START;
+        if (ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
+           LOG_ERROR;
+           return false;
+           }
+        }
+     else if (!Handle->used) {
+        CHECK(ioctl(Handle->handle, DMX_STOP));
+        if (Type <= ptTeletext) {
+           pesFilterParams.pid     = 0x1FFF;
+           pesFilterParams.input   = DMX_IN_FRONTEND;
+           pesFilterParams.output  = DMX_OUT_DECODER;
+           pesFilterParams.pes_type= PesTypes[Type];
+           pesFilterParams.flags   = DMX_IMMEDIATE_START;
+           CHECK(ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams));
+           if (PesTypes[Type] == DMX_PES_VIDEO) // let's only do this once
+              SetPlayMode(pmNone); // necessary to switch a PID from DMX_PES_VIDEO/AUDIO to DMX_PES_OTHER
+           }
+        close(Handle->handle);
+        Handle->handle = -1;
+        }
+     }
+  return true;
+}
+
+void cDvbSdFfDevice::TurnOffLiveMode(bool LiveView)
+{
+  if (LiveView) {
+     // Avoid noise while switching:
+     CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
+     CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
+     CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
+     CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
+     }
+
+  // Turn off live PIDs:
+
+  DetachAll(pidHandles[ptAudio].pid);
+  DetachAll(pidHandles[ptVideo].pid);
+  DetachAll(pidHandles[ptPcr].pid);
+  DetachAll(pidHandles[ptTeletext].pid);
+  DelPid(pidHandles[ptAudio].pid);
+  DelPid(pidHandles[ptVideo].pid);
+  DelPid(pidHandles[ptPcr].pid, ptPcr);
+  DelPid(pidHandles[ptTeletext].pid);
+  DelPid(pidHandles[ptDolby].pid);
+}
+
+bool cDvbSdFfDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
+{
+  int apid = Channel->Apid(0);
+  int vpid = Channel->Vpid();
+  int dpid = Channel->Dpid(0);
+
+  bool DoTune = !IsTunedToTransponder(Channel);
+
+  bool pidHandlesVideo = pidHandles[ptVideo].pid == vpid;
+  bool pidHandlesAudio = pidHandles[ptAudio].pid == apid;
+
+  bool TurnOffLivePIDs = DoTune
+                         || !IsPrimaryDevice()
+                         || LiveView // for a new live view the old PIDs need to be turned off
+                         || pidHandlesVideo // for recording the PIDs must be shifted from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER
+                         ;
+
+  bool StartTransferMode = IsPrimaryDevice() && !DoTune
+                           && (LiveView && HasPid(vpid ? vpid : apid) && (!pidHandlesVideo || (!pidHandlesAudio && (dpid ? pidHandles[ptAudio].pid != dpid : true)))// the PID is already set as DMX_PES_OTHER
+                              || !LiveView && (pidHandlesVideo || pidHandlesAudio) // a recording is going to shift the PIDs from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER
+                              );
+  if (CamSlot() && !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), CamSlot()->SlotNumber()))
+     StartTransferMode |= LiveView && IsPrimaryDevice() && Channel->Ca() >= CA_ENCRYPTED_MIN;
+
+  bool TurnOnLivePIDs = !StartTransferMode && LiveView;
+
+  // Turn off live PIDs if necessary:
+
+  if (TurnOffLivePIDs)
+     TurnOffLiveMode(LiveView);
+
+  // Set the tuner:
+
+  if (!cDvbDevice::SetChannelDevice(Channel, LiveView))
+     return false;
+
+  // If this channel switch was requested by the EITScanner we don't wait for
+  // a lock and don't set any live PIDs (the EITScanner will wait for the lock
+  // by itself before setting any filters):
+
+  if (EITScanner.UsesDevice(this)) //XXX
+     return true;
+
+  // PID settings:
+
+  if (TurnOnLivePIDs) {
+     SetAudioBypass(false);
+     if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(vpid, ptVideo) && AddPid(apid, ptAudio))) {
+        esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->Number(), CardIndex() + 1);
+        return false;
+        }
+     if (IsPrimaryDevice())
+        AddPid(Channel->Tpid(), ptTeletext);
+     CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true)); // actually one would expect 'false' here, but according to Marco Schl��ler <marco@lordzodiac.de> this works
+                                                   // to avoid missing audio after replaying a DVD; with 'false' there is an audio disturbance when switching
+                                                   // between two channels on the same transponder on DVB-S
+     CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
+     }
+  else if (StartTransferMode)
+     cControl::Launch(new cTransferControl(this, Channel->GetChannelID(), vpid, Channel->Apids(), Channel->Dpids(), Channel->Spids()));
+
+  return true;
+}
+
+int cDvbSdFfDevice::GetAudioChannelDevice(void)
+{
+  audio_status_t as;
+  CHECK(ioctl(fd_audio, AUDIO_GET_STATUS, &as));
+  return as.channel_select;
+}
+
+void cDvbSdFfDevice::SetAudioChannelDevice(int AudioChannel)
+{
+  CHECK(ioctl(fd_audio, AUDIO_CHANNEL_SELECT, AudioChannel));
+}
+
+void cDvbSdFfDevice::SetVolumeDevice(int Volume)
+{
+  if (digitalAudio)
+     Volume = 0;
+  audio_mixer_t am;
+  // conversion for linear volume response:
+  am.volume_left = am.volume_right = 2 * Volume - Volume * Volume / 255;
+  CHECK(ioctl(fd_audio, AUDIO_SET_MIXER, &am));
+}
+
+void cDvbSdFfDevice::SetDigitalAudioDevice(bool On)
+{
+  if (digitalAudio != On) {
+     if (digitalAudio)
+        cCondWait::SleepMs(1000); // Wait until any leftover digital data has been flushed
+     digitalAudio = On;
+     SetVolumeDevice(On || IsMute() ? 0 : CurrentVolume());
+     }
+}
+
+void cDvbSdFfDevice::SetAudioTrackDevice(eTrackType Type)
+{
+  const tTrackId *TrackId = GetTrack(Type);
+  if (TrackId && TrackId->id) {
+     SetAudioBypass(false);
+     if (IS_AUDIO_TRACK(Type) || (IS_DOLBY_TRACK(Type) && SetAudioBypass(true))) {
+        if (pidHandles[ptAudio].pid && pidHandles[ptAudio].pid != TrackId->id) {
+           DetachAll(pidHandles[ptAudio].pid);
+           if (CamSlot())
+              CamSlot()->SetPid(pidHandles[ptAudio].pid, false);
+           pidHandles[ptAudio].pid = TrackId->id;
+           SetPid(&pidHandles[ptAudio], ptAudio, true);
+           if (CamSlot()) {
+              CamSlot()->SetPid(pidHandles[ptAudio].pid, true);
+              CamSlot()->StartDecrypting();
+              }
+           }
+        }
+     else if (IS_DOLBY_TRACK(Type)) {
+        if (setTransferModeForDolbyDigital == 0)
+           return;
+        // Currently this works only in Transfer Mode
+        ForceTransferMode();
+        }
+     }
+}
+
+bool cDvbSdFfDevice::CanReplay(void) const
+{
+  return cDevice::CanReplay();
+}
+
+bool cDvbSdFfDevice::SetPlayMode(ePlayMode PlayMode)
+{
+  if (PlayMode != pmExtern_THIS_SHOULD_BE_AVOIDED && fd_video < 0 && fd_audio < 0) {
+     // reopen the devices
+     fd_video = DvbOpen(DEV_DVB_VIDEO, adapter, frontend, O_RDWR | O_NONBLOCK);
+     fd_audio = DvbOpen(DEV_DVB_AUDIO, adapter, frontend, O_RDWR | O_NONBLOCK);
+     SetVideoFormat(Setup.VideoFormat);
+     }
+
+  switch (PlayMode) {
+    case pmNone:
+         // special handling to return from PCM replay:
+         CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
+         CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
+         CHECK(ioctl(fd_video, VIDEO_PLAY));
+
+         CHECK(ioctl(fd_video, VIDEO_STOP, true));
+         CHECK(ioctl(fd_audio, AUDIO_STOP, true));
+         CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
+         CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
+         CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX));
+         CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX));
+         CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
+         CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false));
+         break;
+    case pmAudioVideo:
+    case pmAudioOnlyBlack:
+         if (playMode == pmNone)
+            TurnOffLiveMode(true);
+         CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
+         CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY));
+         CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, PlayMode == pmAudioVideo));
+         CHECK(ioctl(fd_audio, AUDIO_PLAY));
+         CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
+         CHECK(ioctl(fd_video, VIDEO_PLAY));
+         break;
+    case pmAudioOnly:
+         CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
+         CHECK(ioctl(fd_audio, AUDIO_STOP, true));
+         CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
+         CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY));
+         CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
+         CHECK(ioctl(fd_audio, AUDIO_PLAY));
+         CHECK(ioctl(fd_video, VIDEO_SET_BLANK, false));
+         break;
+    case pmVideoOnly:
+         CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
+         CHECK(ioctl(fd_video, VIDEO_STOP, true));
+         CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX));
+         CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
+         CHECK(ioctl(fd_audio, AUDIO_PLAY));
+         CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
+         CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
+         CHECK(ioctl(fd_video, VIDEO_PLAY));
+         break;
+    case pmExtern_THIS_SHOULD_BE_AVOIDED:
+         close(fd_video);
+         close(fd_audio);
+         fd_video = fd_audio = -1;
+         break;
+    default: esyslog("ERROR: unknown playmode %d", PlayMode);
+    }
+  playMode = PlayMode;
+  return true;
+}
+
+int64_t cDvbSdFfDevice::GetSTC(void)
+{
+  if (fd_stc >= 0) {
+     struct dmx_stc stc;
+     stc.num = 0;
+     if (ioctl(fd_stc, DMX_GET_STC, &stc) == -1) {
+        esyslog("ERROR: stc %d: %m", CardIndex() + 1);
+        return -1;
+        }
+     return stc.stc / stc.base;
+     }
+  return -1;
+}
+
+void cDvbSdFfDevice::TrickSpeed(int Speed)
+{
+  if (fd_video >= 0)
+     CHECK(ioctl(fd_video, VIDEO_SLOWMOTION, Speed));
+}
+
+void cDvbSdFfDevice::Clear(void)
+{
+  if (fd_video >= 0)
+     CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
+  if (fd_audio >= 0)
+     CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
+  cDevice::Clear();
+}
+
+void cDvbSdFfDevice::Play(void)
+{
+  if (playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) {
+     if (fd_audio >= 0)
+        CHECK(ioctl(fd_audio, AUDIO_CONTINUE));
+     }
+  else {
+     if (fd_audio >= 0) {
+        CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
+        CHECK(ioctl(fd_audio, AUDIO_CONTINUE));
+        }
+     if (fd_video >= 0)
+        CHECK(ioctl(fd_video, VIDEO_CONTINUE));
+     }
+  cDevice::Play();
+}
+
+void cDvbSdFfDevice::Freeze(void)
+{
+  if (playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) {
+     if (fd_audio >= 0)
+        CHECK(ioctl(fd_audio, AUDIO_PAUSE));
+     }
+  else {
+     if (fd_audio >= 0) {
+        CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
+        CHECK(ioctl(fd_audio, AUDIO_PAUSE));
+        }
+     if (fd_video >= 0)
+        CHECK(ioctl(fd_video, VIDEO_FREEZE));
+     }
+  cDevice::Freeze();
+}
+
+void cDvbSdFfDevice::Mute(void)
+{
+  if (fd_audio >= 0) {
+     CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
+     CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
+     }
+  cDevice::Mute();
+}
+
+void cDvbSdFfDevice::StillPicture(const uchar *Data, int Length)
+{
+  if (!Data || Length < TS_SIZE)
+     return;
+  if (Data[0] == 0x47) {
+     // TS data
+     cDevice::StillPicture(Data, Length);
+     }
+  else if (Data[0] == 0x00 && Data[1] == 0x00 && Data[2] == 0x01 && (Data[3] & 0xF0) == 0xE0) {
+     // PES data
+     char *buf = MALLOC(char, Length);
+     if (!buf)
+        return;
+     int i = 0;
+     int blen = 0;
+     while (i < Length - 6) {
+           if (Data[i] == 0x00 && Data[i + 1] == 0x00 && Data[i + 2] == 0x01) {
+              int len = Data[i + 4] * 256 + Data[i + 5];
+              if ((Data[i + 3] & 0xF0) == 0xE0) { // video packet
+                 // skip PES header
+                 int offs = i + 6;
+                 // skip header extension
+                 if ((Data[i + 6] & 0xC0) == 0x80) {
+                    // MPEG-2 PES header
+                    if (Data[i + 8] >= Length)
+                       break;
+                    offs += 3;
+                    offs += Data[i + 8];
+                    len -= 3;
+                    len -= Data[i + 8];
+                    if (len < 0 || offs + len > Length)
+                       break;
+                    }
+                 else {
+                    // MPEG-1 PES header
+                    while (offs < Length && len > 0 && Data[offs] == 0xFF) {
+                          offs++;
+                          len--;
+                          }
+                    if (offs <= Length - 2 && len >= 2 && (Data[offs] & 0xC0) == 0x40) {
+                       offs += 2;
+                       len -= 2;
+                       }
+                    if (offs <= Length - 5 && len >= 5 && (Data[offs] & 0xF0) == 0x20) {
+                       offs += 5;
+                       len -= 5;
+                       }
+                    else if (offs <= Length - 10 && len >= 10 && (Data[offs] & 0xF0) == 0x30) {
+                       offs += 10;
+                       len -= 10;
+                       }
+                    else if (offs < Length && len > 0) {
+                       offs++;
+                       len--;
+                       }
+                    }
+                 if (blen + len > Length) // invalid PES length field
+                    break;
+                 memcpy(&buf[blen], &Data[offs], len);
+                 i = offs + len;
+                 blen += len;
+                 }
+              else if (Data[i + 3] >= 0xBD && Data[i + 3] <= 0xDF) // other PES packets
+                 i += len + 6;
+              else
+                 i++;
+              }
+           else
+              i++;
+           }
+     video_still_picture sp = { buf, blen };
+     CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
+     free(buf);
+     }
+  else {
+     // non-PES data
+     video_still_picture sp = { (char *)Data, Length };
+     CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
+     }
+}
+
+bool cDvbSdFfDevice::Poll(cPoller &Poller, int TimeoutMs)
+{
+  Poller.Add((playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) ? fd_audio : fd_video, true);
+  return Poller.Poll(TimeoutMs);
+}
+
+bool cDvbSdFfDevice::Flush(int TimeoutMs)
+{
+  //TODO actually this function should wait until all buffered data has been processed by the card, but how?
+  return true;
+}
+
+int cDvbSdFfDevice::PlayVideo(const uchar *Data, int Length)
+{
+  return WriteAllOrNothing(fd_video, Data, Length, 1000, 10);
+}
+
+int cDvbSdFfDevice::PlayAudio(const uchar *Data, int Length, uchar Id)
+{
+  return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10);
+}
+
+int cDvbSdFfDevice::PlayTsVideo(const uchar *Data, int Length)
+{
+  return WriteAllOrNothing(fd_video, Data, Length, 1000, 10);
+}
+
+int cDvbSdFfDevice::PlayTsAudio(const uchar *Data, int Length)
+{
+  return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10);
+}
+
+// --- cDvbSdFfDeviceProbe ---------------------------------------------------
+
+bool cDvbSdFfDeviceProbe::Probe(int Adapter, int Frontend)
+{
+  static uint32_t SubsystemIds[] = {
+    0x110A0000, // Fujitsu Siemens DVB-C
+    0x13C20000, // Technotrend/Hauppauge WinTV DVB-S rev1.X or Fujitsu Siemens DVB-C
+    0x13C20001, // Technotrend/Hauppauge WinTV DVB-T rev1.X
+    0x13C20002, // Technotrend/Hauppauge WinTV DVB-C rev2.X
+    0x13C20003, // Technotrend/Hauppauge WinTV Nexus-S rev2.X
+    0x13C20004, // Galaxis DVB-S rev1.3
+    0x13C20006, // Fujitsu Siemens DVB-S rev1.6
+    0x13C20008, // Technotrend/Hauppauge DVB-T
+    0x13C2000A, // Technotrend/Hauppauge WinTV Nexus-CA rev1.X
+    0x13C2000E, // Technotrend/Hauppauge WinTV Nexus-S rev2.3
+    0x13C21002, // Technotrend/Hauppauge WinTV DVB-S rev1.3 SE
+    0x00000000
+    };
+  cString FileName;
+  cReadLine ReadLine;
+  FILE *f = NULL;
+  uint32_t SubsystemId = 0;
+  FileName = cString::sprintf("/sys/class/dvb/dvb%d.frontend%d/device/subsystem_vendor", Adapter, Frontend);
+  if ((f = fopen(FileName, "r")) != NULL) {
+     if (char *s = ReadLine.Read(f))
+        SubsystemId = strtoul(s, NULL, 0) << 16;
+     fclose(f);
+     }
+  FileName = cString::sprintf("/sys/class/dvb/dvb%d.frontend%d/device/subsystem_device", Adapter, Frontend);
+  if ((f = fopen(FileName, "r")) != NULL) {
+     if (char *s = ReadLine.Read(f))
+        SubsystemId |= strtoul(s, NULL, 0);
+     fclose(f);
+     }
+  for (uint32_t *sid = SubsystemIds; *sid; sid++) {
+      if (*sid == SubsystemId) {
+         dsyslog("creating cDvbSdFfDevice");
+         new cDvbSdFfDevice(Adapter, Frontend);
+         return true;
+         }
+      }
+  return false; 
+}
diff -ruN vdr-1.7.10/PLUGINS/src/dvbsddevice/dvbsdffdevice.h vdr-1.7.11/PLUGINS/src/dvbsddevice/dvbsdffdevice.h
--- vdr-1.7.10/PLUGINS/src/dvbsddevice/dvbsdffdevice.h	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/dvbsddevice/dvbsdffdevice.h	2010-01-04 12:01:14.000000000 +0100
@@ -0,0 +1,107 @@
+/*
+ * dvbsdffdevice.h: The DVB SD Full Featured device interface
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id: dvbsdffdevice.h 2.11 2010/01/04 11:01:14 kls Exp $
+ */
+
+#ifndef __DVBSDFFDEVICE_H
+#define __DVBSDFFDEVICE_H
+
+#include "vdr/dvbdevice.h"
+#include "vdr/dvbspu.h"
+
+/// The cDvbSdFfDevice implements a DVB device which can be accessed through the Linux DVB driver API.
+
+class cDvbSdFfDevice : public cDvbDevice {
+private:
+  int fd_osd, fd_audio, fd_video, fd_stc;
+protected:
+  virtual void MakePrimaryDevice(bool On);
+public:
+  cDvbSdFfDevice(int Adapter, int Frontend);
+  virtual ~cDvbSdFfDevice();
+  virtual bool HasDecoder(void) const;
+
+// SPU facilities
+
+private:
+  cDvbSpuDecoder *spuDecoder;
+public:
+  virtual cSpuDecoder *GetSpuDecoder(void);
+
+// Channel facilities
+
+private:
+  void TurnOffLiveMode(bool LiveView);
+protected:
+  virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
+
+// PID handle facilities
+
+private:
+  bool SetAudioBypass(bool On);
+protected:
+  virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
+
+// Image Grab facilities
+
+private:
+  static int devVideoOffset;
+  int devVideoIndex;
+public:
+  virtual uchar *GrabImage(int &Size, bool Jpeg = true, int Quality = -1, int SizeX = -1, int SizeY = -1);
+
+// Video format facilities
+
+public:
+  virtual void SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat);
+  virtual void SetVideoFormat(bool VideoFormat16_9);
+  virtual eVideoSystem GetVideoSystem(void);
+  virtual void GetVideoSize(int &Width, int &Height, double &VideoAspect);
+  virtual void GetOsdSize(int &Width, int &Height, double &PixelAspect);
+
+// Track facilities
+
+protected:
+  virtual void SetAudioTrackDevice(eTrackType Type);
+
+// Audio facilities
+
+private:
+  bool digitalAudio;
+protected:
+  virtual int GetAudioChannelDevice(void);
+  virtual void SetAudioChannelDevice(int AudioChannel);
+  virtual void SetVolumeDevice(int Volume);
+  virtual void SetDigitalAudioDevice(bool On);
+
+// Player facilities
+
+protected:
+  ePlayMode playMode;
+  virtual bool CanReplay(void) const;
+  virtual bool SetPlayMode(ePlayMode PlayMode);
+  virtual int PlayVideo(const uchar *Data, int Length);
+  virtual int PlayAudio(const uchar *Data, int Length, uchar Id);
+  virtual int PlayTsVideo(const uchar *Data, int Length);
+  virtual int PlayTsAudio(const uchar *Data, int Length);
+public:
+  virtual int64_t GetSTC(void);
+  virtual void TrickSpeed(int Speed);
+  virtual void Clear(void);
+  virtual void Play(void);
+  virtual void Freeze(void);
+  virtual void Mute(void);
+  virtual void StillPicture(const uchar *Data, int Length);
+  virtual bool Poll(cPoller &Poller, int TimeoutMs = 0);
+  virtual bool Flush(int TimeoutMs = 0);
+  };
+
+class cDvbSdFfDeviceProbe : public cDvbDeviceProbe {
+public:
+  virtual bool Probe(int Adapter, int Frontend);
+  };
+ 
+#endif //__DVBSDFFDEVICE_H
diff -ruN vdr-1.7.10/PLUGINS/src/dvbsddevice/dvbsdffosd.c vdr-1.7.11/PLUGINS/src/dvbsddevice/dvbsdffosd.c
--- vdr-1.7.10/PLUGINS/src/dvbsddevice/dvbsdffosd.c	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/dvbsddevice/dvbsdffosd.c	2009-12-29 12:52:48.000000000 +0100
@@ -0,0 +1,213 @@
+/*
+ * dvbsdffosd.c: Implementation of the DVB SD Full Featured On Screen Display
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id: dvbsdffosd.c 2.1 2009/12/29 11:52:48 kls Exp $
+ */
+
+#include "dvbsdffosd.h"
+#include <linux/dvb/osd.h>
+#include <signal.h>
+#include <sys/ioctl.h>
+#include <sys/unistd.h>
+#include "vdr/tools.h"
+
+// --- cDvbSdFfOsd -----------------------------------------------------------
+
+#define MAXNUMWINDOWS 7 // OSD windows are counted 1...7
+#define MAXOSDMEMORY  92000 // number of bytes available to the OSD (for unmodified DVB cards)
+
+class cDvbSdFfOsd : public cOsd {
+private:
+  int osdDev;
+  int osdMem;
+  bool shown;
+  void Cmd(OSD_Command cmd, int color = 0, int x0 = 0, int y0 = 0, int x1 = 0, int y1 = 0, const void *data = NULL);
+protected:
+  virtual void SetActive(bool On);
+public:
+  cDvbSdFfOsd(int Left, int Top, int OsdDev, uint Level);
+  virtual ~cDvbSdFfOsd();
+  virtual eOsdError CanHandleAreas(const tArea *Areas, int NumAreas);
+  virtual eOsdError SetAreas(const tArea *Areas, int NumAreas);
+  virtual void Flush(void);
+  };
+
+cDvbSdFfOsd::cDvbSdFfOsd(int Left, int Top, int OsdDev, uint Level)
+:cOsd(Left, Top, Level)
+{
+  osdDev = OsdDev;
+  shown = false;
+  if (osdDev < 0)
+     esyslog("ERROR: invalid OSD device handle (%d)!", osdDev);
+  else {
+     osdMem = MAXOSDMEMORY;
+#ifdef OSD_CAP_MEMSIZE
+     // modified DVB cards may have more OSD memory:
+     osd_cap_t cap;
+     cap.cmd = OSD_CAP_MEMSIZE;
+     if (ioctl(osdDev, OSD_GET_CAPABILITY, &cap) == 0)
+        osdMem = cap.val;
+#endif
+     }
+}
+
+cDvbSdFfOsd::~cDvbSdFfOsd()
+{
+  SetActive(false);
+}
+
+void cDvbSdFfOsd::SetActive(bool On)
+{
+  if (On != Active()) {
+     cOsd::SetActive(On);
+     if (On) {
+        // must clear all windows here to avoid flashing effects - doesn't work if done
+        // in Flush() only for the windows that are actually used...
+        for (int i = 0; i < MAXNUMWINDOWS; i++) {
+            Cmd(OSD_SetWindow, 0, i + 1);
+            Cmd(OSD_Clear);
+            }
+        if (GetBitmap(0)) // only flush here if there are already bitmaps
+           Flush();
+        }
+     else if (shown) {
+        cBitmap *Bitmap;
+        for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
+            Cmd(OSD_SetWindow, 0, i + 1);
+            Cmd(OSD_Close);
+            }
+        shown = false;
+        }
+     }
+}
+
+eOsdError cDvbSdFfOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
+{
+  eOsdError Result = cOsd::CanHandleAreas(Areas, NumAreas);
+  if (Result == oeOk) {
+     if (NumAreas > MAXNUMWINDOWS)
+        return oeTooManyAreas;
+     int TotalMemory = 0;
+     for (int i = 0; i < NumAreas; i++) {
+         if (Areas[i].bpp != 1 && Areas[i].bpp != 2 && Areas[i].bpp != 4 && Areas[i].bpp != 8)
+            return oeBppNotSupported;
+         if ((Areas[i].Width() & (8 / Areas[i].bpp - 1)) != 0)
+            return oeWrongAlignment;
+         if (Areas[i].Width() < 1 || Areas[i].Height() < 1 || Areas[i].Width() > 720 || Areas[i].Height() > 576)
+            return oeWrongAreaSize;
+         TotalMemory += Areas[i].Width() * Areas[i].Height() / (8 / Areas[i].bpp);
+         }
+     if (TotalMemory > osdMem)
+        return oeOutOfMemory;
+     }
+  return Result;
+}
+
+eOsdError cDvbSdFfOsd::SetAreas(const tArea *Areas, int NumAreas)
+{
+  if (shown) {
+     cBitmap *Bitmap;
+     for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
+         Cmd(OSD_SetWindow, 0, i + 1);
+         Cmd(OSD_Close);
+         }
+     shown = false;
+     }
+  return cOsd::SetAreas(Areas, NumAreas);
+}
+
+void cDvbSdFfOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, const void *data)
+{
+  if (osdDev >= 0) {
+     osd_cmd_t dc;
+     dc.cmd   = cmd;
+     dc.color = color;
+     dc.x0    = x0;
+     dc.y0    = y0;
+     dc.x1    = x1;
+     dc.y1    = y1;
+     dc.data  = (void *)data;
+     ioctl(osdDev, OSD_SEND_CMD, &dc);
+     }
+}
+
+void cDvbSdFfOsd::Flush(void)
+{
+  if (!Active())
+     return;
+  cBitmap *Bitmap;
+  for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
+      Cmd(OSD_SetWindow, 0, i + 1);
+      if (!shown)
+         Cmd(OSD_Open, Bitmap->Bpp(), Left() + Bitmap->X0(), Top() + Bitmap->Y0(), Left() + Bitmap->X0() + Bitmap->Width() - 1, Top() + Bitmap->Y0() + Bitmap->Height() - 1, (void *)1); // initially hidden!
+      int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
+      if (!shown || Bitmap->Dirty(x1, y1, x2, y2)) {
+         if (!shown) {
+            x1 = y1 = 0;
+            x2 = Bitmap->Width() - 1;
+            y2 = Bitmap->Height() - 1;
+            }
+         //TODO Workaround: apparently the bitmap sent to the driver always has to be a multiple
+         //TODO of 8 bits wide, and (dx * dy) also has to be a multiple of 8.
+         //TODO Fix driver (should be able to handle any size bitmaps!)
+         while ((x1 > 0 || x2 < Bitmap->Width() - 1) && ((x2 - x1) & 7) != 7) {
+               if (x2 < Bitmap->Width() - 1)
+                  x2++;
+               else if (x1 > 0)
+                  x1--;
+               }
+         //TODO "... / 2" <==> Bpp???
+         while ((y1 > 0 || y2 < Bitmap->Height() - 1) && (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0) {
+               if (y2 < Bitmap->Height() - 1)
+                  y2++;
+               else if (y1 > 0)
+                  y1--;
+               }
+         while ((x1 > 0 || x2 < Bitmap->Width() - 1) && (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0) {
+               if (x2 < Bitmap->Width() - 1)
+                  x2++;
+               else if (x1 > 0)
+                  x1--;
+               }
+         // commit colors:
+         int NumColors;
+         const tColor *Colors = Bitmap->Colors(NumColors);
+         if (Colors) {
+            //TODO this should be fixed in the driver!
+            tColor colors[NumColors];
+            for (int i = 0; i < NumColors; i++) {
+                // convert AARRGGBB to AABBGGRR (the driver expects the colors the wrong way):
+                colors[i] = (Colors[i] & 0xFF000000) | ((Colors[i] & 0x0000FF) << 16) | (Colors[i] & 0x00FF00) | ((Colors[i] & 0xFF0000) >> 16);
+                }
+            Colors = colors;
+            //TODO end of stuff that should be fixed in the driver
+            Cmd(OSD_SetPalette, 0, NumColors - 1, 0, 0, 0, Colors);
+            }
+         // commit modified data:
+         Cmd(OSD_SetBlock, Bitmap->Width(), x1, y1, x2, y2, Bitmap->Data(x1, y1));
+         }
+      Bitmap->Clean();
+      }
+  if (!shown) {
+     // Showing the windows in a separate loop to avoid seeing them come up one after another
+     for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
+         Cmd(OSD_SetWindow, 0, i + 1);
+         Cmd(OSD_MoveWindow, 0, Left() + Bitmap->X0(), Top() + Bitmap->Y0());
+         }
+     shown = true;
+     }
+}
+
+// --- cDvbOsdProvider -------------------------------------------------------
+
+cDvbOsdProvider::cDvbOsdProvider(int OsdDev)
+{
+  osdDev = OsdDev;
+}
+
+cOsd *cDvbOsdProvider::CreateOsd(int Left, int Top, uint Level)
+{
+  return new cDvbSdFfOsd(Left, Top, osdDev, Level);
+}
diff -ruN vdr-1.7.10/PLUGINS/src/dvbsddevice/dvbsdffosd.h vdr-1.7.11/PLUGINS/src/dvbsddevice/dvbsdffosd.h
--- vdr-1.7.10/PLUGINS/src/dvbsddevice/dvbsdffosd.h	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/dvbsddevice/dvbsdffosd.h	2009-12-29 12:52:05.000000000 +0100
@@ -0,0 +1,22 @@
+/*
+ * dvbsdffosd.h: Implementation of the DVB SD Full Featured On Screen Display
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id: dvbsdffosd.h 2.1 2009/12/29 11:52:05 kls Exp $
+ */
+
+#ifndef __DVBSDFFODF_H
+#define __DVBSDFFODF_H
+
+#include "vdr/osd.h"
+
+class cDvbOsdProvider : public cOsdProvider {
+private:
+  int osdDev;
+public:
+  cDvbOsdProvider(int OsdDev);
+  virtual cOsd *CreateOsd(int Left, int Top, uint Level);
+  };
+
+#endif //__DVBSDFFODF_H
diff -ruN vdr-1.7.10/PLUGINS/src/hello/HISTORY vdr-1.7.11/PLUGINS/src/hello/HISTORY
--- vdr-1.7.10/PLUGINS/src/hello/HISTORY	2008-09-06 17:09:04.000000000 +0200
+++ vdr-1.7.11/PLUGINS/src/hello/HISTORY	2009-12-06 13:29:11.000000000 +0100
@@ -63,6 +63,10 @@
 
 - Updated the Croatian language texts (thanks to Adrian Caval).
 
-2008-009-06 Version 0.2.3
+2008-09-06: Version 0.2.3
 
 - Updated the Turkish language texts (thanks to Oktay Yolge�en).
+
+2009-12-06: Version 0.2.4
+
+- Several code modifications to avoid compiler warnings (thanks to Winfried K�hler).
diff -ruN vdr-1.7.10/PLUGINS/src/hello/hello.c vdr-1.7.11/PLUGINS/src/hello/hello.c
--- vdr-1.7.10/PLUGINS/src/hello/hello.c	2008-09-06 17:07:12.000000000 +0200
+++ vdr-1.7.11/PLUGINS/src/hello/hello.c	2009-12-06 13:30:15.000000000 +0100
@@ -3,7 +3,7 @@
  *
  * See the README file for copyright information and how to reach the author.
  *
- * $Id: hello.c 2.1 2008/09/06 15:07:12 kls Exp $
+ * $Id: hello.c 2.2 2009/12/06 12:30:15 kls Exp $
  */
 
 #include <getopt.h>
@@ -12,7 +12,7 @@
 #include <vdr/interface.h>
 #include <vdr/plugin.h>
 
-static const char *VERSION        = "0.2.3";
+static const char *VERSION        = "0.2.4";
 static const char *DESCRIPTION    = trNOOP("A friendly greeting");
 static const char *MAINMENUENTRY  = trNOOP("Hello");
 
@@ -96,7 +96,7 @@
   static struct option long_options[] = {
        { "aaa",      required_argument, NULL, 'a' },
        { "bbb",      no_argument,       NULL, 'b' },
-       { NULL }
+       { NULL,       no_argument,       NULL,  0  }
      };
 
   int c;
diff -ruN vdr-1.7.10/PLUGINS/src/pictures/HISTORY vdr-1.7.11/PLUGINS/src/pictures/HISTORY
--- vdr-1.7.10/PLUGINS/src/pictures/HISTORY	2008-03-14 13:56:50.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/pictures/HISTORY	2009-12-06 13:29:15.000000000 +0100
@@ -33,3 +33,7 @@
 2008-03-14: Version 0.0.7
 
 - Added Russian translations (thanks to Alexander Gross).
+
+2009-12-06: Version 0.0.8
+
+- Several code modifications to avoid compiler warnings (thanks to Winfried K�hler).
diff -ruN vdr-1.7.10/PLUGINS/src/pictures/pictures.c vdr-1.7.11/PLUGINS/src/pictures/pictures.c
--- vdr-1.7.10/PLUGINS/src/pictures/pictures.c	2008-03-14 13:57:19.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/pictures/pictures.c	2009-12-06 13:30:21.000000000 +0100
@@ -3,7 +3,7 @@
  *
  * See the README file for copyright information and how to reach the author.
  *
- * $Id: pictures.c 2.0 2008/03/14 12:57:19 kls Exp $
+ * $Id: pictures.c 2.1 2009/12/06 12:30:21 kls Exp $
  */
 
 #include <getopt.h>
@@ -11,7 +11,7 @@
 #include "menu.h"
 #include "player.h"
 
-static const char *VERSION       = "0.0.7";
+static const char *VERSION       = "0.0.8";
 static const char *DESCRIPTION   = trNOOP("A simple picture viewer");
 static const char *MAINMENUENTRY = trNOOP("Pictures");
 
@@ -82,7 +82,7 @@
   // Implement command line argument processing here if applicable.
   static struct option long_options[] = {
        { "dir",      required_argument, NULL, 'd' },
-       { NULL }
+       { NULL,       no_argument,       NULL,  0  }
      };
 
   int c;
diff -ruN vdr-1.7.10/PLUGINS/src/skincurses/HISTORY vdr-1.7.11/PLUGINS/src/skincurses/HISTORY
--- vdr-1.7.10/PLUGINS/src/skincurses/HISTORY	2008-03-14 13:56:42.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/skincurses/HISTORY	2010-01-03 15:24:50.000000000 +0100
@@ -79,3 +79,8 @@
 2008-03-14: Version 0.1.7
 
 - Added Russian translations (thanks to Alexander Gross).
+
+2010-01-03: Version 0.1.8
+
+- Displaying "genre" in event descriptions.
+- Displaying "parental rating" in event descriptions.
diff -ruN vdr-1.7.10/PLUGINS/src/skincurses/skincurses.c vdr-1.7.11/PLUGINS/src/skincurses/skincurses.c
--- vdr-1.7.10/PLUGINS/src/skincurses/skincurses.c	2008-03-14 13:57:14.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/skincurses/skincurses.c	2010-01-03 15:59:16.000000000 +0100
@@ -3,7 +3,7 @@
  *
  * See the README file for copyright information and how to reach the author.
  *
- * $Id: skincurses.c 2.0 2008/03/14 12:57:14 kls Exp $
+ * $Id: skincurses.c 2.3 2010/01/03 14:59:16 kls Exp $
  */
 
 #include <ncurses.h>
@@ -11,7 +11,7 @@
 #include <vdr/plugin.h>
 #include <vdr/skins.h>
 
-static const char *VERSION        = "0.1.7";
+static const char *VERSION        = "0.1.8";
 static const char *DESCRIPTION    = trNOOP("A text only skin");
 static const char *MAINMENUENTRY  = NULL;
 
@@ -402,6 +402,10 @@
      osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
      }
   y += ts.Height();
+  if (Event->ParentalRating()) {
+     cString buffer = cString::sprintf(" %s ", *Event->GetParentalRatingString());
+     osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
+     }
   y += 1;
   ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->Title(), &Font, clrCyan, clrBackground);
   y += ts.Height();
@@ -409,6 +413,13 @@
      ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->ShortText(), &Font, clrYellow, clrBackground);
      y += ts.Height();
      }
+  for (int i = 0; Event->Contents(i); i++) {
+      const char *s = Event->ContentToString(Event->Contents(i));
+      if (!isempty(s)) {
+         ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, s, &Font, clrYellow, clrBackground);
+         y += 1;
+         }
+      }
   y += 1;
   if (!isempty(Event->Description())) {
      textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Event->Description(), &Font, clrCyan, clrBackground);
@@ -427,6 +438,10 @@
   snprintf(t, sizeof(t), "%s  %s", *DateString(Recording->start), *TimeString(Recording->start));
   ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
   y += ts.Height();
+  if (Info->GetEvent()->ParentalRating()) {
+     cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString());
+     osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
+     }
   y += 1;
   const char *Title = Info->Title();
   if (isempty(Title))
@@ -437,6 +452,13 @@
      ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Info->ShortText(), &Font, clrYellow, clrBackground);
      y += ts.Height();
      }
+  for (int i = 0; Info->GetEvent()->Contents(i); i++) {
+      const char *s = Info->GetEvent()->ContentToString(Info->GetEvent()->Contents(i));
+      if (!isempty(s)) {
+         ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, s, &Font, clrYellow, clrBackground);
+         y += 1;
+         }
+      }
   y += 1;
   if (!isempty(Info->Description())) {
      textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Info->Description(), &Font, clrCyan, clrBackground);
diff -ruN vdr-1.7.10/PLUGINS/src/sky/COPYING vdr-1.7.11/PLUGINS/src/sky/COPYING
--- vdr-1.7.10/PLUGINS/src/sky/COPYING	2006-04-21 16:51:21.000000000 +0200
+++ vdr-1.7.11/PLUGINS/src/sky/COPYING	1970-01-01 01:00:00.000000000 +0100
@@ -1,340 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program 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.
-
-    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 General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff -ruN vdr-1.7.10/PLUGINS/src/sky/HISTORY vdr-1.7.11/PLUGINS/src/sky/HISTORY
--- vdr-1.7.10/PLUGINS/src/sky/HISTORY	2008-09-07 13:55:36.000000000 +0200
+++ vdr-1.7.11/PLUGINS/src/sky/HISTORY	1970-01-01 01:00:00.000000000 +0100
@@ -1,70 +0,0 @@
-VDR Plugin 'sky' Revision History
----------------------------------
-
-2002-12-01: Version 0.0.1
-
-- Initial revision.
-
-2002-12-13: Version 0.1.0
-
-- Changed setting of CXX and CXXFLAGS variables in Makefile.
-
-2003-05-09: Version 0.1.1
-
-- Changed Start() to Initialize().
-
-2004-01-04: Version 0.2.0
-
-- Implemented automatic PID switching and channel detection
-
-2004-02-15: Version 0.3.0
-
-- Now using the actual channel IDs a derived from the data stream.
-- Switched EPG data retrieval to http://www.bleb.org.
-- Added automatic DST detection to getskyepg.pl.
-- Fixed handling receivers, so that a recording on the same channel
-  won't interrupt an ongoing Transfer mode.
-
-2004-10-16: Version 0.3.1
-
-- Improved buffer handling.
-
-2004-12-12: Version 0.3.2
-
-- Changed Apid access in cChannel.
-
-2004-12-19: Version 0.3.3
-
-- Made several functions threadsafe.
-- Removed delay_ms(), using cCondWait::SleepMs() instead.
-
-2005-09-17: Version 0.3.4
-
-- Added a missing include statement.
-
-2006-03-26: Version 0.3.5
-
-- Fixed format string handling.
-
-2006-12-02: Version 0.3.5 (version number not increased)
-
-- Made the getskyepg.pl script send a user agent message to
-  the server, according to the rules at http://bleb.org/tv/data/listings.
-  If your version of 'wget' doesn't support the -U option to set the user agent,
-  use the new option -U of getskyepg.pl to have the information added to the URL
-  as a query string.
-- The getskyepg.pl script now replaces "&amp;" with "&".
-
-2007-08-15: Version 0.3.6
-
-- Moved the "all" target in the Makefile before the "Implicit rules",
-  so that a plain "make" will compile everything.
-
-2008-03-22: Version 0.3.7
-
-- Removed the full path from the 'logger' call in the getskyepg.pl script (this
-  program is apparently "on the move" through the file system...).
- 
-2008-09-07: Version 0.3.8
-
-- Fixed renamed constants (thanks to Udo Richter).
diff -ruN vdr-1.7.10/PLUGINS/src/sky/Makefile vdr-1.7.11/PLUGINS/src/sky/Makefile
--- vdr-1.7.10/PLUGINS/src/sky/Makefile	2008-01-13 14:00:16.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/sky/Makefile	1970-01-01 01:00:00.000000000 +0100
@@ -1,83 +0,0 @@
-#
-# Makefile for a Video Disk Recorder plugin
-#
-# $Id: Makefile 2.0 2008/01/13 13:00:16 kls Exp $
-
-# The official name of this plugin.
-# This name will be used in the '-P...' option of VDR to load the plugin.
-# By default the main source file also carries this name.
-#
-PLUGIN = sky
-
-### The version number of this plugin (taken from the main source file):
-
-VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
-
-### The C++ compiler and options:
-
-CXX      ?= g++
-CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
-
-### The directory environment:
-
-VDRDIR = ../../..
-LIBDIR = ../../lib
-TMPDIR = /tmp
-
-### Allow user defined options to overwrite defaults:
-
--include $(VDRDIR)/Make.config
-
-### The version number of VDR's plugin API (taken from VDR's "config.h"):
-
-APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
-
-### The name of the distribution archive:
-
-ARCHIVE = $(PLUGIN)-$(VERSION)
-PACKAGE = vdr-$(ARCHIVE)
-
-### Includes and Defines (add further entries here):
-
-INCLUDES += -I$(VDRDIR)/include
-
-DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
-
-### The object files (add further files here):
-
-OBJS = $(PLUGIN).o
-
-### The main target:
-
-all: libvdr-$(PLUGIN).so
-
-### Implicit rules:
-
-%.o: %.c
-	$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
-
-# Dependencies:
-
-MAKEDEP = g++ -MM -MG
-DEPFILE = .dependencies
-$(DEPFILE): Makefile
-	@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
-
--include $(DEPFILE)
-
-### Targets:
-
-libvdr-$(PLUGIN).so: $(OBJS)
-	$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
-	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
-
-dist: clean
-	@-rm -rf $(TMPDIR)/$(ARCHIVE)
-	@mkdir $(TMPDIR)/$(ARCHIVE)
-	@cp -a * $(TMPDIR)/$(ARCHIVE)
-	@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
-	@-rm -rf $(TMPDIR)/$(ARCHIVE)
-	@echo Distribution package created as $(PACKAGE).tgz
-
-clean:
-	@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
diff -ruN vdr-1.7.10/PLUGINS/src/sky/README vdr-1.7.11/PLUGINS/src/sky/README
--- vdr-1.7.10/PLUGINS/src/sky/README	2009-10-18 16:16:46.000000000 +0200
+++ vdr-1.7.11/PLUGINS/src/sky/README	1970-01-01 01:00:00.000000000 +0100
@@ -1,49 +0,0 @@
-This is a "plugin" for the Video Disk Recorder (VDR).
-
-Written by:                  Klaus Schmidinger <kls@tvdr.de>
-
-Project's homepage:          http://www.tvdr.de
-
-Latest version available at: http://www.tvdr.de
-
-This program 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.
-See the file COPYING for more information.
-
-Description:
-
-The 'sky' plugin implements a new device for VDR, which is based on the
-MPEG2 encoder card described at linuxtv.org/mpeg2/kfir.xml. It
-allows you to connect the analog a/v output of your Sky Digibox to VDR,
-so that you can enjoy the full recording flexibility of VDR with your
-Sky subscription. Note that this is NOT something that does anything
-illegal, like decrypting the Sky programme without a subscription. You
-will need a Sky Digibox and a valid subscription in order to use this
-plugin.
-
-The 'kfir' module must be loaded with the option 'streamtype=4' to make it
-produce a Transport Stream.
-
-The Digibox is remotely controlled through VDR via LIRC (see lirc.org).
-The file lircd.conf.sky contains the remote control codes necessary to
-control the Digibox.
-
-In order to access the Sky channels VDR needs to know the channel number
-under which each channel is stored in the Sky Digibox. These numbers are
-stored in the file 'channels.conf.sky', together with the channel IDs as
-derived from the actual channel data and the names under which the EPG
-data for each channel can be found (see below). Copy this file to your
-plugins config directory, in a subdirectory named 'sky', as in
-
-/video/plugins/sky/channels.conf.sky
-
-The Sky EPG is available on the Internet at http://www.bleb.org.
-The Perl script getskyepg.pl extracts the EPG data from these pages
-and sends it to VDR via an SVDRP connection. The channel names as
-used on the bleb.org pages are defined in the channels.conf.sky file.
-You can keep your EPG data up-to-date by entering a call to getskyepg.pl
-into your /etc/crontab. Call 'getskyepg.pl -h' for a list of options.
-The getskyepg.pl script requires the programs /usr/bin/wget and /usr/bin/logger
-to be installed on your system.
diff -ruN vdr-1.7.10/PLUGINS/src/sky/channels.conf.sky vdr-1.7.11/PLUGINS/src/sky/channels.conf.sky
--- vdr-1.7.10/PLUGINS/src/sky/channels.conf.sky	2006-01-04 22:07:12.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/sky/channels.conf.sky	1970-01-01 01:00:00.000000000 +0100
@@ -1,34 +0,0 @@
-# Sky channel definitions
-#
-# Syntax:
-# 
-# ChannelID:ChannelNumber:EPGname
-#
-# where
-#
-# ChannelID is the channel ID as derived from the actual channel
-#           data as broadcast in the data stream (see man vdr(5)).
-#
-# ChannelNumber is the number of this channel as you have to
-#               enter it on the DigiBox remote control.
-#
-# EPGname is the name of the page at www.bleb.org that has EPG
-#         data for this channel (without the '.xml'). If no such
-#         page exists, 'x' is entered.
-#
-S28.2E-2-2027-4705:106:sky_one
-S28.2E-2-2027-5104:107:sky_two
-S28.2E-2-2044-10070:118:itv2
-S28.2E-2-2023-4905:130:scifi
-S28.2E-2-2025-5904:127:paramount
-S28.2E-2-2009-6201:551:discovery
-S28.2E-2-2030-4809:310:sky_cinema
-S28.2E-2-2007-4303:301:sky_movies1
-S28.2E-2-2007-4302:302:sky_movies2
-S28.2E-2-2007-4403:303:sky_movies3
-S28.2E-2-2011-4402:304:sky_movies4
-S28.2E-2-2011-4503:305:sky_movies5
-S28.2E-2-2011-4502:306:sky_movies6
-S28.2E-2-2030-4603:307:sky_movies7
-S28.2E-2-2007-5502:308:sky_movies8
-S28.2E-2-2030-4602:309:sky_movies9
diff -ruN vdr-1.7.10/PLUGINS/src/sky/getskyepg.pl vdr-1.7.11/PLUGINS/src/sky/getskyepg.pl
--- vdr-1.7.10/PLUGINS/src/sky/getskyepg.pl	2009-10-18 16:05:47.000000000 +0200
+++ vdr-1.7.11/PLUGINS/src/sky/getskyepg.pl	1970-01-01 01:00:00.000000000 +0100
@@ -1,260 +0,0 @@
-#!/usr/bin/perl
-
-# getskyepg.pl: Get EPG data for Sky channels from the Internet
-#
-# Connects to a running VDR instance via SVDRP, gets the channel data
-# for the Sky channels and connects to Internet web pages to extract the
-# EPG data for these channels. The result is sent to VDR via SVDRP.
-#
-# See the README file for copyright information and how to reach the author.
-#
-# $Id: getskyepg.pl 2.1 2009/10/18 14:05:47 kls Exp $
-
-use Getopt::Std;
-use Time::Local;
-
-$Usage = qq{
-Usage: $0 [options]
-
-Options: -c filename        channel config file name (default: channels.conf.sky)
-         -d hostname        destination hostname (default: localhost)
-         -p port            SVDRP port number (default: 2001)
-         -S source          channel source (default: S28.2E)
-         -D days            days to get EPG for (1..7, default: 2)
-         -U                 use this if your version of 'wget' doesn't support -U
-};
-
-die $Usage if (!getopts("c:d:D:hp:S:U") || $opt_h);
-
-$Conf   = $opt_c || "channels.conf.sky";
-$Dest   = $opt_d || "localhost";
-$Port   = $opt_p || 2001;
-$Source = $opt_S || "S28.2E";
-$Days   = $opt_D || 2;
-$User   = $opt_U;
-
-# See "Rules for using this data" on http://bleb.org/tv/data/listings.
-# In case you modify this script in a way that changes its behavior
-# towards the www.bleb.org website, please replace 'vdr-bugs@tvdr.de'
-# with your own email address! That way Andrew Flegg <andrew@bleb.org>,
-# who runs that web site, can contact you in case of problems.
-$IDENT = "VDR::getskyepg.pl, http://www.tvdr.de - vdr-bugs\@tvdr.de";
-$GAP = 2;
-
-$SkyWebPage = "www.bleb.org/tv/data/listings";
-$WGET = "/usr/bin/wget -q -O-";
-$WGET .= " -U '$IDENT'" unless $User;
-$LOGGER = "logger -t SKYEPG";
-
-$DST = -3600; # Daylight Saving Time offset
-$SecsInDay = 86400;
-
-@Channels = ();
-
-$idxSource = 0;
-$idxNumber = 1;
-$idxName = 2;
-
-Error("days out of range: $Days") unless (1 <= $Days && $Days <= 7);
-
-sub Log
-{
-  system("$LOGGER '@_'");
-}
-
-sub Error
-{
-  Log(@_);
-  die "$0: @_\n";
-}
-
-sub GetChannels
-{
-  open(CHANNELS, $Conf) || Error("$Conf: $!");
-  while (<CHANNELS>) {
-        chomp;
-        next if (/^#/);
-        my @a = split(":");
-        push(@Channels, [@a]) unless ($a[$idxName] eq "x");
-        }
-  close(CHANNELS);
-}
-
-GetChannels();
-
-sub GetPage
-{
-  my $channel = shift;
-  my $day = shift;
-  $day--;
-  my $url = "http://$SkyWebPage/$day/$channel.xml";
-  $url .= "?$IDENT" if $User;
-  Log("reading $url");
-  my @page = split("\n", `$WGET '$url'`);
-  Log("received " . ($#page + 1) . " lines");
-  return @page;
-}
-
-sub ReplaceTags
-{
-  my $s = shift;
-  $s =~ s/&amp;/&/g;
-  return $s;
-}
-
-sub StripWhitespace
-{
-  my $s = shift;
-  $s =~ s/\s*(.*)\s*/$1/;
-  $s =~ s/\s+/ /g;
-  return $s;
-}
-
-sub Extract
-{
-  my $s = shift;
-  my $t = shift;
-  $s =~ /<$t>([^<]*)<\/$t>/;
-  return ReplaceTags(StripWhitespace($1));
-}
-
-# In order to get the duration we need to buffer the last event:
-$Id = "";
-$Time = 0;
-$Title = "";
-$Subtitle = "";
-$Desc = "";
-
-sub GetEpgData
-{
-  my ($channel, $channelID) = @_;
-  my $numEvents = 0;
-  SVDRPsend("C $channelID");
-  $Time = 0;
-  for $day (1 .. $Days) {
-      my $dt = 0;
-      my @page = GetPage($channel, $day);
-      my $data = "";
-      for $line (@page) {
-          chomp($line);
-          if ($line =~ /<programme>/) {
-             $data = "";
-             }
-          elsif ($line =~ /<\/programme>/) {
-             my $title = Extract($data, "title");
-             my $subtitle = Extract($data, "subtitle");
-             my $desc = Extract($data, "desc");
-             my $start = Extract($data, "start");
-             # 'end' is useless, because it is sometimes missing :-(
-             # my $end = Extract($data, "end");
-             if (!$subtitle) {
-                # They sometimes write all info into the description, as in
-                # Episode: some description.
-                # Why don't they just fill in the data correctly?
-                my ($s, $d) = ($desc =~ /([^:]*)[:](.*)/);
-                if ($s && $d) {
-                   $subtitle = $s;
-                   $desc = $d;
-                   }
-                }
-             # 'start' and 'end' as time of day isn't of much use here, since
-             # the page for one day contains data that actually belongs to the
-             # next day (after midnight). Oh well, lets reconstruct the missing
-             # information:
-             $start = "0" . $start if (length($start) < 4);
-             my ($h, $m) = ($start =~ /(..)(..)/);
-             $dt = $SecsInDay if ($h > 12);
-             # convert to time_t:
-             my @gmt = gmtime;
-             $gmt[0] = 0;  # seconds
-             $gmt[1] = $m; # minutes
-             $gmt[2] = $h; # hours
-             $time = timegm(@gmt) + ($day - 1) * $SecsInDay + ($h < 12 ? $dt : 0);
-             # compensate for DST:
-             $time += $DST if (localtime($time))[8];
-             # create EPG data:
-             if ($Time) {
-                $duration = $time - $Time;
-                SVDRPsend("E $Id $Time $duration");
-                SVDRPsend("T $Title");
-                SVDRPsend("S $Subtitle");
-                SVDRPsend("D $Desc");
-                SVDRPsend("e");
-                $numEvents++;
-                }
-             # buffer the last event:
-             $Id = $time / 60 % 0xFFFF; # this gives us unique ids for every minute of over 6 weeks
-             $Time = $time;
-             $Title = $title;
-             $Subtitle = $subtitle;
-             $Desc = $desc;
-             }
-          else {
-             $data .= $line;
-             }
-          }
-      sleep($GAP);
-      }
-  SVDRPsend("c");
-  Log("generated $numEvents EPG events");
-}
-
-sub ProcessEpg
-{
-  for (@Channels) {
-      my $channel = @$_[$idxName];
-      my $channelID = @$_[$idxSource];
-      Log("processing channel $channel - $channelID");
-      SVDRPsend("PUTE");
-      SVDRPreceive(354);
-      GetEpgData($channel, $channelID);
-      SVDRPsend(".");
-      SVDRPreceive(250);
-      }
-  Log("done");
-}
-
-#---------------------------------------------------------------------------
-# TODO: make this a Perl module??? What about Error()???
-
-use Socket;
-
-$Timeout = 300; # max. seconds to wait for response
-
-$SIG{ALRM} = sub { Error("timeout"); };
-alarm($Timeout);
-
-$iaddr = inet_aton($Dest)                   || Error("no host: $Dest");
-$paddr = sockaddr_in($Port, $iaddr);
-
-$proto = getprotobyname('tcp');
-socket(SOCK, PF_INET, SOCK_STREAM, $proto)  || Error("socket: $!");
-connect(SOCK, $paddr)                       || Error("connect: $!");
-select(SOCK); $| = 1;
-SVDRPreceive(220);
-ProcessEpg();
-SVDRPsend("QUIT");
-
-sub SVDRPsend
-{
-  my $s = shift;
-  print SOCK "$s\r\n";
-}
-
-sub SVDRPreceive
-{
-  my $expect = shift | 0;
-  my @a = ();
-  while (<SOCK>) {
-        s/\s*$//; # 'chomp' wouldn't work with "\r\n"
-        push(@a, $_);
-        if (substr($_, 3, 1) ne "-") {
-           my $code = substr($_, 0, 3);
-           Error("expected SVDRP code $expect, but received $code") if ($code != $expect);
-           last;
-           }
-        }
-  return @a;
-}
-
-#---------------------------------------------------------------------------
diff -ruN vdr-1.7.10/PLUGINS/src/sky/lircd.conf.sky vdr-1.7.11/PLUGINS/src/sky/lircd.conf.sky
--- vdr-1.7.10/PLUGINS/src/sky/lircd.conf.sky	2002-12-01 12:25:21.000000000 +0100
+++ vdr-1.7.11/PLUGINS/src/sky/lircd.conf.sky	1970-01-01 01:00:00.000000000 +0100
@@ -1,299 +0,0 @@
-# Copyright (C) 1999 Christoph Bartelmus
-#
-# You may only use this file if you make it available to others,
-# i.e. if you send it to <lirc@bartelmus.de>
-#
-# this config file was automatically generated
-# using lirc-0.6.4-CVS(serial) on Mon Jul  9 08:14:04 2001
-#
-# contributed by Steve Davies <steve@daviesfam.org>
-#
-# brand:                       sky
-# model no. of remote control: 
-# supported devices:              34000 20
-#
-#
-
-begin remote
-
-  name          SKY
-  flags         CONST_LENGTH|RAW_CODES
-  eps           30
-  aeps          100
-  ptrail        0
-  repeat        0     0
-  gap           149692
-  frequency     36000
-  duty_cycle    50
-
-  begin raw_codes
-
-    name 0
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444
-
-    name 1
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      888
-
-    name 2
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 888 888
-      444
-
-    name 3
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 888 444
-      444
-
-    name 4
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 888 888 444 444
-      444
-
-    name 5
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 888 888 888
-
-    name 6
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 888 444 444 888
-      444
-
-    name 7
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 888 444 444 444
-      444
-
-    name 8
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 888 888 444 444 444 444
-      444
-
-    name 9
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 888 888 444 444 888
-
-    name RED
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 888 444 444 888 888 444 444 888 888
-
-    name GREEN
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 888 444 444 888 888 444 444 444 444 888 444
-
-    name YELLOW
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 888 444 444 888 888 444 444 444 444 444 444
-
-    name BLUE
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 888 444 444 444 444 888 444 444 444 444 444 444
-      444
-
-    name TEXT
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 888 444 444 444 444 444 444 888 444 444
-      444
-
-    name BACKUP
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 888 888 444 444 444 444 444 444 444 444 888 444 444
-
-    name HELP
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 888 888 444 444 444 444 444 444 444 444 444 444 888
-
-    name CURSOR-LEFT
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 888 888 888 444 444 888 888 888 444
-
-    name CURSOR-DOWN
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 888 888 888 444 444 888 444 444 888
-
-    name CURSOR-RIGHT
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 888 888 888 444 444 888 888 444 444
-
-    name CURSOR-UP
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 888 888 888 444 444 888 444 444 444 444 444
-
-    name SELECT
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 888 888 888 444 444 444 444 888 444 444 444
-
-    name CHANNEL-DOWN
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 888 888 444 444 444 444 444 444 888
-
-    name CHANNEL-UP
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 888 888 444 444 444 444 444 444 444 444
-      444
-
-    name I
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 888 444 444 888 444 444 888 888 888 444 444
-
-    name ONOFF
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 888 444 444 888 444 444
-      444
-
-    name SKY
-      2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
-      444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
-      444 444 888 888 444 444 444 444 444 444 444 444 444 444 444 444
-      444
-
-          name TV
-             2830     724     583     333     553     339
-              548     791     543     795     977     357
-              527     364     524     367     524     368
-              522     369     521     370     520     371
-              519     372     519     372     519     372
-              518     372     518     374     963     818
-              516     376     510     381     509     382
-              954     828     508     407     481
-
-          name SKY
-             2829     726     580     336     551     340
-              547     791     540     798     977     366
-              519     364     523     367     521     370
-              521     370     520     371     520     371
-              520     371     519     372     518     373
-              517     374     517     374     957     825
-              512     379     512     380     513     377
-              511     381     506     410     477     413
-              483
-
-          name MUTE
-             2567     429     751     447     743     456
-             1335     464     734     466    1325     496
-              697     504     693     506    1284     513
-              681     518     681     517     679     520
-              678   26288    2533     462     734     489
-              705     470    1323     501     695     503
-             1287     511     683     516     683     518
-             1277     522     676     521     678     521
-              675     523     675   26286    2533     465
-              731     491     702     499    1293     504
-              692     507    1280     518     683     516
-              679     524    1272     522     675     529
-              670     523     682     517     675   26286
-             2532     465     729     493     702     473
-             1318     506     688     509    1282     517
-              680     519     677     524    1274     523
-              676
-
-          name VOLUME-UP
-             2568     430     766     433    1342     456
-              734     489     708     466    1326     497
-              699     505     686     508    1286     512
-              688     510     683     516     682     516
-              681   26284    2540     481     711     488
-             1301     498     703     495     695     504
-             1284     516     682     516     684     515
-             1276     522     675     523     675     524
-              674     524     675   26286    2532     490
-              709     489    1300     500     689     509
-              695     517    1270     516     683     520
-              675     519    1274     529     668     525
-              675     524     673     526     672   26288
-             2532     466     731     491    1300     499
-              695     503     692     509    1277     520
-              681     518     679     519    1278     520
-              675
-
-          name VOLUME-DOWN
-             2562     434    1348     451    1332     465
-              733     489     704     496    1296     504
-              690     507     694     511    1281     511
-              683     523     677     515     679     520
-              680   25687    2533     464    1330     491
-             1295     505     693     506     689     510
-             1293     505     684     516     678     520
-             1276     523     677     520     675     524
-              673     526     674   25686    2531     467
-             1324     498    1292     506     691     509
-              683     515    1280     518     678     521
-              675     523    1273     525     674     527
-              672     525     673     527     671   25685
-             2531     467    1320     501    1288     511
-              687     511     688     512    1282     516
-              678     521     675     524    1273
-
-          name TVGUIDE
-             2834     720     586     330     554     338
-              548     794     539     796     975     360
-              528     363     521     371     519     371
-              520     371     519     375     514     374
-              517     374     516     375     513     379
-              511     380     510     381     949     387
-              500     836     505     387     945     391
-              493     868     469     422     468
-
-          name BOXOFFICE
-             2833     745     564     329     555     338
-              548     790     545     793     982     352
-              529     362     526     365     522     370
-              519     371     519     372     519     372
-              518     373     517     374     513     378
-              515     376     507     384     506     385
-              945     390     496     396     498     392
-              496     419     468     847     936
-
-          name SERVICES
-             2829     725     585     330     555     338
-              548     798     537     794     979     356
-              528     368     522     363     523     369
-              521     370     521     370     520     370
-              520     371     520     371     520     371
-              519     372     519     372     518     373
-              964     371     517     375     513     377
-              511     404     489     402     485     828
-              514
-
-          name INTERACTIVE
-             2829     726     591     324     553     340
-              550     788     542     796     981     354
-              532     359     522     369     522     369
-              520     372     518     373     518     373
-              516     375     515     375     513     379
-              515     375     510     381     948     389
-              498     392     504     412     470     867
-              916     866     913
-
-  end raw_codes
-
-end remote
diff -ruN vdr-1.7.10/PLUGINS/src/sky/sky.c vdr-1.7.11/PLUGINS/src/sky/sky.c
--- vdr-1.7.10/PLUGINS/src/sky/sky.c	2008-09-07 13:54:07.000000000 +0200
+++ vdr-1.7.11/PLUGINS/src/sky/sky.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,303 +0,0 @@
-/*
- * sky.c: A plugin for the Video Disk Recorder
- *
- * See the README file for copyright information and how to reach the author.
- *
- * $Id: sky.c 2.1 2008/09/07 11:54:07 kls Exp $
- */
-
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/un.h>
-#include <unistd.h>
-#include <vdr/device.h>
-#include <vdr/plugin.h>
-#include <vdr/sources.h>
-
-static const char *VERSION        = "0.3.8";
-static const char *DESCRIPTION    = "Sky Digibox interface";
-
-// --- cDigiboxDevice --------------------------------------------------------
-
-#define DUMMYAPID  80
-#define DUMMYVPID 160
-
-class cSkyChannel : public cListObject {
-public:
-  tChannelID channelID;
-  int digiboxChannelNumber;
-  bool Parse(const char *s);
-  };
-
-bool cSkyChannel::Parse(const char *s)
-{
-  char *id = NULL;
-  if (2 == sscanf(s, "%a[^:]:%d", &id, &digiboxChannelNumber))
-     channelID = tChannelID::FromString(id);
-  free(id);
-  return digiboxChannelNumber && channelID.Valid();
-}
-
-class cSkyChannels : public cConfig<cSkyChannel> {
-public:
-  cSkyChannel *GetSkyChannel(const cChannel *Channel);
-  };
-
-cSkyChannel *cSkyChannels::GetSkyChannel(const cChannel *Channel)
-{
-  tChannelID ChannelID = Channel->GetChannelID();
-  for (cSkyChannel *sc = First(); sc; sc = Next(sc)) {
-      if (ChannelID == sc->channelID)
-         return sc;
-      }
-  return NULL;
-}
-
-cSkyChannels SkyChannels;
-
-class cDigiboxDevice : public cDevice {
-private:
-  int source;
-  int digiboxChannelNumber;
-  int fd_dvr;
-  int apid, vpid;
-  cTSBuffer *tsBuffer;
-  int fd_lirc;
-  void LircSend(const char *s);
-  void LircSend(int n);
-protected:
-  virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
-  virtual bool OpenDvr(void);
-  virtual void CloseDvr(void);
-  virtual bool GetTSPacket(uchar *&Data);
-public:
-  cDigiboxDevice(void);
-  virtual ~cDigiboxDevice();
-  virtual bool ProvidesSource(int Source) const;
-  virtual bool ProvidesTransponder(const cChannel *Channel) const;
-  virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsSetChannel = NULL) const;
-  virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
-  };
-
-cDigiboxDevice::cDigiboxDevice(void)
-{
-  source = cSource::FromString("S28.2E");//XXX parameter???
-  digiboxChannelNumber = 0;
-  fd_dvr = -1;
-  apid = vpid = 0;
-  struct sockaddr_un addr;
-  addr.sun_family = AF_UNIX;
-  strn0cpy(addr.sun_path, "/dev/lircd", sizeof(addr.sun_path));//XXX parameter???
-  fd_lirc = socket(AF_UNIX, SOCK_STREAM, 0);
-  if (fd_lirc >= 0) {
-     if (connect(fd_lirc, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
-        LOG_ERROR;
-        close(fd_lirc);
-        }
-     }
-  else
-     LOG_ERROR;
-}
-
-cDigiboxDevice::~cDigiboxDevice()
-{
-  if (fd_lirc >= 0)
-     close(fd_lirc);
-}
-
-void cDigiboxDevice::LircSend(const char *s)
-{
-  char buf[100];
-  snprintf(buf, sizeof(buf), "SEND_ONCE SKY %s\n", s);
-  dsyslog(buf);//XXX
-  if (write(fd_lirc, buf, strlen(buf)) < 0)
-     LOG_ERROR;//XXX _STR
-  cCondWait::SleepMs(200);
-}
-
-void cDigiboxDevice::LircSend(int n)
-{
-  char buf[10];
-  snprintf(buf, sizeof(buf), "%d", n);
-  char *p = buf;
-  while (*p) {
-        char q[10];
-        sprintf(q, "%c", *p);
-        LircSend(q);
-        p++;
-        }
-}
-
-bool cDigiboxDevice::SetPid(cPidHandle *Handle, int Type, bool On)
-{
-  //dsyslog("SetPid %d %d", Handle->pid, On);
-  return true;
-}
-
-bool cDigiboxDevice::OpenDvr(void)
-{
-  CloseDvr();
-  fd_dvr = open("/dev/video2", O_RDONLY | O_NONBLOCK);//XXX parameter???
-  if (fd_dvr >= 0)
-     tsBuffer = new cTSBuffer(fd_dvr, MEGABYTE(2), CardIndex() + 1);
-  return fd_dvr >= 0;
-}
-
-void cDigiboxDevice::CloseDvr(void)
-{
-  if (fd_dvr >= 0) {
-     close(fd_dvr);
-     fd_dvr = -1;
-     delete tsBuffer;
-     tsBuffer = NULL;
-     }
-}
-
-bool cDigiboxDevice::GetTSPacket(uchar *&Data)
-{
-  if (tsBuffer) {
-     Data = tsBuffer->Get();
-     if (Data) {
-        // insert the actual PIDs:
-        int Pid = (((uint16_t)Data[1] & TS_PID_MASK_HI) << 8) | Data[2];
-        if (Pid == DUMMYAPID)
-           Pid = apid;
-        else if (Pid == DUMMYVPID)
-           Pid = vpid;
-        Data[1] = ((Pid >> 8) & 0xFF) | (Data[1] & ~TS_PID_MASK_HI);
-        Data[2] = Pid & 0xFF;
-        }
-     return true;
-     }
-  return false;
-}
-
-bool cDigiboxDevice::ProvidesSource(int Source) const
-{
-  return source == Source;
-}
-
-bool cDigiboxDevice::ProvidesTransponder(const cChannel *Channel) const
-{
-  return false; // can't provide any actual transponder
-}
-
-bool cDigiboxDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const
-{
-  bool result = false;
-  bool hasPriority = Priority < 0 || Priority > this->Priority();
-  bool needsDetachReceivers = true;
-
-  cSkyChannel *SkyChannel = SkyChannels.GetSkyChannel(Channel);
-  if (SkyChannel) {
-     if (Receiving(true)) {
-        if (digiboxChannelNumber == SkyChannel->digiboxChannelNumber) {
-           needsDetachReceivers = false;
-           result = true;
-           }
-        else
-           result = hasPriority;
-        }
-     else
-        result = hasPriority;
-     }
-  if (NeedsDetachReceivers)
-     *NeedsDetachReceivers = needsDetachReceivers;
-  return result;
-}
-
-bool cDigiboxDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
-{
-  if (fd_lirc >= 0 && !Receiving(true)) { // if we are receiving the channel is already set!
-     cSkyChannel *SkyChannel = SkyChannels.GetSkyChannel(Channel);
-     if (SkyChannel) {
-        digiboxChannelNumber = SkyChannel->digiboxChannelNumber;
-        apid = Channel->Apid(0);
-        vpid = Channel->Vpid();
-        //XXX only when recording??? -> faster channel switching!
-        LircSend("SKY"); // makes sure the Digibox is "on"
-        //XXX lircprint(fd_lirc, "BACKUP");
-        //XXX lircprint(fd_lirc, "BACKUP");
-        //XXX lircprint(fd_lirc, "BACKUP");
-        LircSend(digiboxChannelNumber);
-        }
-     }
-  return true;
-}
-
-// --- cPluginSky ------------------------------------------------------------
-
-class cPluginSky : public cPlugin {
-private:
-  // Add any member variables or functions you may need here.
-public:
-  cPluginSky(void);
-  virtual ~cPluginSky();
-  virtual const char *Version(void) { return VERSION; }
-  virtual const char *Description(void) { return DESCRIPTION; }
-  virtual const char *CommandLineHelp(void);
-  virtual bool ProcessArgs(int argc, char *argv[]);
-  virtual bool Initialize(void);
-  virtual void Housekeeping(void);
-  virtual cMenuSetupPage *SetupMenu(void);
-  virtual bool SetupParse(const char *Name, const char *Value);
-  };
-
-cPluginSky::cPluginSky(void)
-{
-  // Initialize any member variables here.
-  // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
-  // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
-}
-
-cPluginSky::~cPluginSky()
-{
-  // Clean up after yourself!
-}
-
-const char *cPluginSky::CommandLineHelp(void)
-{
-  // Return a string that describes all known command line options.
-  return NULL;
-}
-
-bool cPluginSky::ProcessArgs(int argc, char *argv[])
-{
-  // Implement command line argument processing here if applicable.
-  return true;
-}
-
-bool cPluginSky::Initialize(void)
-{
-  // Initialize any background activities the plugin shall perform.
-  const char *ConfigDir = ConfigDirectory(Name());
-  if (ConfigDir) {
-     if (SkyChannels.Load(AddDirectory(ConfigDir, "channels.conf.sky"), true)) {
-        new cDigiboxDevice;
-        return true;
-        }
-     }
-  else
-     esyslog("ERROR: can't get config directory");
-  return false;
-}
-
-void cPluginSky::Housekeeping(void)
-{
-  // Perform any cleanup or other regular tasks.
-}
-
-cMenuSetupPage *cPluginSky::SetupMenu(void)
-{
-  // Return a setup menu in case the plugin supports one.
-  return NULL;
-}
-
-bool cPluginSky::SetupParse(const char *Name, const char *Value)
-{
-  // Parse your own setup parameters and store their values.
-  return false;
-}
-
-VDRPLUGINCREATOR(cPluginSky); // Don't touch this!
diff -ruN vdr-1.7.10/channels.c vdr-1.7.11/channels.c
--- vdr-1.7.10/channels.c	2009-08-30 13:25:50.000000000 +0200
+++ vdr-1.7.11/channels.c	2010-01-02 18:38:40.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: channels.c 2.8 2009/08/30 11:25:50 kls Exp $
+ * $Id: channels.c 2.12 2010/01/02 17:38:40 kls Exp $
  */
 
 #include "channels.h"
@@ -24,14 +24,14 @@
   {   0, INVERSION_OFF,  trNOOP("off") },
   {   1, INVERSION_ON,   trNOOP("on") },
   { 999, INVERSION_AUTO, trNOOP("auto") },
-  { -1 }
+  {  -1, 0, NULL }
   };
 
 const tChannelParameterMap BandwidthValues[] = {
   {   6, 6000000, "6 MHz" },
   {   7, 7000000, "7 MHz" },
   {   8, 8000000, "8 MHz" },
-  { -1 }
+  {  -1, 0, NULL }
   };
 
 const tChannelParameterMap CoderateValues[] = {
@@ -47,7 +47,7 @@
   {  89, FEC_8_9,  "8/9" },
   { 910, FEC_9_10, "9/10" },
   { 999, FEC_AUTO, trNOOP("auto") },
-  { -1 }
+  {  -1, 0, NULL }
   };
 
 const tChannelParameterMap ModulationValues[] = {
@@ -62,20 +62,20 @@
   {  10, VSB_8,    "VSB8" },
   {  11, VSB_16,   "VSB16" },
   { 998, QAM_AUTO, "QAMAUTO" },
-  { -1 }
+  {  -1, 0, NULL }
   };
 
 const tChannelParameterMap SystemValues[] = {
   {   0, SYS_DVBS,  "DVB-S" },
   {   1, SYS_DVBS2, "DVB-S2" },
-  { -1 }
+  {  -1, 0, NULL }
   };
 
 const tChannelParameterMap TransmissionValues[] = {
   {   2, TRANSMISSION_MODE_2K,   "2K" },
   {   8, TRANSMISSION_MODE_8K,   "8K" },
   { 999, TRANSMISSION_MODE_AUTO, trNOOP("auto") },
-  { -1 }
+  {  -1, 0, NULL }
   };
 
 const tChannelParameterMap GuardValues[] = {
@@ -84,7 +84,7 @@
   {  16, GUARD_INTERVAL_1_16, "1/16" },
   {  32, GUARD_INTERVAL_1_32, "1/32" },
   { 999, GUARD_INTERVAL_AUTO, trNOOP("auto") },
-  { -1 }
+  {  -1, 0, NULL }
   };
 
 const tChannelParameterMap HierarchyValues[] = {
@@ -93,7 +93,7 @@
   {   2, HIERARCHY_2,    "2" },
   {   4, HIERARCHY_4,    "4" },
   { 999, HIERARCHY_AUTO, trNOOP("auto") },
-  { -1 }
+  {  -1, 0, NULL }
   };
 
 const tChannelParameterMap RollOffValues[] = {
@@ -101,7 +101,7 @@
   {  20, ROLLOFF_20, "0.20" },
   {  25, ROLLOFF_25, "0.25" },
   {  35, ROLLOFF_35, "0.35" },
-  { -1 }
+  {  -1, 0, NULL }
   };
 
 int UserIndex(int Value, const tChannelParameterMap *Map)
@@ -259,6 +259,7 @@
     case 'v': Frequency += 200000; break;
     case 'l': Frequency += 300000; break;
     case 'r': Frequency += 400000; break;
+    default: esyslog("ERROR: invalid value for Polarization '%c'", Polarization);
     }
   return Frequency;
 }
@@ -625,7 +626,7 @@
   else
      q += sprintf(q, " none");
   if (Number())
-     dsyslog(buffer);
+     dsyslog("%s", buffer);
 }
 
 void cChannel::SetRefChannel(cChannel *RefChannel)
@@ -726,6 +727,8 @@
   q += sprintf(q, "%s", Channel->name);
   if (!isempty(Channel->shortName))
      q += sprintf(q, ",%s", Channel->shortName);
+  else if (strchr(Channel->name, ','))
+     q += sprintf(q, ",");
   if (!isempty(Channel->provider))
      q += sprintf(q, ";%s", Channel->provider);
   *q = 0;
@@ -806,7 +809,7 @@
            tpid = 0;
            }
         vpid = ppid = 0;
-        vtype = 2; // default is MPEG-2
+        vtype = 0;
         apids[0] = 0;
         dpids[0] = 0;
         ok = false;
@@ -828,6 +831,8 @@
               return false;
            if (!ppid)
               ppid = vpid;
+           if (vpid && !vtype)
+              vtype = 2; // default is MPEG-2
 
            char *dpidbuf = strchr(apidbuf, ';');
            if (dpidbuf)
@@ -900,7 +905,7 @@
            *p++ = 0;
            provider = strcpyrealloc(provider, p);
            }
-        p = strchr(namebuf, ',');
+        p = strrchr(namebuf, ','); // long name might contain a ',', so search for the rightmost one
         if (p) {
            *p++ = 0;
            shortName = strcpyrealloc(shortName, p);
diff -ruN vdr-1.7.10/channels.h vdr-1.7.11/channels.h
--- vdr-1.7.10/channels.h	2009-08-30 13:05:54.000000000 +0200
+++ vdr-1.7.11/channels.h	2009-12-06 13:57:45.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: channels.h 2.6 2009/08/30 11:05:54 kls Exp $
+ * $Id: channels.h 2.7 2009/12/06 12:57:45 kls Exp $
  */
 
 #ifndef __CHANNELS_H
@@ -188,9 +188,9 @@
   const char *Alang(int i) const { return (0 <= i && i < MAXAPIDS) ? alangs[i] : ""; }
   const char *Dlang(int i) const { return (0 <= i && i < MAXDPIDS) ? dlangs[i] : ""; }
   const char *Slang(int i) const { return (0 <= i && i < MAXSPIDS) ? slangs[i] : ""; }
-  uchar SubtitlingType(int i) const { return (0 <= i && i < MAXSPIDS) ? subtitlingTypes[i] : 0; }
-  uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : 0; }
-  uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : 0; }
+  uchar SubtitlingType(int i) const { return (0 <= i && i < MAXSPIDS) ? subtitlingTypes[i] : uchar(0); }
+  uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : uint16_t(0); }
+  uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : uint16_t(0); }
   int Tpid(void) const { return tpid; }
   const int *Caids(void) const { return caids; }
   int Ca(int Index = 0) const { return Index < MAXCAIDS ? caids[Index] : 0; }
diff -ruN vdr-1.7.10/ci.c vdr-1.7.11/ci.c
--- vdr-1.7.10/ci.c	2009-08-16 15:21:07.000000000 +0200
+++ vdr-1.7.11/ci.c	2010-01-02 11:39:50.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: ci.c 2.3 2009/08/16 13:21:07 kls Exp $
+ * $Id: ci.c 2.6 2010/01/02 10:39:50 kls Exp $
  */
 
 #include "ci.h"
@@ -610,10 +610,8 @@
   capmt[length++] = 0x01; // version_number, current_next_indicator - apparently vn doesn't matter, but cni must be 1
   esInfoLengthPos = length;
   capmt[length++] = 0x00; // program_info_length H (at program level)
-  capmt[length++] = 0x01; // program_info_length L
-  capmt[length++] = cmdId;
-  if (caDescriptorsLength > 0)
-     AddCaDescriptors(caDescriptorsLength, caDescriptors);
+  capmt[length++] = 0x00; // program_info_length L
+  AddCaDescriptors(caDescriptorsLength, caDescriptors);
 }
 
 void cCiCaPmt::SetListManagement(uint8_t ListManagement)
@@ -632,22 +630,23 @@
      capmt[length++] =  Pid       & 0xFF;
      esInfoLengthPos = length;
      capmt[length++] = 0x00; // ES_info_length H (at ES level)
-     capmt[length++] = 0x01; // ES_info_length L
-     capmt[length++] = cmdId;
-     if (caDescriptorsLength > 0)
-        AddCaDescriptors(caDescriptorsLength, caDescriptors);
+     capmt[length++] = 0x00; // ES_info_length L
+     AddCaDescriptors(caDescriptorsLength, caDescriptors);
      }
 }
 
 void cCiCaPmt::AddCaDescriptors(int Length, const uint8_t *Data)
 {
   if (esInfoLengthPos) {
-     if (length + Length <= int(sizeof(capmt))) {
-        memcpy(capmt + length, Data, Length);
-        length += Length;
-        int l = length - esInfoLengthPos - 2;
-        capmt[esInfoLengthPos]     = (l >> 8) & 0xFF;
-        capmt[esInfoLengthPos + 1] =  l       & 0xFF;
+     if (length + Length < int(sizeof(capmt))) {
+        if (Length || cmdId == CPCI_QUERY) {
+           capmt[length++] = cmdId;
+           memcpy(capmt + length, Data, Length);
+           length += Length;
+           int l = length - esInfoLengthPos - 2;
+           capmt[esInfoLengthPos]     = (l >> 8) & 0xFF;
+           capmt[esInfoLengthPos + 1] =  l       & 0xFF;
+           }
         }
      else
         esyslog("ERROR: buffer overflow in CA descriptor");
@@ -1424,6 +1423,15 @@
                    SendTPDU(T_DTC_REPLY);
                    state = stIDLE;
                    return true;
+              case T_RCV:
+              case T_CREATE_TC:
+              case T_CTC_REPLY:
+              case T_DTC_REPLY:
+              case T_NEW_TC:
+              case T_TC_ERROR:
+                   break;
+              default:
+                   esyslog("ERROR: unknown TPDU tag: 0x%02X (%s)", TPDU->Tag(), __FUNCTION__);
               }
             }
          else if (timer.TimedOut())
@@ -1443,6 +1451,8 @@
             state = stIDLE;
             }
          return true;
+    default:
+         esyslog("ERROR: unknown state: %d (%s)", state, __FUNCTION__);
     }
   return true;
 }
@@ -1668,6 +1678,8 @@
                NewConnection();
                resendPmt = caProgramList.Count() > 0;
                break;
+          default:
+               esyslog("ERROR: unknown module status %d (%s)", ms, __FUNCTION__);
           }
         lastModuleStatus = ms;
         }
diff -ruN vdr-1.7.10/config.c vdr-1.7.11/config.c
--- vdr-1.7.10/config.c	2009-06-13 12:25:05.000000000 +0200
+++ vdr-1.7.11/config.c	2009-12-05 16:30:30.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: config.c 2.5 2009/06/13 10:25:05 kls Exp $
+ * $Id: config.c 2.6 2009/12/05 15:30:30 kls Exp $
  */
 
 #include "config.h"
@@ -76,7 +76,7 @@
      while ((c = fgetc(p)) != EOF) {
            if (l % 20 == 0)
               result = (char *)realloc(result, l + 21);
-           result[l++] = c;
+           result[l++] = char(c);
            }
      if (result)
         result[l] = 0;
diff -ruN vdr-1.7.10/config.h vdr-1.7.11/config.h
--- vdr-1.7.10/config.h	2009-08-29 14:47:03.000000000 +0200
+++ vdr-1.7.11/config.h	2009-11-22 20:55:04.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: config.h 2.15 2009/08/29 12:47:03 kls Exp $
+ * $Id: config.h 2.16 2009/11/22 19:55:04 kls Exp $
  */
 
 #ifndef __CONFIG_H
@@ -22,13 +22,13 @@
 
 // VDR's own version number:
 
-#define VDRVERSION  "1.7.10"
-#define VDRVERSNUM   10710  // Version * 10000 + Major * 100 + Minor
+#define VDRVERSION  "1.7.11"
+#define VDRVERSNUM   10711  // Version * 10000 + Major * 100 + Minor
 
 // The plugin API's version number:
 
-#define APIVERSION  "1.7.10"
-#define APIVERSNUM   10710  // Version * 10000 + Major * 100 + Minor
+#define APIVERSION  "1.7.11"
+#define APIVERSNUM   10711  // Version * 10000 + Major * 100 + Minor
 
 // When loading plugins, VDR searches them by their APIVERSION, which
 // may be smaller than VDRVERSION in case there have been no changes to
diff -ruN vdr-1.7.10/cutter.c vdr-1.7.11/cutter.c
--- vdr-1.7.10/cutter.c	2009-04-19 12:56:33.000000000 +0200
+++ vdr-1.7.11/cutter.c	2010-01-02 14:08:08.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: cutter.c 2.3 2009/04/19 10:56:33 kls Exp $
+ * $Id: cutter.c 2.4 2010/01/02 13:08:08 kls Exp $
  */
 
 #include "cutter.h"
@@ -274,3 +274,31 @@
   ended = false;
   return result;
 }
+
+#define CUTTINGCHECKINTERVAL 500 // ms between checks for the active cutting process
+
+bool CutRecording(const char *FileName)
+{
+  if (DirectoryOk(FileName)) {
+     cRecording Recording(FileName);
+     if (Recording.Name()) {
+        cMarks Marks;
+        if (Marks.Load(FileName, Recording.FramesPerSecond(), Recording.IsPesRecording()) && Marks.Count()) {
+           if (cCutter::Start(FileName)) {
+              while (cCutter::Active())
+                    cCondWait::SleepMs(CUTTINGCHECKINTERVAL);
+              return true;
+              }
+           else
+              fprintf(stderr, "can't start editing process\n");
+           }
+        else
+           fprintf(stderr, "'%s' has no editing marks\n", FileName);
+        }
+     else
+        fprintf(stderr, "'%s' is not a recording\n", FileName);
+     }
+  else
+     fprintf(stderr, "'%s' is not a directory\n", FileName);
+  return false;
+}
diff -ruN vdr-1.7.10/cutter.h vdr-1.7.11/cutter.h
--- vdr-1.7.10/cutter.h	2002-06-22 12:03:15.000000000 +0200
+++ vdr-1.7.11/cutter.h	2010-01-02 13:09:54.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: cutter.h 2.0 2002/06/22 10:03:15 kls Exp $
+ * $Id: cutter.h 2.1 2010/01/02 12:09:54 kls Exp $
  */
 
 #ifndef __CUTTER_H
@@ -26,4 +26,6 @@
   static bool Ended(void);
   };
 
+bool CutRecording(const char *FileName);
+
 #endif //__CUTTER_H
diff -ruN vdr-1.7.10/device.c vdr-1.7.11/device.c
--- vdr-1.7.10/device.c	2009-11-22 14:19:03.000000000 +0100
+++ vdr-1.7.11/device.c	2010-01-01 16:40:35.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: device.c 2.26 2009/11/22 13:19:03 kls Exp $
+ * $Id: device.c 2.31 2010/01/01 15:40:35 kls Exp $
  */
 
 #include "device.h"
@@ -64,6 +64,7 @@
 :patPmtParser(true)
 {
   cardIndex = nextCardIndex++;
+  dsyslog("new device number %d", CardIndex() + 1);
 
   SetDescription("receiver on device %d", CardIndex() + 1);
 
@@ -153,6 +154,10 @@
 
 void cDevice::MakePrimaryDevice(bool On)
 {
+  if (!On) {
+     DELETENULL(liveSubtitle);
+     DELETENULL(dvbSubtitleConverter);
+     }
 }
 
 bool cDevice::SetPrimaryDevice(int n)
@@ -371,6 +376,7 @@
                case vdfCenterCutOut:
                     spuDecoder->setScaleMode(cSpuDecoder::eSpuNormal);
                     break;
+               default: esyslog("ERROR: invalid value for VideoDisplayFormat '%d'", VideoDisplayFormat);
                }
         }
      }
@@ -399,7 +405,7 @@
   PixelAspect = 1.0;
 }
 
-//#define PRINTPIDS(s) { char b[500]; char *q = b; q += sprintf(q, "%d %s ", CardIndex(), s); for (int i = 0; i < MAXPIDHANDLES; i++) q += sprintf(q, " %s%4d %d", i == ptOther ? "* " : "", pidHandles[i].pid, pidHandles[i].used); dsyslog(b); }
+//#define PRINTPIDS(s) { char b[500]; char *q = b; q += sprintf(q, "%d %s ", CardIndex(), s); for (int i = 0; i < MAXPIDHANDLES; i++) q += sprintf(q, " %s%4d %d", i == ptOther ? "* " : "", pidHandles[i].pid, pidHandles[i].used); dsyslog("%s", b); }
 #define PRINTPIDS(s)
 
 bool cDevice::HasPid(int Pid) const
@@ -411,7 +417,7 @@
   return false;
 }
 
-bool cDevice::AddPid(int Pid, ePidType PidType)
+bool cDevice::AddPid(int Pid, ePidType PidType, int StreamType)
 {
   if (Pid || PidType == ptPcr) {
      int n = -1;
@@ -458,6 +464,7 @@
         }
      if (n >= 0) {
         pidHandles[n].pid = Pid;
+        pidHandles[n].streamType = StreamType;
         pidHandles[n].used = 1;
         PRINTPIDS("C");
         if (!SetPid(&pidHandles[n], n, true)) {
@@ -611,6 +618,7 @@
         case scrNoTransfer:   Skins.Message(mtError, tr("Can't start Transfer Mode!"));
                               return false;
         case scrFailed:       break; // loop will retry
+        default:              esyslog("ERROR: invalid return value from SetChannel");
         }
       esyslog("retrying");
       }
diff -ruN vdr-1.7.10/device.h vdr-1.7.11/device.h
--- vdr-1.7.10/device.h	2009-11-22 14:21:00.000000000 +0100
+++ vdr-1.7.11/device.h	2010-01-01 16:04:27.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: device.h 2.16 2009/11/22 13:21:00 kls Exp $
+ * $Id: device.h 2.19 2010/01/01 15:04:27 kls Exp $
  */
 
 #ifndef __DEVICE_H
@@ -176,6 +176,8 @@
          ///< anything the device needs to set up when it becomes the primary
          ///< device (On = true) or to shut down when it no longer is the primary
          ///< device (On = false), it should do so in this function.
+         ///< A derived class must call the MakePrimaryDevice() function of its
+         ///< base class.
 public:
   bool IsPrimaryDevice(void) const { return this == primaryDevice; }
   int CardIndex(void) const { return cardIndex; }
@@ -277,14 +279,15 @@
   class cPidHandle {
   public:
     int pid;
+    int streamType;
     int handle;
     int used;
-    cPidHandle(void) { pid = used = 0; handle = -1; }
+    cPidHandle(void) { pid = streamType = used = 0; handle = -1; }
     };
   cPidHandle pidHandles[MAXPIDHANDLES];
   bool HasPid(int Pid) const;
          ///< Returns true if this device is currently receiving the given PID.
-  bool AddPid(int Pid, ePidType PidType = ptOther);
+  bool AddPid(int Pid, ePidType PidType = ptOther, int StreamType = 0);
          ///< Adds a PID to the set of PIDs this device shall receive.
   void DelPid(int Pid, ePidType PidType = ptOther);
          ///< Deletes a PID from the set of PIDs this device shall receive.
@@ -498,6 +501,9 @@
   cTsToPes tsToPesSubtitle;
   bool isPlayingVideo;
 protected:
+  const cPatPmtParser *PatPmtParser(void) const { return &patPmtParser; }
+       ///< Returns a pointer to the patPmtParser, so that a derived device
+       ///< can use the stream information from it.
   virtual bool CanReplay(void) const;
        ///< Returns true if this device can currently start a replay session.
   virtual bool SetPlayMode(ePlayMode PlayMode);
diff -ruN vdr-1.7.10/diseqc.c vdr-1.7.11/diseqc.c
--- vdr-1.7.10/diseqc.c	2008-02-10 15:09:27.000000000 +0100
+++ vdr-1.7.11/diseqc.c	2009-12-05 16:57:02.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: diseqc.c 2.0 2008/02/10 14:09:27 kls Exp $
+ * $Id: diseqc.c 2.1 2009/12/05 15:57:02 kls Exp $
  */
 
 #include "diseqc.h"
@@ -36,7 +36,7 @@
   if (4 <= fields && fields <= 5) {
      source = cSource::FromString(sourcebuf);
      if (Sources.Get(source)) {
-        polarization = toupper(polarization);
+        polarization = char(toupper(polarization));
         if (polarization == 'V' || polarization == 'H' || polarization == 'L' || polarization == 'R') {
            parsing = true;
            char *CurrentAction = NULL;
@@ -81,7 +81,7 @@
               errno = 0;
               int n = strtol(t, &p, 16);
               if (!errno && p != t && 0 <= n && n <= 255) {
-                 codes[numCodes++] = n;
+                 codes[numCodes++] = uchar(n);
                  t = skipspace(p);
                  }
               else {
diff -ruN vdr-1.7.10/dvbdevice.c vdr-1.7.11/dvbdevice.c
--- vdr-1.7.10/dvbdevice.c	2009-06-06 13:17:20.000000000 +0200
+++ vdr-1.7.11/dvbdevice.c	2010-01-04 15:06:24.000000000 +0100
@@ -1,44 +1,22 @@
 /*
- * dvbdevice.c: The DVB device interface
+ * dvbdevice.c: The DVB device tuner interface
  *
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: dvbdevice.c 2.21 2009/06/06 11:17:20 kls Exp $
+ * $Id: dvbdevice.c 2.24 2010/01/04 14:06:24 kls Exp $
  */
 
 #include "dvbdevice.h"
 #include <errno.h>
 #include <limits.h>
-#include <linux/videodev2.h>
-#include <linux/dvb/audio.h>
 #include <linux/dvb/dmx.h>
 #include <linux/dvb/frontend.h>
-#include <linux/dvb/video.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
 #include "channels.h"
 #include "diseqc.h"
 #include "dvbci.h"
-#include "dvbosd.h"
-#include "eitscan.h"
-#include "player.h"
-#include "receiver.h"
-#include "status.h"
-#include "transfer.h"
-
-#define DO_REC_AND_PLAY_ON_PRIMARY_DEVICE 1
-#define DO_MULTIPLE_RECORDINGS 1
-
-#define DEV_VIDEO         "/dev/video"
-#define DEV_DVB_ADAPTER   "/dev/dvb/adapter"
-#define DEV_DVB_OSD       "osd"
-#define DEV_DVB_FRONTEND  "frontend"
-#define DEV_DVB_DVR       "dvr"
-#define DEV_DVB_DEMUX     "demux"
-#define DEV_DVB_VIDEO     "video"
-#define DEV_DVB_AUDIO     "audio"
-#define DEV_DVB_CA        "ca"
 
 #define DVBS_TUNE_TIMEOUT  9000 //ms
 #define DVBS_LOCK_TIMEOUT  2000 //ms
@@ -47,32 +25,13 @@
 #define DVBT_TUNE_TIMEOUT  9000 //ms
 #define DVBT_LOCK_TIMEOUT  2000 //ms
 
-class cDvbName {
-private:
-  char buffer[PATH_MAX];
-public:
-  cDvbName(const char *Name, int n) {
-    snprintf(buffer, sizeof(buffer), "%s%d/%s%d", DEV_DVB_ADAPTER, n, Name, 0);
-    }
-  const char *operator*() { return buffer; }
-  };
-
-static int DvbOpen(const char *Name, int n, int Mode, bool ReportError = false)
-{
-  const char *FileName = *cDvbName(Name, n);
-  int fd = open(FileName, Mode);
-  if (fd < 0 && ReportError)
-     LOG_ERROR_STR(FileName);
-  return fd;
-}
-
 // --- cDvbTuner -------------------------------------------------------------
 
 class cDvbTuner : public cThread {
 private:
   enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked };
   int fd_frontend;
-  int cardIndex;
+  int adapter, frontend;
   int tuneTimeout;
   int lockTimeout;
   time_t lastTimeoutReport;
@@ -87,17 +46,18 @@
   bool SetFrontend(void);
   virtual void Action(void);
 public:
-  cDvbTuner(int Fd_Frontend, int CardIndex, fe_delivery_system FrontendType);
+  cDvbTuner(int Fd_Frontend, int Adapter, int Frontend, fe_delivery_system FrontendType);
   virtual ~cDvbTuner();
   bool IsTunedTo(const cChannel *Channel) const;
-  void Set(const cChannel *Channel, bool Tune);
+  void Set(const cChannel *Channel);
   bool Locked(int TimeoutMs = 0);
   };
 
-cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, fe_delivery_system FrontendType)
+cDvbTuner::cDvbTuner(int Fd_Frontend, int Adapter, int Frontend, fe_delivery_system FrontendType)
 {
   fd_frontend = Fd_Frontend;
-  cardIndex = CardIndex;
+  adapter = Adapter;
+  frontend = Frontend;
   frontendType = FrontendType;
   tuneTimeout = 0;
   lockTimeout = 0;
@@ -106,7 +66,7 @@
   tunerStatus = tsIdle;
   if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2)
      CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13)); // must explicitly turn on LNB power
-  SetDescription("tuner on device %d", cardIndex + 1);
+  SetDescription("tuner on frontend %d/%d", adapter, frontend);
   Start();
 }
 
@@ -141,10 +101,10 @@
   return true;
 }
 
-void cDvbTuner::Set(const cChannel *Channel, bool Tune)
+void cDvbTuner::Set(const cChannel *Channel)
 {
   cMutexLock MutexLock(&mutex);
-  if (Tune)
+  if (!IsTunedTo(Channel))
      tunerStatus = tsSet;
   channel = *Channel;
   lastTimeoutReport = 0;
@@ -195,7 +155,7 @@
 #define SETCMD(c, d) { Frontend[CmdSeq.num].cmd = (c);\
                        Frontend[CmdSeq.num].u.data = (d);\
                        if (CmdSeq.num++ > MAXFRONTENDCMDS) {\
-                          esyslog("ERROR: too many tuning commands on frontend %d", cardIndex);\
+                          esyslog("ERROR: too many tuning commands on frontend %d/%d", adapter, frontend);\
                           return false;\
                           }\
                      }
@@ -206,7 +166,7 @@
   CmdSeq.props = Frontend;
   SETCMD(DTV_CLEAR, 0);
   if (ioctl(fd_frontend, FE_SET_PROPERTY, &CmdSeq) < 0) {
-     esyslog("ERROR: frontend %d: %m", cardIndex);
+     esyslog("ERROR: frontend %d/%d: %m", adapter, frontend);
      return false;
      }
   CmdSeq.num = 0;
@@ -238,6 +198,7 @@
                             }
                          }
                          break;
+                    default: esyslog("ERROR: unknown diseqc command %d", da);
                     }
                   }
               diseqcCommands = diseqc->Commands();
@@ -279,7 +240,7 @@
            SETCMD(DTV_ROLLOFF, channel.RollOff());
            }
         else {
-           esyslog("ERROR: frontend %d doesn't provide DVB-S2", cardIndex);
+           esyslog("ERROR: frontend %d/%d doesn't provide DVB-S2", adapter, frontend);
            return false;
            }
         }
@@ -325,7 +286,7 @@
      }
   SETCMD(DTV_TUNE, 0);
   if (ioctl(fd_frontend, FE_SET_PROPERTY, &CmdSeq) < 0) {
-     esyslog("ERROR: frontend %d: %m", cardIndex);
+     esyslog("ERROR: frontend %d/%d: %m", adapter, frontend);
      return false;
      }
   return true;
@@ -353,7 +314,7 @@
                   tunerStatus = tsSet;
                   diseqcCommands = NULL;
                   if (time(NULL) - lastTimeoutReport > 60) { // let's not get too many of these
-                     isyslog("frontend %d timed out while tuning to channel %d, tp %d", cardIndex, channel.Number(), channel.Transponder());
+                     isyslog("frontend %d/%d timed out while tuning to channel %d, tp %d", adapter, frontend, channel.Number(), channel.Transponder());
                      lastTimeoutReport = time(NULL);
                      }
                   continue;
@@ -362,13 +323,13 @@
                if (Status & FE_REINIT) {
                   tunerStatus = tsSet;
                   diseqcCommands = NULL;
-                  isyslog("frontend %d was reinitialized", cardIndex);
+                  isyslog("frontend %d/%d was reinitialized", adapter, frontend);
                   lastTimeoutReport = 0;
                   continue;
                   }
                else if (Status & FE_HAS_LOCK) {
                   if (LostLock) {
-                     isyslog("frontend %d regained lock on channel %d, tp %d", cardIndex, channel.Number(), channel.Transponder());
+                     isyslog("frontend %d/%d regained lock on channel %d, tp %d", adapter, frontend, channel.Number(), channel.Transponder());
                      LostLock = false;
                      }
                   tunerStatus = tsLocked;
@@ -377,12 +338,14 @@
                   }
                else if (tunerStatus == tsLocked) {
                   LostLock = true;
-                  isyslog("frontend %d lost lock on channel %d, tp %d", cardIndex, channel.Number(), channel.Transponder());
+                  isyslog("frontend %d/%d lost lock on channel %d, tp %d", adapter, frontend, channel.Number(), channel.Transponder());
                   tunerStatus = tsTuned;
                   Timer.Set(lockTimeout);
                   lastTimeoutReport = 0;
                   continue;
                   }
+               break;
+          default: esyslog("ERROR: unknown tuner status %d", tunerStatus);
           }
 
         if (tunerStatus != tsTuned)
@@ -392,7 +355,6 @@
 
 // --- cDvbDevice ------------------------------------------------------------
 
-int cDvbDevice::devVideoOffset = -1;
 int cDvbDevice::setTransferModeForDolbyDigital = 1;
 
 const char *DeliverySystems[] = {
@@ -415,30 +377,22 @@
   NULL
   };
 
-cDvbDevice::cDvbDevice(int n)
+cDvbDevice::cDvbDevice(int Adapter, int Frontend)
 {
+  adapter = Adapter;
+  frontend = Frontend;
   ciAdapter = NULL;
   dvbTuner = NULL;
   frontendType = SYS_UNDEFINED;
   numProvidedSystems = 0;
-  spuDecoder = NULL;
-  digitalAudio = false;
-  playMode = pmNone;
 
   // Devices that are present on all card types:
 
-  int fd_frontend = DvbOpen(DEV_DVB_FRONTEND, n, O_RDWR | O_NONBLOCK);
-
-  // Devices that are only present on cards with decoders:
-
-  fd_osd      = DvbOpen(DEV_DVB_OSD,    n, O_RDWR);
-  fd_video    = DvbOpen(DEV_DVB_VIDEO,  n, O_RDWR | O_NONBLOCK);
-  fd_audio    = DvbOpen(DEV_DVB_AUDIO,  n, O_RDWR | O_NONBLOCK);
-  fd_stc      = DvbOpen(DEV_DVB_DEMUX,  n, O_RDWR);
+  int fd_frontend = DvbOpen(DEV_DVB_FRONTEND, adapter, frontend, O_RDWR | O_NONBLOCK);
 
   // Common Interface:
 
-  fd_ca       = DvbOpen(DEV_DVB_CA,     n, O_RDWR);
+  fd_ca = DvbOpen(DEV_DVB_CA, adapter, frontend, O_RDWR);
   if (fd_ca >= 0)
      ciAdapter = cDvbCiAdapter::CreateCiAdapter(this, fd_ca);
 
@@ -446,39 +400,6 @@
 
   fd_dvr = -1;
 
-  // The offset of the /dev/video devices:
-
-  if (devVideoOffset < 0) { // the first one checks this
-     FILE *f = NULL;
-     char buffer[PATH_MAX];
-     for (int ofs = 0; ofs < 100; ofs++) {
-         snprintf(buffer, sizeof(buffer), "/proc/video/dev/video%d", ofs);
-         if ((f = fopen(buffer, "r")) != NULL) {
-            if (fgets(buffer, sizeof(buffer), f)) {
-               if (strstr(buffer, "DVB Board")) { // found the _first_ DVB card
-                  devVideoOffset = ofs;
-                  dsyslog("video device offset is %d", devVideoOffset);
-                  break;
-                  }
-               }
-            else
-               break;
-            fclose(f);
-            }
-         else
-            break;
-         }
-     if (devVideoOffset < 0)
-        devVideoOffset = 0;
-     if (f)
-        fclose(f);
-     }
-  devVideoIndex = (devVideoOffset >= 0 && HasDecoder()) ? devVideoOffset++ : -1;
-
-  // Video format:
-
-  SetVideoFormat(Setup.VideoFormat);
-
   // We only check the devices that must be present - the others will be checked before accessing them://XXX
 
   if (fd_frontend >= 0) {
@@ -488,7 +409,7 @@
           case FE_OFDM: frontendType = SYS_DVBT; break;
           case FE_QAM:  frontendType = SYS_DVBC_ANNEX_AC; break;
           case FE_ATSC: frontendType = SYS_ATSC; break;
-          default: esyslog("ERROR: unknown frontend type %d on device %d", frontendInfo.type, CardIndex() + 1);
+          default: esyslog("ERROR: unknown frontend type %d on frontend %d/%d", frontendInfo.type, adapter, frontend);
           }
         }
      else
@@ -497,12 +418,12 @@
         numProvidedSystems++;
         if (frontendType == SYS_DVBS2)
            numProvidedSystems++;
-        isyslog("device %d provides %s (\"%s\")", CardIndex() + 1, DeliverySystems[frontendType], frontendInfo.name);
-        dvbTuner = new cDvbTuner(fd_frontend, CardIndex(), frontendType);
+        isyslog("frontend %d/%d provides %s (\"%s\")", adapter, frontend, DeliverySystems[frontendType], frontendInfo.name);
+        dvbTuner = new cDvbTuner(fd_frontend, adapter, frontend, frontendType);
         }
      }
   else
-     esyslog("ERROR: can't open DVB device %d", n);
+     esyslog("ERROR: can't open DVB device %d/%d", adapter, frontend);
 
   StartSectionHandler();
 }
@@ -510,63 +431,86 @@
 cDvbDevice::~cDvbDevice()
 {
   StopSectionHandler();
-  delete spuDecoder;
   delete dvbTuner;
   delete ciAdapter;
   // We're not explicitly closing any device files here, since this sometimes
   // caused segfaults. Besides, the program is about to terminate anyway...
 }
 
-bool cDvbDevice::Probe(const char *FileName)
+cString cDvbDevice::DvbName(const char *Name, int Adapter, int Frontend)
+{
+  return cString::sprintf("%s%d/%s%d", DEV_DVB_ADAPTER, Adapter, Name, Frontend);
+}
+
+int cDvbDevice::DvbOpen(const char *Name, int Adapter, int Frontend, int Mode, bool ReportError)
+{
+  cString FileName = DvbName(Name, Adapter, Frontend);
+  int fd = open(FileName, Mode);
+  if (fd < 0 && ReportError)
+     LOG_ERROR_STR(*FileName);
+  return fd;
+}
+
+bool cDvbDevice::Exists(int Adapter, int Frontend)
 {
+  cString FileName = DvbName(DEV_DVB_FRONTEND, Adapter, Frontend);
   if (access(FileName, F_OK) == 0) {
-     dsyslog("probing %s", FileName);
      int f = open(FileName, O_RDONLY);
      if (f >= 0) {
         close(f);
         return true;
         }
      else if (errno != ENODEV && errno != EINVAL)
-        LOG_ERROR_STR(FileName);
+        LOG_ERROR_STR(*FileName);
      }
   else if (errno != ENOENT)
-     LOG_ERROR_STR(FileName);
+     LOG_ERROR_STR(*FileName);
   return false;
 }
 
-bool cDvbDevice::Initialize(void)
+bool cDvbDevice::Probe(int Adapter, int Frontend)
 {
-  int found = 0;
-  int i;
-  for (i = 0; i < MAXDVBDEVICES; i++) {
-      if (UseDevice(NextCardIndex())) {
-         if (Probe(*cDvbName(DEV_DVB_FRONTEND, i))) {
-            new cDvbDevice(i);
-            found++;
-            }
-         else
-            break;
-         }
-      else
-         NextCardIndex(1); // skips this one
+  cString FileName = DvbName(DEV_DVB_FRONTEND, Adapter, Frontend);
+  dsyslog("probing %s", *FileName);
+  for (cDvbDeviceProbe *dp = DvbDeviceProbes.First(); dp; dp = DvbDeviceProbes.Next(dp)) {
+      if (dp->Probe(Adapter, Frontend))
+         return true; // a plugin has created the actual device
       }
-  NextCardIndex(MAXDVBDEVICES - i); // skips the rest
-  if (found > 0)
-     isyslog("found %d video device%s", found, found > 1 ? "s" : "");
-  else
-     isyslog("no DVB device found");
-  return found > 0;
-}
-
-void cDvbDevice::MakePrimaryDevice(bool On)
-{
-  if (On && HasDecoder())
-     new cDvbOsdProvider(fd_osd);
+  dsyslog("creating cDvbDevice");
+  new cDvbDevice(Adapter, Frontend); // it's a "budget" device
+  return true;
 }
 
-bool cDvbDevice::HasDecoder(void) const
+bool cDvbDevice::Initialize(void)
 {
-  return fd_video >= 0 && fd_audio >= 0;
+  int Checked = 0;
+  int Found = 0;
+  for (int Adapter = 0; ; Adapter++) {
+      for (int Frontend = 0; ; Frontend++) {
+          if (Exists(Adapter, Frontend)) {
+             if (Checked++ < MAXDVBDEVICES) {
+                if (UseDevice(NextCardIndex())) {
+                   if (Probe(Adapter, Frontend))
+                      Found++;
+                   }
+                else
+                   NextCardIndex(1); // skips this one
+                }
+             }
+          else if (Frontend == 0)
+             goto LastAdapter;
+          else
+             goto NextAdapter;
+          }
+      NextAdapter: ;
+      }
+LastAdapter:
+  NextCardIndex(MAXDVBDEVICES - Checked); // skips the rest
+  if (Found > 0)
+     isyslog("found %d DVB device%s", Found, Found > 1 ? "s" : "");
+  else
+     isyslog("no DVB device found");
+  return Found > 0;
 }
 
 bool cDvbDevice::Ready(void)
@@ -576,234 +520,11 @@
   return true;
 }
 
-cSpuDecoder *cDvbDevice::GetSpuDecoder(void)
-{
-  if (!spuDecoder && IsPrimaryDevice())
-     spuDecoder = new cDvbSpuDecoder();
-  return spuDecoder;
-}
-
 bool cDvbDevice::HasCi(void)
 {
   return ciAdapter;
 }
 
-uchar *cDvbDevice::GrabImage(int &Size, bool Jpeg, int Quality, int SizeX, int SizeY)
-{
-  if (devVideoIndex < 0)
-     return NULL;
-  char buffer[PATH_MAX];
-  snprintf(buffer, sizeof(buffer), "%s%d", DEV_VIDEO, devVideoIndex);
-  int videoDev = open(buffer, O_RDWR);
-  if (videoDev >= 0) {
-     uchar *result = NULL;
-     // set up the size and RGB
-     v4l2_format fmt;
-     memset(&fmt, 0, sizeof(fmt));
-     fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-     fmt.fmt.pix.width = SizeX;
-     fmt.fmt.pix.height = SizeY;
-     fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_BGR24;
-     fmt.fmt.pix.field = V4L2_FIELD_ANY;
-     if (ioctl(videoDev, VIDIOC_S_FMT, &fmt) == 0) {
-        v4l2_requestbuffers reqBuf;
-        memset(&reqBuf, 0, sizeof(reqBuf));
-        reqBuf.count = 2;
-        reqBuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-        reqBuf.memory = V4L2_MEMORY_MMAP;
-        if (ioctl(videoDev, VIDIOC_REQBUFS, &reqBuf) >= 0) {
-           v4l2_buffer mbuf;
-           memset(&mbuf, 0, sizeof(mbuf));
-           mbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-           mbuf.memory = V4L2_MEMORY_MMAP;
-           if (ioctl(videoDev, VIDIOC_QUERYBUF, &mbuf) == 0) {
-              int msize = mbuf.length;
-              unsigned char *mem = (unsigned char *)mmap(0, msize, PROT_READ | PROT_WRITE, MAP_SHARED, videoDev, 0);
-              if (mem && mem != (unsigned char *)-1) {
-                 v4l2_buffer buf;
-                 memset(&buf, 0, sizeof(buf));
-                 buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-                 buf.memory = V4L2_MEMORY_MMAP;
-                 buf.index = 0;
-                 if (ioctl(videoDev, VIDIOC_QBUF, &buf) == 0) {
-                    v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-                    if (ioctl (videoDev, VIDIOC_STREAMON, &type) == 0) {
-                       memset(&buf, 0, sizeof(buf));
-                       buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-                       buf.memory = V4L2_MEMORY_MMAP;
-                       buf.index = 0;
-                       if (ioctl(videoDev, VIDIOC_DQBUF, &buf) == 0) {
-                          if (ioctl(videoDev, VIDIOC_STREAMOFF, &type) == 0) {
-                             // make RGB out of BGR:
-                             int memsize = fmt.fmt.pix.width * fmt.fmt.pix.height;
-                             unsigned char *mem1 = mem;
-                             for (int i = 0; i < memsize; i++) {
-                                 unsigned char tmp = mem1[2];
-                                 mem1[2] = mem1[0];
-                                 mem1[0] = tmp;
-                                 mem1 += 3;
-                                 }
-
-                             if (Quality < 0)
-                                Quality = 100;
-
-                             dsyslog("grabbing to %s %d %d %d", Jpeg ? "JPEG" : "PNM", Quality, fmt.fmt.pix.width, fmt.fmt.pix.height);
-                             if (Jpeg) {
-                                // convert to JPEG:
-                                result = RgbToJpeg(mem, fmt.fmt.pix.width, fmt.fmt.pix.height, Size, Quality);
-                                if (!result)
-                                   esyslog("ERROR: failed to convert image to JPEG");
-                                }
-                             else {
-                                // convert to PNM:
-                                char buf[32];
-                                snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", fmt.fmt.pix.width, fmt.fmt.pix.height);
-                                int l = strlen(buf);
-                                int bytes = memsize * 3;
-                                Size = l + bytes;
-                                result = MALLOC(uchar, Size);
-                                if (result) {
-                                   memcpy(result, buf, l);
-                                   memcpy(result + l, mem, bytes);
-                                   }
-                                else
-                                   esyslog("ERROR: failed to convert image to PNM");
-                                }
-                             }
-                          else
-                             esyslog("ERROR: video device VIDIOC_STREAMOFF failed");
-                          }
-                       else
-                          esyslog("ERROR: video device VIDIOC_DQBUF failed");
-                       }
-                    else
-                       esyslog("ERROR: video device VIDIOC_STREAMON failed");
-                    }
-                 else
-                    esyslog("ERROR: video device VIDIOC_QBUF failed");
-                 munmap(mem, msize);
-                 }
-              else
-                 esyslog("ERROR: failed to memmap video device");
-              }
-           else
-              esyslog("ERROR: video device VIDIOC_QUERYBUF failed");
-           }
-        else
-           esyslog("ERROR: video device VIDIOC_REQBUFS failed");
-        }
-     else
-        esyslog("ERROR: video device VIDIOC_S_FMT failed");
-     close(videoDev);
-     return result;
-     }
-  else
-     LOG_ERROR_STR(buffer);
-  return NULL;
-}
-
-void cDvbDevice::SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat)
-{
-  cDevice::SetVideoDisplayFormat(VideoDisplayFormat);
-  if (HasDecoder()) {
-     if (Setup.VideoFormat) {
-        CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_LETTER_BOX));
-        }
-     else {
-        switch (VideoDisplayFormat) {
-          case vdfPanAndScan:
-               CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_PAN_SCAN));
-               break;
-          case vdfLetterBox:
-               CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_LETTER_BOX));
-               break;
-          case vdfCenterCutOut:
-               CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_CENTER_CUT_OUT));
-               break;
-          }
-        }
-     }
-}
-
-void cDvbDevice::SetVideoFormat(bool VideoFormat16_9)
-{
-  if (HasDecoder()) {
-     CHECK(ioctl(fd_video, VIDEO_SET_FORMAT, VideoFormat16_9 ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3));
-     SetVideoDisplayFormat(eVideoDisplayFormat(Setup.VideoDisplayFormat));
-     }
-}
-
-eVideoSystem cDvbDevice::GetVideoSystem(void)
-{
-  eVideoSystem VideoSystem = vsPAL;
-  if (fd_video >= 0) {
-     video_size_t vs;
-     if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) {
-        if (vs.h == 480 || vs.h == 240)
-           VideoSystem = vsNTSC;
-        }
-     else
-        LOG_ERROR;
-     }
-  return VideoSystem;
-}
-
-void cDvbDevice::GetVideoSize(int &Width, int &Height, double &VideoAspect)
-{
-  if (fd_video >= 0) {
-     video_size_t vs;
-     if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) {
-        Width = vs.w;
-        Height = vs.h;
-        switch (vs.aspect_ratio) {
-          default:
-          case VIDEO_FORMAT_4_3:   VideoAspect =  4.0 / 3.0; break;
-          case VIDEO_FORMAT_16_9:  VideoAspect = 16.0 / 9.0; break;
-          case VIDEO_FORMAT_221_1: VideoAspect =       2.21; break;
-          }
-        return;
-        }
-     else
-        LOG_ERROR;
-     }
-  cDevice::GetVideoSize(Width, Height, VideoAspect);
-}
-
-void cDvbDevice::GetOsdSize(int &Width, int &Height, double &PixelAspect)
-{
-  if (fd_video >= 0) {
-     video_size_t vs;
-     if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) {
-        Width = 720;
-        if (vs.h != 480 && vs.h != 240)
-           Height = 576; // PAL
-        else
-           Height = 480; // NTSC
-        switch (Setup.VideoFormat ? vs.aspect_ratio : VIDEO_FORMAT_4_3) {
-          default:
-          case VIDEO_FORMAT_4_3:   PixelAspect =  4.0 / 3.0; break;
-          case VIDEO_FORMAT_221_1: // FF DVB cards only distinguish between 4:3 and 16:9
-          case VIDEO_FORMAT_16_9:  PixelAspect = 16.0 / 9.0; break;
-          }
-        PixelAspect /= double(Width) / Height;
-        return;
-        }
-     else
-        LOG_ERROR;
-     }
-  cDevice::GetOsdSize(Width, Height, PixelAspect);
-}
-
-bool cDvbDevice::SetAudioBypass(bool On)
-{
-  if (setTransferModeForDolbyDigital != 1)
-     return false;
-  return ioctl(fd_audio, AUDIO_SET_BYPASS_MODE, On) == 0;
-}
-
-//                            ptAudio        ptVideo        ptPcr        ptTeletext        ptDolby        ptOther
-dmx_pes_type_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_PCR, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER };
-
 bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On)
 {
   if (Handle->pid) {
@@ -811,7 +532,7 @@
      memset(&pesFilterParams, 0, sizeof(pesFilterParams));
      if (On) {
         if (Handle->handle < 0) {
-           Handle->handle = DvbOpen(DEV_DVB_DEMUX, CardIndex(), O_RDWR | O_NONBLOCK, true);
+           Handle->handle = DvbOpen(DEV_DVB_DEMUX, adapter, frontend, O_RDWR | O_NONBLOCK, true);
            if (Handle->handle < 0) {
               LOG_ERROR;
               return false;
@@ -819,8 +540,8 @@
            }
         pesFilterParams.pid     = Handle->pid;
         pesFilterParams.input   = DMX_IN_FRONTEND;
-        pesFilterParams.output  = (Type <= ptTeletext && Handle->used <= 1) ? DMX_OUT_DECODER : DMX_OUT_TS_TAP;
-        pesFilterParams.pes_type= PesTypes[Type < ptOther ? Type : ptOther];
+        pesFilterParams.output  = DMX_OUT_TS_TAP;
+        pesFilterParams.pes_type= DMX_PES_OTHER;
         pesFilterParams.flags   = DMX_IMMEDIATE_START;
         if (ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
            LOG_ERROR;
@@ -833,11 +554,9 @@
            pesFilterParams.pid     = 0x1FFF;
            pesFilterParams.input   = DMX_IN_FRONTEND;
            pesFilterParams.output  = DMX_OUT_DECODER;
-           pesFilterParams.pes_type= PesTypes[Type];
+           pesFilterParams.pes_type= DMX_PES_OTHER;
            pesFilterParams.flags   = DMX_IMMEDIATE_START;
            CHECK(ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams));
-           if (PesTypes[Type] == DMX_PES_VIDEO) // let's only do this once
-              SetPlayMode(pmNone); // necessary to switch a PID from DMX_PES_VIDEO/AUDIO to DMX_PES_OTHER
            }
         close(Handle->handle);
         Handle->handle = -1;
@@ -848,7 +567,7 @@
 
 int cDvbDevice::OpenFilter(u_short Pid, u_char Tid, u_char Mask)
 {
-  const char *FileName = *cDvbName(DEV_DVB_DEMUX, CardIndex());
+  cString FileName = DvbName(DEV_DVB_DEMUX, adapter, frontend);
   int f = open(FileName, O_RDWR | O_NONBLOCK);
   if (f >= 0) {
      dmx_sct_filter_params sctFilterParams;
@@ -866,7 +585,7 @@
         }
      }
   else
-     esyslog("ERROR: can't open filter handle on '%s'", FileName);
+     esyslog("ERROR: can't open filter handle on '%s'", *FileName);
   return -1;
 }
 
@@ -875,29 +594,6 @@
   close(Handle);
 }
 
-void cDvbDevice::TurnOffLiveMode(bool LiveView)
-{
-  if (LiveView) {
-     // Avoid noise while switching:
-     CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
-     CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
-     CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
-     CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
-     }
-
-  // Turn off live PIDs:
-
-  DetachAll(pidHandles[ptAudio].pid);
-  DetachAll(pidHandles[ptVideo].pid);
-  DetachAll(pidHandles[ptPcr].pid);
-  DetachAll(pidHandles[ptTeletext].pid);
-  DelPid(pidHandles[ptAudio].pid);
-  DelPid(pidHandles[ptVideo].pid);
-  DelPid(pidHandles[ptPcr].pid, ptPcr);
-  DelPid(pidHandles[ptTeletext].pid);
-  DelPid(pidHandles[ptDolby].pid);
-}
-
 bool cDvbDevice::ProvidesSource(int Source) const
 {
   int type = Source & cSource::st_Mask;
@@ -929,7 +625,6 @@
      if (Priority >= 0 && Receiving(true)) {
         if (dvbTuner->IsTunedTo(Channel)) {
            if (Channel->Vpid() && !HasPid(Channel->Vpid()) || Channel->Apid(0) && !HasPid(Channel->Apid(0))) {
-#ifdef DO_MULTIPLE_RECORDINGS
               if (CamSlot() && Channel->Ca() >= CA_ENCRYPTED_MIN) {
                  if (CamSlot()->CanDecrypt(Channel))
                     result = true;
@@ -938,11 +633,8 @@
                  }
               else if (!IsPrimaryDevice())
                  result = true;
-#ifdef DO_REC_AND_PLAY_ON_PRIMARY_DEVICE
               else
                  result = Priority >= Setup.PrimaryLimit;
-#endif
-#endif
               }
            else
               result = !IsPrimaryDevice() || Priority >= Setup.PrimaryLimit;
@@ -968,70 +660,7 @@
 
 bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
 {
-  int apid = Channel->Apid(0);
-  int vpid = Channel->Vpid();
-  int dpid = Channel->Dpid(0);
-
-  bool DoTune = !dvbTuner->IsTunedTo(Channel);
-
-  bool pidHandlesVideo = pidHandles[ptVideo].pid == vpid;
-  bool pidHandlesAudio = pidHandles[ptAudio].pid == apid;
-
-  bool TurnOffLivePIDs = HasDecoder()
-                         && (DoTune
-                            || !IsPrimaryDevice()
-                            || LiveView // for a new live view the old PIDs need to be turned off
-                            || pidHandlesVideo // for recording the PIDs must be shifted from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER
-                            );
-
-  bool StartTransferMode = IsPrimaryDevice() && !DoTune
-                           && (LiveView && HasPid(vpid ? vpid : apid) && (!pidHandlesVideo || (!pidHandlesAudio && (dpid ? pidHandles[ptAudio].pid != dpid : true)))// the PID is already set as DMX_PES_OTHER
-                              || !LiveView && (pidHandlesVideo || pidHandlesAudio) // a recording is going to shift the PIDs from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER
-                              );
-  if (CamSlot() && !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), CamSlot()->SlotNumber()))
-     StartTransferMode |= LiveView && IsPrimaryDevice() && Channel->Ca() >= CA_ENCRYPTED_MIN;
-
-  bool TurnOnLivePIDs = HasDecoder() && !StartTransferMode && LiveView;
-
-#ifndef DO_MULTIPLE_RECORDINGS
-  TurnOffLivePIDs = TurnOnLivePIDs = true;
-  StartTransferMode = false;
-#endif
-
-  // Turn off live PIDs if necessary:
-
-  if (TurnOffLivePIDs)
-     TurnOffLiveMode(LiveView);
-
-  // Set the tuner:
-
-  dvbTuner->Set(Channel, DoTune);
-
-  // If this channel switch was requested by the EITScanner we don't wait for
-  // a lock and don't set any live PIDs (the EITScanner will wait for the lock
-  // by itself before setting any filters):
-
-  if (EITScanner.UsesDevice(this)) //XXX
-     return true;
-
-  // PID settings:
-
-  if (TurnOnLivePIDs) {
-     SetAudioBypass(false);
-     if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(vpid, ptVideo) && AddPid(apid, ptAudio))) {
-        esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->Number(), CardIndex() + 1);
-        return false;
-        }
-     if (IsPrimaryDevice())
-        AddPid(Channel->Tpid(), ptTeletext);
-     CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true)); // actually one would expect 'false' here, but according to Marco Schl��ler <marco@lordzodiac.de> this works
-                                                   // to avoid missing audio after replaying a DVD; with 'false' there is an audio disturbance when switching
-                                                   // between two channels on the same transponder on DVB-S
-     CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
-     }
-  else if (StartTransferMode)
-     cControl::Launch(new cTransferControl(this, Channel->GetChannelID(), vpid, Channel->Apids(), Channel->Dpids(), Channel->Spids()));
-
+  dvbTuner->Set(Channel);
   return true;
 }
 
@@ -1040,339 +669,15 @@
   return dvbTuner ? dvbTuner->Locked(TimeoutMs) : false;
 }
 
-int cDvbDevice::GetAudioChannelDevice(void)
-{
-  if (HasDecoder()) {
-     audio_status_t as;
-     CHECK(ioctl(fd_audio, AUDIO_GET_STATUS, &as));
-     return as.channel_select;
-     }
-  return 0;
-}
-
-void cDvbDevice::SetAudioChannelDevice(int AudioChannel)
-{
-  if (HasDecoder())
-     CHECK(ioctl(fd_audio, AUDIO_CHANNEL_SELECT, AudioChannel));
-}
-
-void cDvbDevice::SetVolumeDevice(int Volume)
-{
-  if (HasDecoder()) {
-     if (digitalAudio)
-        Volume = 0;
-     audio_mixer_t am;
-     // conversion for linear volume response:
-     am.volume_left = am.volume_right = 2 * Volume - Volume * Volume / 255;
-     CHECK(ioctl(fd_audio, AUDIO_SET_MIXER, &am));
-     }
-}
-
-void cDvbDevice::SetDigitalAudioDevice(bool On)
-{
-  if (digitalAudio != On) {
-     if (digitalAudio)
-        cCondWait::SleepMs(1000); // Wait until any leftover digital data has been flushed
-     digitalAudio = On;
-     SetVolumeDevice(On || IsMute() ? 0 : CurrentVolume());
-     }
-}
-
 void cDvbDevice::SetTransferModeForDolbyDigital(int Mode)
 {
   setTransferModeForDolbyDigital = Mode;
 }
 
-void cDvbDevice::SetAudioTrackDevice(eTrackType Type)
-{
-  const tTrackId *TrackId = GetTrack(Type);
-  if (TrackId && TrackId->id) {
-     SetAudioBypass(false);
-     if (IS_AUDIO_TRACK(Type) || (IS_DOLBY_TRACK(Type) && SetAudioBypass(true))) {
-        if (pidHandles[ptAudio].pid && pidHandles[ptAudio].pid != TrackId->id) {
-           DetachAll(pidHandles[ptAudio].pid);
-           if (CamSlot())
-              CamSlot()->SetPid(pidHandles[ptAudio].pid, false);
-           pidHandles[ptAudio].pid = TrackId->id;
-           SetPid(&pidHandles[ptAudio], ptAudio, true);
-           if (CamSlot()) {
-              CamSlot()->SetPid(pidHandles[ptAudio].pid, true);
-              CamSlot()->StartDecrypting();
-              }
-           }
-        }
-     else if (IS_DOLBY_TRACK(Type)) {
-        if (setTransferModeForDolbyDigital == 0)
-           return;
-        // Currently this works only in Transfer Mode
-        ForceTransferMode();
-        }
-     }
-}
-
-bool cDvbDevice::CanReplay(void) const
-{
-#ifndef DO_REC_AND_PLAY_ON_PRIMARY_DEVICE
-  if (Receiving())
-     return false;
-#endif
-  return cDevice::CanReplay();
-}
-
-bool cDvbDevice::SetPlayMode(ePlayMode PlayMode)
-{
-  if (PlayMode != pmExtern_THIS_SHOULD_BE_AVOIDED && fd_video < 0 && fd_audio < 0) {
-     // reopen the devices
-     fd_video = DvbOpen(DEV_DVB_VIDEO,  CardIndex(), O_RDWR | O_NONBLOCK);
-     fd_audio = DvbOpen(DEV_DVB_AUDIO,  CardIndex(), O_RDWR | O_NONBLOCK);
-     SetVideoFormat(Setup.VideoFormat);
-     }
-
-  switch (PlayMode) {
-    case pmNone:
-         // special handling to return from PCM replay:
-         CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
-         CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
-         CHECK(ioctl(fd_video, VIDEO_PLAY));
-
-         CHECK(ioctl(fd_video, VIDEO_STOP, true));
-         CHECK(ioctl(fd_audio, AUDIO_STOP, true));
-         CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
-         CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
-         CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX));
-         CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX));
-         CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
-         CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false));
-         break;
-    case pmAudioVideo:
-    case pmAudioOnlyBlack:
-         if (playMode == pmNone)
-            TurnOffLiveMode(true);
-         CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
-         CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY));
-         CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, PlayMode == pmAudioVideo));
-         CHECK(ioctl(fd_audio, AUDIO_PLAY));
-         CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
-         CHECK(ioctl(fd_video, VIDEO_PLAY));
-         break;
-    case pmAudioOnly:
-         CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
-         CHECK(ioctl(fd_audio, AUDIO_STOP, true));
-         CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
-         CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY));
-         CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
-         CHECK(ioctl(fd_audio, AUDIO_PLAY));
-         CHECK(ioctl(fd_video, VIDEO_SET_BLANK, false));
-         break;
-    case pmVideoOnly:
-         CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
-         CHECK(ioctl(fd_video, VIDEO_STOP, true));
-         CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX));
-         CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
-         CHECK(ioctl(fd_audio, AUDIO_PLAY));
-         CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
-         CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
-         CHECK(ioctl(fd_video, VIDEO_PLAY));
-         break;
-    case pmExtern_THIS_SHOULD_BE_AVOIDED:
-         close(fd_video);
-         close(fd_audio);
-         fd_video = fd_audio = -1;
-         break;
-    }
-  playMode = PlayMode;
-  return true;
-}
-
-int64_t cDvbDevice::GetSTC(void)
-{
-  if (fd_stc >= 0) {
-     struct dmx_stc stc;
-     stc.num = 0;
-     if (ioctl(fd_stc, DMX_GET_STC, &stc) == -1) {
-        esyslog("ERROR: stc %d: %m", CardIndex() + 1);
-        return -1;
-        }
-     return stc.stc / stc.base;
-     }
-  return -1;
-}
-
-void cDvbDevice::TrickSpeed(int Speed)
-{
-  if (fd_video >= 0)
-     CHECK(ioctl(fd_video, VIDEO_SLOWMOTION, Speed));
-}
-
-void cDvbDevice::Clear(void)
-{
-  if (fd_video >= 0)
-     CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
-  if (fd_audio >= 0)
-     CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
-  cDevice::Clear();
-}
-
-void cDvbDevice::Play(void)
-{
-  if (playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) {
-     if (fd_audio >= 0)
-        CHECK(ioctl(fd_audio, AUDIO_CONTINUE));
-     }
-  else {
-     if (fd_audio >= 0) {
-        CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
-        CHECK(ioctl(fd_audio, AUDIO_CONTINUE));
-        }
-     if (fd_video >= 0)
-        CHECK(ioctl(fd_video, VIDEO_CONTINUE));
-     }
-  cDevice::Play();
-}
-
-void cDvbDevice::Freeze(void)
-{
-  if (playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) {
-     if (fd_audio >= 0)
-        CHECK(ioctl(fd_audio, AUDIO_PAUSE));
-     }
-  else {
-     if (fd_audio >= 0) {
-        CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
-        CHECK(ioctl(fd_audio, AUDIO_PAUSE));
-        }
-     if (fd_video >= 0)
-        CHECK(ioctl(fd_video, VIDEO_FREEZE));
-     }
-  cDevice::Freeze();
-}
-
-void cDvbDevice::Mute(void)
-{
-  if (fd_audio >= 0) {
-     CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
-     CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
-     }
-  cDevice::Mute();
-}
-
-void cDvbDevice::StillPicture(const uchar *Data, int Length)
-{
-  if (!Data || Length < TS_SIZE)
-     return;
-  if (Data[0] == 0x47) {
-     // TS data
-     cDevice::StillPicture(Data, Length);
-     }
-  else if (Data[0] == 0x00 && Data[1] == 0x00 && Data[2] == 0x01 && (Data[3] & 0xF0) == 0xE0) {
-     // PES data
-     char *buf = MALLOC(char, Length);
-     if (!buf)
-        return;
-     int i = 0;
-     int blen = 0;
-     while (i < Length - 6) {
-           if (Data[i] == 0x00 && Data[i + 1] == 0x00 && Data[i + 2] == 0x01) {
-              int len = Data[i + 4] * 256 + Data[i + 5];
-              if ((Data[i + 3] & 0xF0) == 0xE0) { // video packet
-                 // skip PES header
-                 int offs = i + 6;
-                 // skip header extension
-                 if ((Data[i + 6] & 0xC0) == 0x80) {
-                    // MPEG-2 PES header
-                    if (Data[i + 8] >= Length)
-                       break;
-                    offs += 3;
-                    offs += Data[i + 8];
-                    len -= 3;
-                    len -= Data[i + 8];
-                    if (len < 0 || offs + len > Length)
-                       break;
-                    }
-                 else {
-                    // MPEG-1 PES header
-                    while (offs < Length && len > 0 && Data[offs] == 0xFF) {
-                          offs++;
-                          len--;
-                          }
-                    if (offs <= Length - 2 && len >= 2 && (Data[offs] & 0xC0) == 0x40) {
-                       offs += 2;
-                       len -= 2;
-                       }
-                    if (offs <= Length - 5 && len >= 5 && (Data[offs] & 0xF0) == 0x20) {
-                       offs += 5;
-                       len -= 5;
-                       }
-                    else if (offs <= Length - 10 && len >= 10 && (Data[offs] & 0xF0) == 0x30) {
-                       offs += 10;
-                       len -= 10;
-                       }
-                    else if (offs < Length && len > 0) {
-                       offs++;
-                       len--;
-                       }
-                    }
-                 if (blen + len > Length) // invalid PES length field
-                    break;
-                 memcpy(&buf[blen], &Data[offs], len);
-                 i = offs + len;
-                 blen += len;
-                 }
-              else if (Data[i + 3] >= 0xBD && Data[i + 3] <= 0xDF) // other PES packets
-                 i += len + 6;
-              else
-                 i++;
-              }
-           else
-              i++;
-           }
-     video_still_picture sp = { buf, blen };
-     CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
-     free(buf);
-     }
-  else {
-     // non-PES data
-     video_still_picture sp = { (char *)Data, Length };
-     CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
-     }
-}
-
-bool cDvbDevice::Poll(cPoller &Poller, int TimeoutMs)
-{
-  Poller.Add((playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) ? fd_audio : fd_video, true);
-  return Poller.Poll(TimeoutMs);
-}
-
-bool cDvbDevice::Flush(int TimeoutMs)
-{
-  //TODO actually this function should wait until all buffered data has been processed by the card, but how?
-  return true;
-}
-
-int cDvbDevice::PlayVideo(const uchar *Data, int Length)
-{
-  return WriteAllOrNothing(fd_video, Data, Length, 1000, 10);
-}
-
-int cDvbDevice::PlayAudio(const uchar *Data, int Length, uchar Id)
-{
-  return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10);
-}
-
-int cDvbDevice::PlayTsVideo(const uchar *Data, int Length)
-{
-  return WriteAllOrNothing(fd_video, Data, Length, 1000, 10);
-}
-
-int cDvbDevice::PlayTsAudio(const uchar *Data, int Length)
-{
-  return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10);
-}
-
 bool cDvbDevice::OpenDvr(void)
 {
   CloseDvr();
-  fd_dvr = DvbOpen(DEV_DVB_DVR, CardIndex(), O_RDONLY | O_NONBLOCK, true);
+  fd_dvr = DvbOpen(DEV_DVB_DVR, adapter, frontend, O_RDONLY | O_NONBLOCK, true);
   if (fd_dvr >= 0)
      tsBuffer = new cTSBuffer(fd_dvr, MEGABYTE(2), CardIndex() + 1);
   return fd_dvr >= 0;
@@ -1396,3 +701,17 @@
      }
   return false;
 }
+
+// --- cDvbDeviceProbe -------------------------------------------------------
+
+cList<cDvbDeviceProbe> DvbDeviceProbes;
+
+cDvbDeviceProbe::cDvbDeviceProbe(void)
+{
+  DvbDeviceProbes.Add(this);
+}
+
+cDvbDeviceProbe::~cDvbDeviceProbe()
+{
+  DvbDeviceProbes.Del(this, false);
+}
diff -ruN vdr-1.7.10/dvbdevice.h vdr-1.7.11/dvbdevice.h
--- vdr-1.7.10/dvbdevice.h	2009-10-25 14:58:20.000000000 +0100
+++ vdr-1.7.11/dvbdevice.h	2010-01-04 15:07:12.000000000 +0100
@@ -1,10 +1,10 @@
 /*
- * dvbdevice.h: The DVB device interface
+ * dvbdevice.h: The DVB device tuner interface
  *
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: dvbdevice.h 2.9 2009/10/25 13:58:20 kls Exp $
+ * $Id: dvbdevice.h 2.11 2010/01/04 14:07:12 kls Exp $
  */
 
 #ifndef __DVBDEVICE_H
@@ -14,7 +14,6 @@
 #include <linux/dvb/frontend.h>
 #include <linux/dvb/version.h>
 #include "device.h"
-#include "dvbspu.h"
 
 #if DVB_API_VERSION < 5
 #error VDR requires Linux DVB driver API version 5.0 or higher!
@@ -22,49 +21,55 @@
 
 #define MAXDVBDEVICES  8
 
+#define DEV_VIDEO         "/dev/video"
+#define DEV_DVB_ADAPTER   "/dev/dvb/adapter"
+#define DEV_DVB_OSD       "osd"
+#define DEV_DVB_FRONTEND  "frontend"
+#define DEV_DVB_DVR       "dvr"
+#define DEV_DVB_DEMUX     "demux"
+#define DEV_DVB_VIDEO     "video"
+#define DEV_DVB_AUDIO     "audio"
+#define DEV_DVB_CA        "ca"
+
 class cDvbTuner;
 
 /// The cDvbDevice implements a DVB device which can be accessed through the Linux DVB driver API.
 
 class cDvbDevice : public cDevice {
+protected:
+  static cString DvbName(const char *Name, int Adapter, int Frontend);
+  static int DvbOpen(const char *Name, int Adapter, int Frontend, int Mode, bool ReportError = false);
 private:
-  static bool Probe(const char *FileName);
+  static bool Exists(int Adapter, int Frontend);
+         ///< Checks whether the given adapter/frontend exists.
+  static bool Probe(int Adapter, int Frontend);
          ///< Probes for existing DVB devices.
 public:
   static bool Initialize(void);
          ///< Initializes the DVB devices.
          ///< Must be called before accessing any DVB functions.
          ///< \return True if any devices are available.
+protected:
+  int adapter, frontend;
 private:
   dvb_frontend_info frontendInfo;
   int numProvidedSystems;
   fe_delivery_system frontendType;
-  int fd_osd, fd_audio, fd_video, fd_dvr, fd_stc, fd_ca;
-protected:
-  virtual void MakePrimaryDevice(bool On);
+  int fd_dvr, fd_ca;
 public:
-  cDvbDevice(int n);
+  cDvbDevice(int Adapter, int Frontend);
   virtual ~cDvbDevice();
   virtual bool Ready(void);
-  virtual bool HasDecoder(void) const;
 
 // Common Interface facilities:
 
 private:
   cCiAdapter *ciAdapter;
 
-// SPU facilities
-
-private:
-  cDvbSpuDecoder *spuDecoder;
-public:
-  virtual cSpuDecoder *GetSpuDecoder(void);
-
 // Channel facilities
 
 private:
   cDvbTuner *dvbTuner;
-  void TurnOffLiveMode(bool LiveView);
 public:
   virtual bool ProvidesSource(int Source) const;
   virtual bool ProvidesTransponder(const cChannel *Channel) const;
@@ -78,8 +83,6 @@
 
 // PID handle facilities
 
-private:
-  bool SetAudioBypass(bool On);
 protected:
   virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
 
@@ -94,67 +97,18 @@
 public:
   virtual bool HasCi(void);
 
-// Image Grab facilities
-
-private:
-  static int devVideoOffset;
-  int devVideoIndex;
-public:
-  virtual uchar *GrabImage(int &Size, bool Jpeg = true, int Quality = -1, int SizeX = -1, int SizeY = -1);
-
-// Video format facilities
-
-public:
-  virtual void SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat);
-  virtual void SetVideoFormat(bool VideoFormat16_9);
-  virtual eVideoSystem GetVideoSystem(void);
-  virtual void GetVideoSize(int &Width, int &Height, double &VideoAspect);
-  virtual void GetOsdSize(int &Width, int &Height, double &PixelAspect);
-
-// Track facilities
-
-protected:
-  virtual void SetAudioTrackDevice(eTrackType Type);
-
 // Audio facilities
 
-private:
-  bool digitalAudio;
-  static int setTransferModeForDolbyDigital;
 protected:
-  virtual int GetAudioChannelDevice(void);
-  virtual void SetAudioChannelDevice(int AudioChannel);
-  virtual void SetVolumeDevice(int Volume);
-  virtual void SetDigitalAudioDevice(bool On);
+  static int setTransferModeForDolbyDigital;
 public:
-  static void SetTransferModeForDolbyDigital(int Mode);
+  static void SetTransferModeForDolbyDigital(int Mode); // needs to be here for backwards compatibilty
          ///< Controls how the DVB device handles Transfer Mode when replaying
          ///< Dolby Digital audio.
          ///< 0 = don't set "audio bypass" in driver/firmware, don't force Transfer Mode
          ///< 1 = set "audio bypass" in driver/firmware, force Transfer Mode (default)
          ///< 2 = don't set "audio bypass" in driver/firmware, force Transfer Mode
 
-// Player facilities
-
-protected:
-  ePlayMode playMode;
-  virtual bool CanReplay(void) const;
-  virtual bool SetPlayMode(ePlayMode PlayMode);
-  virtual int PlayVideo(const uchar *Data, int Length);
-  virtual int PlayAudio(const uchar *Data, int Length, uchar Id);
-  virtual int PlayTsVideo(const uchar *Data, int Length);
-  virtual int PlayTsAudio(const uchar *Data, int Length);
-public:
-  virtual int64_t GetSTC(void);
-  virtual void TrickSpeed(int Speed);
-  virtual void Clear(void);
-  virtual void Play(void);
-  virtual void Freeze(void);
-  virtual void Mute(void);
-  virtual void StillPicture(const uchar *Data, int Length);
-  virtual bool Poll(cPoller &Poller, int TimeoutMs = 0);
-  virtual bool Flush(int TimeoutMs = 0);
-
 // Receiver facilities
 
 private:
@@ -165,4 +119,22 @@
   virtual bool GetTSPacket(uchar *&Data);
   };
 
+// A plugin that implements a DVB device derived from cDvbDevice needs to create
+// a cDvbDeviceProbe derived object on the heap in order to have its Probe()
+// function called, where it can actually create the appropriate device.
+// The cDvbDeviceProbe object must be created in the plugin's constructor,
+// and deleted in its destructor.
+
+class cDvbDeviceProbe : public cListObject {
+public:
+  cDvbDeviceProbe(void);
+  virtual ~cDvbDeviceProbe();
+  virtual bool Probe(int Adapter, int Frontend) = 0;
+     ///< Probes for a DVB device at the given Adapter and creates the appropriate
+     ///< object derived from cDvbDevice if applicable.
+     ///< Returns true if a device has been created.
+  };
+
+extern cList<cDvbDeviceProbe> DvbDeviceProbes;
+
 #endif //__DVBDEVICE_H
diff -ruN vdr-1.7.10/dvbosd.c vdr-1.7.11/dvbosd.c
--- vdr-1.7.10/dvbosd.c	2007-09-16 10:55:54.000000000 +0200
+++ vdr-1.7.11/dvbosd.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,215 +0,0 @@
-/*
- * dvbosd.c: Implementation of the DVB On Screen Display
- *
- * See the main source file 'vdr.c' for copyright information and
- * how to reach the author.
- *
- * $Id: dvbosd.c 2.0 2007/09/16 08:55:54 kls Exp $
- */
-
-#include "dvbosd.h"
-#include <linux/dvb/osd.h>
-#include <signal.h>
-#include <sys/ioctl.h>
-#include <sys/unistd.h>
-#include "dvbdevice.h"
-#include "tools.h"
-
-// --- cDvbOsd ---------------------------------------------------------------
-
-#define MAXNUMWINDOWS 7 // OSD windows are counted 1...7
-#define MAXOSDMEMORY  92000 // number of bytes available to the OSD (for unmodified DVB cards)
-
-class cDvbOsd : public cOsd {
-private:
-  int osdDev;
-  int osdMem;
-  bool shown;
-  void Cmd(OSD_Command cmd, int color = 0, int x0 = 0, int y0 = 0, int x1 = 0, int y1 = 0, const void *data = NULL);
-protected:
-  virtual void SetActive(bool On);
-public:
-  cDvbOsd(int Left, int Top, int OsdDev, uint Level);
-  virtual ~cDvbOsd();
-  virtual eOsdError CanHandleAreas(const tArea *Areas, int NumAreas);
-  virtual eOsdError SetAreas(const tArea *Areas, int NumAreas);
-  virtual void Flush(void);
-  };
-
-cDvbOsd::cDvbOsd(int Left, int Top, int OsdDev, uint Level)
-:cOsd(Left, Top, Level)
-{
-  osdDev = OsdDev;
-  shown = false;
-  if (osdDev < 0)
-     esyslog("ERROR: invalid OSD device handle (%d)!", osdDev);
-  else {
-     osdMem = MAXOSDMEMORY;
-#ifdef OSD_CAP_MEMSIZE
-     // modified DVB cards may have more OSD memory:
-     osd_cap_t cap;
-     cap.cmd = OSD_CAP_MEMSIZE;
-     if (ioctl(osdDev, OSD_GET_CAPABILITY, &cap) == 0)
-        osdMem = cap.val;
-#endif
-     }
-}
-
-cDvbOsd::~cDvbOsd()
-{
-  SetActive(false);
-}
-
-void cDvbOsd::SetActive(bool On)
-{
-  if (On != Active()) {
-     cOsd::SetActive(On);
-     if (On) {
-        // must clear all windows here to avoid flashing effects - doesn't work if done
-        // in Flush() only for the windows that are actually used...
-        for (int i = 0; i < MAXNUMWINDOWS; i++) {
-            Cmd(OSD_SetWindow, 0, i + 1);
-            Cmd(OSD_Clear);
-            }
-        if (GetBitmap(0)) // only flush here if there are already bitmaps
-           Flush();
-        }
-     else if (shown) {
-        cBitmap *Bitmap;
-        for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
-            Cmd(OSD_SetWindow, 0, i + 1);
-            Cmd(OSD_Close);
-            }
-        shown = false;
-        }
-     }
-}
-
-eOsdError cDvbOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
-{
-  eOsdError Result = cOsd::CanHandleAreas(Areas, NumAreas);
-  if (Result == oeOk) {
-     if (NumAreas > MAXNUMWINDOWS)
-        return oeTooManyAreas;
-     int TotalMemory = 0;
-     for (int i = 0; i < NumAreas; i++) {
-         if (Areas[i].bpp != 1 && Areas[i].bpp != 2 && Areas[i].bpp != 4 && Areas[i].bpp != 8)
-            return oeBppNotSupported;
-         if ((Areas[i].Width() & (8 / Areas[i].bpp - 1)) != 0)
-            return oeWrongAlignment;
-         if (Areas[i].Width() < 1 || Areas[i].Height() < 1 || Areas[i].Width() > 720 || Areas[i].Height() > 576)
-            return oeWrongAreaSize;
-         TotalMemory += Areas[i].Width() * Areas[i].Height() / (8 / Areas[i].bpp);
-         }
-     if (TotalMemory > osdMem)
-        return oeOutOfMemory;
-     }
-  return Result;
-}
-
-eOsdError cDvbOsd::SetAreas(const tArea *Areas, int NumAreas)
-{
-  if (shown) {
-     cBitmap *Bitmap;
-     for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
-         Cmd(OSD_SetWindow, 0, i + 1);
-         Cmd(OSD_Close);
-         }
-     shown = false;
-     }
-  return cOsd::SetAreas(Areas, NumAreas);
-}
-
-void cDvbOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, const void *data)
-{
-  if (osdDev >= 0) {
-     osd_cmd_t dc;
-     dc.cmd   = cmd;
-     dc.color = color;
-     dc.x0    = x0;
-     dc.y0    = y0;
-     dc.x1    = x1;
-     dc.y1    = y1;
-     dc.data  = (void *)data;
-     ioctl(osdDev, OSD_SEND_CMD, &dc);
-     }
-}
-
-void cDvbOsd::Flush(void)
-{
-  if (!Active())
-     return;
-  cBitmap *Bitmap;
-  for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
-      Cmd(OSD_SetWindow, 0, i + 1);
-      if (!shown)
-         Cmd(OSD_Open, Bitmap->Bpp(), Left() + Bitmap->X0(), Top() + Bitmap->Y0(), Left() + Bitmap->X0() + Bitmap->Width() - 1, Top() + Bitmap->Y0() + Bitmap->Height() - 1, (void *)1); // initially hidden!
-      int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
-      if (!shown || Bitmap->Dirty(x1, y1, x2, y2)) {
-         if (!shown) {
-            x1 = y1 = 0;
-            x2 = Bitmap->Width() - 1;
-            y2 = Bitmap->Height() - 1;
-            }
-         //TODO Workaround: apparently the bitmap sent to the driver always has to be a multiple
-         //TODO of 8 bits wide, and (dx * dy) also has to be a multiple of 8.
-         //TODO Fix driver (should be able to handle any size bitmaps!)
-         while ((x1 > 0 || x2 < Bitmap->Width() - 1) && ((x2 - x1) & 7) != 7) {
-               if (x2 < Bitmap->Width() - 1)
-                  x2++;
-               else if (x1 > 0)
-                  x1--;
-               }
-         //TODO "... / 2" <==> Bpp???
-         while ((y1 > 0 || y2 < Bitmap->Height() - 1) && (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0) {
-               if (y2 < Bitmap->Height() - 1)
-                  y2++;
-               else if (y1 > 0)
-                  y1--;
-               }
-         while ((x1 > 0 || x2 < Bitmap->Width() - 1) && (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0) {
-               if (x2 < Bitmap->Width() - 1)
-                  x2++;
-               else if (x1 > 0)
-                  x1--;
-               }
-         // commit colors:
-         int NumColors;
-         const tColor *Colors = Bitmap->Colors(NumColors);
-         if (Colors) {
-            //TODO this should be fixed in the driver!
-            tColor colors[NumColors];
-            for (int i = 0; i < NumColors; i++) {
-                // convert AARRGGBB to AABBGGRR (the driver expects the colors the wrong way):
-                colors[i] = (Colors[i] & 0xFF000000) | ((Colors[i] & 0x0000FF) << 16) | (Colors[i] & 0x00FF00) | ((Colors[i] & 0xFF0000) >> 16);
-                }
-            Colors = colors;
-            //TODO end of stuff that should be fixed in the driver
-            Cmd(OSD_SetPalette, 0, NumColors - 1, 0, 0, 0, Colors);
-            }
-         // commit modified data:
-         Cmd(OSD_SetBlock, Bitmap->Width(), x1, y1, x2, y2, Bitmap->Data(x1, y1));
-         }
-      Bitmap->Clean();
-      }
-  if (!shown) {
-     // Showing the windows in a separate loop to avoid seeing them come up one after another
-     for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
-         Cmd(OSD_SetWindow, 0, i + 1);
-         Cmd(OSD_MoveWindow, 0, Left() + Bitmap->X0(), Top() + Bitmap->Y0());
-         }
-     shown = true;
-     }
-}
-
-// --- cDvbOsdProvider -------------------------------------------------------
-
-cDvbOsdProvider::cDvbOsdProvider(int OsdDev)
-{
-  osdDev = OsdDev;
-}
-
-cOsd *cDvbOsdProvider::CreateOsd(int Left, int Top, uint Level)
-{
-  return new cDvbOsd(Left, Top, osdDev, Level);
-}
diff -ruN vdr-1.7.10/dvbosd.h vdr-1.7.11/dvbosd.h
--- vdr-1.7.10/dvbosd.h	2007-08-25 15:49:34.000000000 +0200
+++ vdr-1.7.11/dvbosd.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,23 +0,0 @@
-/*
- * dvbosd.h: Implementation of the DVB On Screen Display
- *
- * See the main source file 'vdr.c' for copyright information and
- * how to reach the author.
- *
- * $Id: dvbosd.h 2.0 2007/08/25 13:49:34 kls Exp $
- */
-
-#ifndef __DVBOSD_H
-#define __DVBOSD_H
-
-#include "osd.h"
-
-class cDvbOsdProvider : public cOsdProvider {
-private:
-  int osdDev;
-public:
-  cDvbOsdProvider(int OsdDev);
-  virtual cOsd *CreateOsd(int Left, int Top, uint Level);
-  };
-
-#endif //__DVBOSD_H
diff -ruN vdr-1.7.10/dvbplayer.c vdr-1.7.11/dvbplayer.c
--- vdr-1.7.10/dvbplayer.c	2009-05-31 16:12:42.000000000 +0200
+++ vdr-1.7.11/dvbplayer.c	2009-12-13 14:49:56.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: dvbplayer.c 2.17 2009/05/31 14:12:42 kls Exp $
+ * $Id: dvbplayer.c 2.19 2009/12/13 13:49:56 kls Exp $
  */
 
 #include "dvbplayer.h"
@@ -404,6 +404,8 @@
            cPoller Poller;
            DevicePoll(Poller, 10);
            Sleep = false;
+           if (playMode == pmStill || playMode==pmPause)
+              cCondWait::SleepMs(3);
            }
         {
           LOCK_THREAD;
@@ -666,6 +668,7 @@
             trickSpeed = NORMAL_SPEED;
             TrickSpeed(Setup.MultiSpeedMode ? -1 : -MAX_SPEEDS);
             break;
+       default: esyslog("ERROR: unknown playMode %d (%s)", playMode, __FUNCTION__);
        }
      }
 }
@@ -717,6 +720,7 @@
             TrickSpeed(Setup.MultiSpeedMode ? -1 : -MAX_SPEEDS);
             }
             break;
+       default: esyslog("ERROR: unknown playMode %d (%s)", playMode, __FUNCTION__);
        }
      }
 }
diff -ruN vdr-1.7.10/dvbspu.c vdr-1.7.11/dvbspu.c
--- vdr-1.7.10/dvbspu.c	2009-11-22 15:17:59.000000000 +0100
+++ vdr-1.7.11/dvbspu.c	2009-12-26 16:51:15.000000000 +0100
@@ -8,7 +8,7 @@
  *
  * parts of this file are derived from the OMS program.
  *
- * $Id: dvbspu.c 2.2 2009/11/22 14:17:59 kls Exp $
+ * $Id: dvbspu.c 2.7 2009/12/26 15:51:15 kls Exp $
  */
 
 #include "dvbspu.h"
@@ -16,7 +16,6 @@
 #include <string.h>
 #include <inttypes.h>
 #include <math.h>
-#include "device.h"
 
 /*
  * cDvbSpubitmap:
@@ -147,7 +146,7 @@
         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 false;
 
     return ret;
 }
@@ -340,6 +339,35 @@
     return size;
 }
 
+int cDvbSpuBitmap::getMinBpp(const aDvbSpuPalDescr paldescr)
+{
+    int col = 1;
+    for (int i = 0; i < 4; i++) {
+        if (paldescr[i].trans != 0) {
+                col++;
+        }
+    }
+    return col > 2 ? 4 : 2;
+}
+
+int cDvbSpuDecoder::CalcAreaBpp(cBitmap *fgbmp, cBitmap *bgbmp)
+{
+        int fgbpp = 0;
+        int bgbpp = 0;
+        int ret;
+    if (fgbmp) {
+            fgbpp = spubmp->getMinBpp(hlpDescr);
+    }
+    if (bgbmp) {
+            bgbpp = spubmp->getMinBpp(palDescr);
+    }
+    ret = fgbpp + bgbpp;
+    if (ret > 2)
+            ret = 4;
+    return ret;
+}
+
+
 void cDvbSpuDecoder::Draw(void)
 {
     cMutexLock MutexLock(&mutex);
@@ -347,43 +375,92 @@
         Hide();
         return;
     }
-
+    sDvbSpuRect bgsize;
     cBitmap *fg = NULL;
     cBitmap *bg = NULL;
-    sDvbSpuRect bgsize;
-    sDvbSpuRect hlsize;
-
-    hlsize.x1 = hlpsize.x1;
-    hlsize.y1 = hlpsize.y1;
-    hlsize.x2 = hlpsize.x2;
-    hlsize.y2 = hlpsize.y2;
 
     if (highlight)
-        fg = spubmp->getBitmap(hlpDescr, palette, hlsize);
+        fg = spubmp->getBitmap(hlpDescr, palette, hlpsize);
 
     if (spubmp->getMinSize(palDescr, bgsize))
         bg = spubmp->getBitmap(palDescr, palette, bgsize);
 
-    sDvbSpuRect areaSize = CalcAreaSize(hlsize, fg, bgsize, bg);
+    if (!fg || !bg || !osd)
+        Hide();
 
-    if (!fg || !bg || !osd) {
-       Hide();
-       }
+    if (osd == NULL) {
+            restricted_osd = false;
+            osd = cOsdProvider::NewOsd(0, 0);
+
+            tArea Area = { size.x1, size.y1, size.x2, size.y2, 4};
+            if (osd->CanHandleAreas(&Area, 1) != oeOk)
+                    restricted_osd = true;
+            else
+                osd->SetAreas(&Area, 1);
+    }
+    if (restricted_osd) {
+            sDvbSpuRect hlsize;
+            bool setarea = false;
+            /* reduce fg area (only valid if there is no bg below) */
+            if (fg) {
+                    spubmp->getMinSize(hlpDescr,hlsize);
+                    /* clip to the highligh area */
+                    setMax(hlsize.x1, hlpsize.x1);
+                    setMax(hlsize.y1, hlpsize.y1);
+                    setMin(hlsize.x2, hlpsize.x2);
+                    setMin(hlsize.y2, hlpsize.y2);
+                    if (hlsize.x1 > hlsize.x2 || hlsize.y1 > hlsize.y2) {
+                            hlsize.x1 = hlsize.x2 = hlsize.y1 = hlsize.y2 = 0;
+                    }
+            }
+            sDvbSpuRect areaSize = CalcAreaSize((fg && bg) ? hlpsize : hlsize, fg, bgsize, bg);
 
-    if (bg || fg) {
-        if (osd == NULL) {
-           osd = cOsdProvider::NewOsd(0, 0);
-           if ((areaSize.width() & 3) != 0)
-              areaSize.x2 += 4 - (areaSize.width() & 3);
-           tArea Area = { areaSize.x1, areaSize.y1, areaSize.x2, areaSize.y2, (fg && bg) ? 4 : 2 };
-           if (osd->SetAreas(&Area, 1) != oeOk)
+#define DIV(a, b) (a/b)?:1
+            for (int d = 1; !setarea && d <= 2; d++) {
+
+                    /* first try old behaviour */
+                    tArea Area = { areaSize.x1, areaSize.y1, areaSize.x2, areaSize.y2, DIV(CalcAreaBpp(fg, bg), d) };
+
+                    if ((Area.Width() & 7) != 0)
+                            Area.x2 += 8 - (Area.Width() & 7);
+
+                    if (osd->CanHandleAreas(&Area, 1) == oeOk &&
+                        osd->SetAreas(&Area, 1) == oeOk)
+                            setarea = true;
+
+                    /* second try to split area if there is both area */
+                    if (!setarea && fg && bg) {
+                            tArea Area_Both [2] = {
+                                    {bgsize.x1, bgsize.y1, bgsize.x2, bgsize.y2, DIV(CalcAreaBpp(0, bg), d)},
+                                    {hlpsize.x1, hlpsize.y1, hlpsize.x2, hlpsize.y2, DIV(CalcAreaBpp(fg, 0), d)}
+                            };
+                            if (!Area_Both[0].Intersects(Area_Both[1])) {
+                                    /* there is no intersection. We can reduce hl */
+                                    Area_Both[1].x1 = hlsize.x1;
+                                    Area_Both[1].y1 = hlsize.y1;
+                                    Area_Both[1].x2 = hlsize.x2;
+                                    Area_Both[1].y2 = hlsize.y2;
+
+                                    if ((Area_Both[0].Width() & 7) != 0)
+                                            Area_Both[0].x2 += 8 - (Area_Both[0].Width() & 7);
+                                    if ((Area_Both[1].Width() & 7) != 0)
+                                            Area_Both[1].x2 += 8 - (Area_Both[1].Width() & 7);
+                                    if (osd->CanHandleAreas(Area_Both, 2) == oeOk &&
+                                        osd->SetAreas(Area_Both, 2) == oeOk)
+                                            setarea = true;
+                            }
+                    }
+            }
+            if (!setarea)
               dsyslog("dvbspu: AreaSize (%d, %d) (%d, %d) Bpp %d", areaSize.x1, areaSize.y1, areaSize.x2, areaSize.y2, (fg && bg) ? 4 : 2 );
-           }
+    }
 
+    /* we could draw use DrawPixel on osd */
+    if (bg || fg) {
         if (bg)
            osd->DrawBitmap(bgsize.x1, bgsize.y1, *bg);
         if (fg)
-           osd->DrawBitmap(hlsize.x1, hlsize.y1, *fg);
+           osd->DrawBitmap(hlpsize.x1, hlpsize.y1, *fg);
         delete fg;
         delete bg;
 
@@ -514,6 +591,7 @@
                 }
             }
             if (fodd != 0 && feven != 0) {
+                Hide();
                 delete spubmp;
                 spubmp = new cDvbSpuBitmap(size, spu + fodd, spu + feven,
                                            spu + feven, spu + cmdOffs());
diff -ruN vdr-1.7.10/dvbspu.h vdr-1.7.11/dvbspu.h
--- vdr-1.7.10/dvbspu.h	2009-05-09 18:26:45.000000000 +0200
+++ vdr-1.7.11/dvbspu.h	2009-12-13 13:07:00.000000000 +0100
@@ -8,7 +8,7 @@
  *
  * parts of this file are derived from the OMS program.
  *
- * $Id: dvbspu.h 2.1 2009/05/09 16:26:45 kls Exp $
+ * $Id: dvbspu.h 2.4 2009/12/13 12:07:00 kls Exp $
  */
 
 #ifndef __DVBSPU_H
@@ -80,6 +80,7 @@
 
     bool getMinSize(const aDvbSpuPalDescr paldescr,
                     sDvbSpuRect & size) const;
+    int getMinBpp(const aDvbSpuPalDescr paldescr);
     cBitmap *getBitmap(const aDvbSpuPalDescr paldescr,
                        const cDvbSpuPalette & pal,
                        sDvbSpuRect & size) const;
@@ -97,6 +98,7 @@
     uint32_t spupts;
     bool clean;
     bool ready;
+    bool restricted_osd;
 
     enum spFlag { spNONE, spHIDE, spSHOW, spMENU };
     spFlag state;
@@ -129,6 +131,7 @@
     };
 
     sDvbSpuRect CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDvbSpuRect bgsize, cBitmap *bgbmp);
+    int CalcAreaBpp(cBitmap *fgbmp, cBitmap *bgbmp);
 
   public:
     cDvbSpuDecoder();
@@ -194,8 +197,7 @@
 
 inline uint32_t cDvbSpuPalette::getColor(uint8_t idx, uint8_t trans) const
 {
-    uint8_t t = trans == 0x0f ? 0xff : trans << 4;
-    return palette[idx] | (t << 24);
+    return palette[idx] | ((trans == 0x0f) ? 0xff000000 : (trans << 28));
 }
 
 #endif                          // __DVBSPU_H
diff -ruN vdr-1.7.10/dvbsubtitle.c vdr-1.7.11/dvbsubtitle.c
--- vdr-1.7.10/dvbsubtitle.c	2009-11-22 13:28:53.000000000 +0100
+++ vdr-1.7.11/dvbsubtitle.c	2009-12-05 17:11:54.000000000 +0100
@@ -7,7 +7,7 @@
  * Original author: Marco Schl��ler <marco@lordzodiac.de>
  * With some input from the "subtitle plugin" by Pekka Virtanen <pekka.virtanen@sci.fi>
  *
- * $Id: dvbsubtitle.c 2.2 2009/11/22 12:28:53 kls Exp $
+ * $Id: dvbsubtitle.c 2.3 2009/12/05 16:11:54 kls Exp $
  */
 
 #include "dvbsubtitle.h"
@@ -160,21 +160,22 @@
                    ;
              break;
         case 0x20: //TODO
-             dbgobjects("sub block 2 to 4 map");
+             dbgobjects("sub block 2 to 4 map\n");
              index += 4;
              break;
         case 0x21: //TODO
-             dbgobjects("sub block 2 to 8 map");
+             dbgobjects("sub block 2 to 8 map\n");
              index += 4;
              break;
         case 0x22: //TODO
-             dbgobjects("sub block 4 to 8 map");
+             dbgobjects("sub block 4 to 8 map\n");
              index += 16;
              break;
         case 0xF0:
              x = 0;
              y += 2;
              break;
+        default: dbgobjects("unknown sub block %s %d\n", __FUNCTION__, __LINE__);
         }
       }
 }
@@ -233,7 +234,7 @@
         rl = 1; //color 0
      else {
         code = Get2Bits(Data, Index);
-        switch (code & 0x3) { //switch_3
+        switch (code & 3) { //switch_3
           case 0:
                return false;
           case 1:
@@ -247,6 +248,7 @@
                rl = (Get2Bits(Data, Index) << 6) + (Get2Bits(Data, Index) << 4) + (Get2Bits(Data, Index) << 2) + Get2Bits(Data, Index) + 29;
                color = Get2Bits(Data, Index);
                break;
+          default: ;
           }
         }
      }
@@ -283,6 +285,7 @@
                   rl = (Get4Bits(Data, Index) << 4) + Get4Bits(Data, Index) + 25;
                   color = Get4Bits(Data, Index);
                   break;
+             default: ;
              }
            }
         else {
@@ -516,6 +519,7 @@
          break;
     case 3: // reserved
          break;
+    default: dbgpages("unknown page state (%s %d)\n", __FUNCTION__, __LINE__);
     }
 }
 
@@ -900,6 +904,7 @@
                  case 2: region->FillRegion((Data[6 + 9] & 0x0C) >> 2); break;
                  case 4: region->FillRegion((Data[6 + 9] & 0xF0) >> 4); break;
                  case 8: region->FillRegion(Data[6 + 8]); break;
+                 default: dbgregions("unknown bpp %d (%s %d)\n", region->Bpp(), __FUNCTION__, __LINE__);
                  }
                }
             for (int i = 6 + 10; i < segmentLength; i += 6) {
diff -ruN vdr-1.7.10/eit.c vdr-1.7.11/eit.c
--- vdr-1.7.10/eit.c	2009-06-21 15:46:20.000000000 +0200
+++ vdr-1.7.11/eit.c	2010-01-03 16:35:21.000000000 +0100
@@ -8,7 +8,7 @@
  * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
  * Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
  *
- * $Id: eit.c 2.6 2009/06/21 13:46:20 kls Exp $
+ * $Id: eit.c 2.10 2010/01/03 15:35:21 kls Exp $
  */
 
 #include "eit.h"
@@ -153,9 +153,40 @@
                     }
                  }
                  break;
-            case SI::ContentDescriptorTag:
+            case SI::ContentDescriptorTag: {
+                 SI::ContentDescriptor *cd = (SI::ContentDescriptor *)d;
+                 SI::ContentDescriptor::Nibble Nibble;
+                 int NumContents = 0;
+                 uchar Contents[MAXEVCONTENTS] = { 0 };
+                 for (SI::Loop::Iterator it3; cd->nibbleLoop.getNext(Nibble, it3); ) {
+                     if (NumContents < MAXEVCONTENTS) {
+                        Contents[NumContents] = ((Nibble.getContentNibbleLevel1() & 0xF) << 4) | (Nibble.getContentNibbleLevel2() & 0xF);
+                        NumContents++;
+                        }
+                     }
+                 pEvent->SetContents(Contents);
+                 }
                  break;
-            case SI::ParentalRatingDescriptorTag:
+            case SI::ParentalRatingDescriptorTag: {
+                 int LanguagePreferenceRating = -1;
+                 SI::ParentalRatingDescriptor *prd = (SI::ParentalRatingDescriptor *)d;
+                 SI::ParentalRatingDescriptor::Rating Rating;
+                 for (SI::Loop::Iterator it3; prd->ratingLoop.getNext(Rating, it3); ) {
+                     if (I18nIsPreferredLanguage(Setup.EPGLanguages, Rating.languageCode, LanguagePreferenceRating)) {
+                        int ParentalRating = (Rating.getRating() & 0xFF);
+                        switch (ParentalRating) {
+                          // values defined by the DVB standard (minimum age = rating + 3 years):
+                          case 0x01 ... 0x0F: ParentalRating += 3; break;
+                          // values defined by broadcaster CSAT (now why didn't they just use 0x07, 0x09 and 0x0D?):
+                          case 0x11:          ParentalRating = 10; break;
+                          case 0x12:          ParentalRating = 12; break;
+                          case 0x13:          ParentalRating = 16; break;
+                          default:            ParentalRating = 0;
+                          }
+                        pEvent->SetParentalRating(ParentalRating);
+                        }
+                     }
+                 }
                  break;
             case SI::PDCDescriptorTag: {
                  SI::PDCDescriptor *pd = (SI::PDCDescriptor *)d;
@@ -320,6 +351,8 @@
 
 // --- cEitFilter ------------------------------------------------------------
 
+time_t cEitFilter::disableUntil = 0;
+
 cEitFilter::cEitFilter(void)
 {
   Set(0x12, 0x40, 0xC0);  // event info now&next actual/other TS (0x4E/0x4F), future actual/other TS (0x5X/0x6X)
@@ -327,8 +360,19 @@
      Set(0x14, 0x70);     // TDT
 }
 
+void cEitFilter::SetDisableUntil(time_t Time)
+{
+  disableUntil = Time;
+}
+
 void cEitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length)
 {
+  if (disableUntil) {
+     if (time(NULL) > disableUntil)
+        disableUntil = 0;
+     else
+        return;
+     }
   switch (Pid) {
     case 0x12: {
          if (Tid >= 0x4E && Tid <= 0x6F) {
@@ -354,5 +398,6 @@
             cTDT TDT(Data);
          }
          break;
+    default: ;
     }
 }
diff -ruN vdr-1.7.10/eit.h vdr-1.7.11/eit.h
--- vdr-1.7.10/eit.h	2003-12-21 15:51:50.000000000 +0100
+++ vdr-1.7.11/eit.h	2010-01-03 16:28:34.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: eit.h 2.0 2003/12/21 14:51:50 kls Exp $
+ * $Id: eit.h 2.1 2010/01/03 15:28:34 kls Exp $
  */
 
 #ifndef __EIT_H
@@ -13,10 +13,13 @@
 #include "filter.h"
 
 class cEitFilter : public cFilter {
+private:
+  static time_t disableUntil;
 protected:
   virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length);
 public:
   cEitFilter(void);
+  static void SetDisableUntil(time_t Time);
   };
 
 #endif //__EIT_H
diff -ruN vdr-1.7.10/epg.c vdr-1.7.11/epg.c
--- vdr-1.7.10/epg.c	2008-05-01 16:53:55.000000000 +0200
+++ vdr-1.7.11/epg.c	2010-01-03 15:10:20.000000000 +0100
@@ -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 2.1 2008/05/01 14:53:55 kls Exp $
+ * $Id: epg.c 2.4 2010/01/03 14:10:20 kls Exp $
  */
 
 #include "epg.h"
@@ -112,6 +112,8 @@
   shortText = NULL;
   description = NULL;
   components = NULL;
+  memset(contents, 0, sizeof(contents));
+  parentalRating = 0;
   startTime = 0;
   duration = 0;
   vps = 0;
@@ -186,6 +188,17 @@
   components = Components;
 }
 
+void cEvent::SetContents(uchar *Contents)
+{
+  for (int i = 0; i < MAXEVCONTENTS; i++)
+      contents[i] = Contents[i];
+}
+
+void cEvent::SetParentalRating(int ParentalRating)
+{
+  parentalRating = ParentalRating;
+}
+
 void cEvent::SetStartTime(time_t StartTime)
 {
   if (startTime != StartTime) {
@@ -234,6 +247,155 @@
   return runningStatus >= (OrAboutToStart ? SI::RunningStatusStartsInAFewSeconds : SI::RunningStatusPausing);
 }
 
+const char *cEvent::ContentToString(uchar Content)
+{
+  switch (Content & 0xF0) {
+    case EVCONTENTMASK_MOVIEDRAMA:
+         switch (Content & 0x0F) {
+           default:
+           case 0x00: return tr("Content$Movie/Drama");
+           case 0x01: return tr("Content$Detective/Thriller");
+           case 0x02: return tr("Content$Adventure/Western/War");
+           case 0x03: return tr("Content$Science Fiction/Fantasy/Horror");
+           case 0x04: return tr("Content$Comedy");
+           case 0x05: return tr("Content$Soap/Melodrama/Folkloric");
+           case 0x06: return tr("Content$Romance");
+           case 0x07: return tr("Content$Serious/Classical/Religious/Historical Movie/Drama");
+           case 0x08: return tr("Content$Adult Movie/Drama");
+           }
+         break;
+    case EVCONTENTMASK_NEWSCURRENTAFFAIRS:
+         switch (Content & 0x0F) {
+           default:
+           case 0x00: return tr("Content$News/Current Affairs");
+           case 0x01: return tr("Content$News/Weather Report");
+           case 0x02: return tr("Content$News Magazine");
+           case 0x03: return tr("Content$Documentary");
+           case 0x04: return tr("Content$Discussion/Inverview/Debate");
+           }
+         break;
+    case EVCONTENTMASK_SHOW:
+         switch (Content & 0x0F) {
+           default:
+           case 0x00: return tr("Content$Show/Game Show");
+           case 0x01: return tr("Content$Game Show/Quiz/Contest");
+           case 0x02: return tr("Content$Variety Show");
+           case 0x03: return tr("Content$Talk Show");
+           }
+         break;
+    case EVCONTENTMASK_SPORTS:
+         switch (Content & 0x0F) {
+           default:
+           case 0x00: return tr("Content$Sports");
+           case 0x01: return tr("Content$Special Event");
+           case 0x02: return tr("Content$Sport Magazine");
+           case 0x03: return tr("Content$Football/Soccer");
+           case 0x04: return tr("Content$Tennis/Squash");
+           case 0x05: return tr("Content$Team Sports");
+           case 0x06: return tr("Content$Athletics");
+           case 0x07: return tr("Content$Motor Sport");
+           case 0x08: return tr("Content$Water Sport");
+           case 0x09: return tr("Content$Winter Sports");
+           case 0x0A: return tr("Content$Equestrian");
+           case 0x0B: return tr("Content$Martial Sports");
+           }
+         break;
+    case EVCONTENTMASK_CHILDRENYOUTH:
+         switch (Content & 0x0F) {
+           default:
+           case 0x00: return tr("Content$Children's/Youth Programme");
+           case 0x01: return tr("Content$Pre-school Children's Programme");
+           case 0x02: return tr("Content$Entertainment Programme for 6 to 14");
+           case 0x03: return tr("Content$Entertainment Programme for 10 to 16");
+           case 0x04: return tr("Content$Informational/Educational/School Programme");
+           case 0x05: return tr("Content$Cartoons/Puppets");
+           }
+         break;
+    case EVCONTENTMASK_MUSICBALLETDANCE:
+         switch (Content & 0x0F) {
+           default:
+           case 0x00: return tr("Content$Music/Ballet/Dance");
+           case 0x01: return tr("Content$Rock/Pop");
+           case 0x02: return tr("Content$Serious/Classical Music");
+           case 0x03: return tr("Content$Folk/Tradional Music");
+           case 0x04: return tr("Content$Jazz");
+           case 0x05: return tr("Content$Musical/Opera");
+           case 0x06: return tr("Content$Ballet");
+           }
+         break;
+    case EVCONTENTMASK_ARTSCULTURE:
+         switch (Content & 0x0F) {
+           default:
+           case 0x00: return tr("Content$Arts/Culture");
+           case 0x01: return tr("Content$Performing Arts");
+           case 0x02: return tr("Content$Fine Arts");
+           case 0x03: return tr("Content$Religion");
+           case 0x04: return tr("Content$Popular Culture/Traditional Arts");
+           case 0x05: return tr("Content$Literature");
+           case 0x06: return tr("Content$Film/Cinema");
+           case 0x07: return tr("Content$Experimental Film/Video");
+           case 0x08: return tr("Content$Broadcasting/Press");
+           case 0x09: return tr("Content$New Media");
+           case 0x0A: return tr("Content$Arts/Culture Magazine");
+           case 0x0B: return tr("Content$Fashion");
+           }
+         break;
+    case EVCONTENTMASK_SOCIALPOLITICALECONOMICS:
+         switch (Content & 0x0F) {
+           default:
+           case 0x00: return tr("Content$Social/Political/Economics");
+           case 0x01: return tr("Content$Magazine/Report/Documentary");
+           case 0x02: return tr("Content$Economics/Social Advisory");
+           case 0x03: return tr("Content$Remarkable People");
+           }
+         break;
+    case EVCONTENTMASK_EDUCATIONALSCIENCE:
+         switch (Content & 0x0F) {
+           default:
+           case 0x00: return tr("Content$Education/Science/Factual");
+           case 0x01: return tr("Content$Nature/Animals/Environment");
+           case 0x02: return tr("Content$Technology/Natural Sciences");
+           case 0x03: return tr("Content$Medicine/Physiology/Psychology");
+           case 0x04: return tr("Content$Foreign Countries/Expeditions");
+           case 0x05: return tr("Content$Social/Spiritual Sciences");
+           case 0x06: return tr("Content$Further Education");
+           case 0x07: return tr("Content$Languages");
+           }
+         break;
+    case EVCONTENTMASK_LEISUREHOBBIES:
+         switch (Content & 0x0F) {
+           default:
+           case 0x00: return tr("Content$Leisure/Hobbies");
+           case 0x01: return tr("Content$Tourism/Travel");
+           case 0x02: return tr("Content$Handicraft");
+           case 0x03: return tr("Content$Motoring");
+           case 0x04: return tr("Content$Fitness & Health");
+           case 0x05: return tr("Content$Cooking");
+           case 0x06: return tr("Content$Advertisement/Shopping");
+           case 0x07: return tr("Content$Gardening");
+           }
+         break;
+    case EVCONTENTMASK_SPECIAL:
+         switch (Content & 0x0F) {
+           case 0x00: return tr("Content$Original Language");
+           case 0x01: return tr("Content$Black & White");
+           case 0x02: return tr("Content$Unpublished");
+           case 0x03: return tr("Content$Live Broadcast");
+           default: ;
+           }
+         break;
+    default: ;
+    }
+  return "";
+}
+
+cString cEvent::GetParentalRatingString(void) const
+{
+  if (parentalRating)
+     return cString::sprintf(tr("ParentalRating$from %d"), parentalRating);
+  return NULL;
+}
+
 cString cEvent::GetDateString(void) const
 {
   return DateString(startTime);
@@ -270,6 +432,14 @@
         fprintf(f, "%sD %s\n", Prefix, description);
         strreplace(description, '|', '\n');
         }
+     if (contents[0]) {
+        fprintf(f, "%sG", Prefix);
+        for (int i = 0; Contents(i); i++)
+            fprintf(f, " %02X", Contents(i));
+        fprintf(f, "\n");
+        }
+     if (parentalRating)
+        fprintf(f, "%sR %d\n", Prefix, parentalRating);
      if (components) {
         for (int i = 0; i < components->NumComponents(); i++) {
             tComponent *p = components->Component(i);
@@ -296,6 +466,22 @@
     case 'D': strreplace(t, '|', '\n');
               SetDescription(t);
               break;
+    case 'G': {
+                memset(contents, 0, sizeof(contents));
+                for (int i = 0; i < MAXEVCONTENTS; i++) {
+                    char *tail = NULL;
+                    int c = strtol(t, &tail, 16);
+                    if (0x00 < c && c <= 0xFF) {
+                       contents[i] = c;
+                       t = tail;
+                       }
+                    else
+                       break;
+                    }
+              }
+              break;
+    case 'R': SetParentalRating(atoi(t));
+              break;
     case 'X': if (!components)
                  components = new cComponents;
               components->SetComponent(components->NumComponents(), t);
@@ -603,6 +789,7 @@
                      case 0x0F: p->description = strdup("HD 16:9"); break;
                      case 0x0C:
                      case 0x10: p->description = strdup("HD >16:9"); break;
+                     default: ;
                      }
                    EpgBugFixStat(9, ChannelID());
                    }
@@ -621,12 +808,13 @@
                 if (!p->description) {
                    switch (p->type) {
                      case 0x05: p->description = strdup("Dolby Digital"); break;
-                     // all others will just display the language
+                     default: ; // all others will just display the language
                      }
                    EpgBugFixStat(11, ChannelID());
                    }
                 }
                 break;
+           default: ;
            }
          }
      }
@@ -863,6 +1051,7 @@
                p->Dump(f, Prefix);
             }
             break;
+       default: esyslog("ERROR: unknown DumpMode %d (%s %d)", DumpMode, __FUNCTION__, __LINE__);
        }
      fprintf(f, "%sc\n", Prefix);
      }
diff -ruN vdr-1.7.10/epg.h vdr-1.7.11/epg.h
--- vdr-1.7.10/epg.h	2006-10-07 15:47:19.000000000 +0200
+++ vdr-1.7.11/epg.h	2010-01-03 15:39:14.000000000 +0100
@@ -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.h 2.0 2006/10/07 13:47:19 kls Exp $
+ * $Id: epg.h 2.3 2010/01/03 14:39:14 kls Exp $
  */
 
 #ifndef __EPG_H
@@ -19,6 +19,20 @@
 
 #define MAXEPGBUGFIXLEVEL 3
 
+#define MAXEVCONTENTS                          4
+#define EVCONTENTMASK_MOVIEDRAMA               0x10
+#define EVCONTENTMASK_NEWSCURRENTAFFAIRS       0x20
+#define EVCONTENTMASK_SHOW                     0x30
+#define EVCONTENTMASK_SPORTS                   0x40
+#define EVCONTENTMASK_CHILDRENYOUTH            0x50
+#define EVCONTENTMASK_MUSICBALLETDANCE         0x60
+#define EVCONTENTMASK_ARTSCULTURE              0x70
+#define EVCONTENTMASK_SOCIALPOLITICALECONOMICS 0x80
+#define EVCONTENTMASK_EDUCATIONALSCIENCE       0x90
+#define EVCONTENTMASK_LEISUREHOBBIES           0xA0
+#define EVCONTENTMASK_SPECIAL                  0xB0
+#define EVCONTENTMASK_USERDEFINED              0xF0
+
 enum eDumpMode { dmAll, dmPresent, dmFollowing, dmAtTime };
 
 struct tComponent {
@@ -53,15 +67,18 @@
 class cEvent : public cListObject {
   friend class cSchedule;
 private:
+  // The sequence of these parameters is optimized for minimal memory waste!
   cSchedule *schedule;     // The Schedule this event belongs to
   tEventID eventID;        // Event ID of this event
   uchar tableID;           // Table ID this event came from
   uchar version;           // Version number of section this event came from
-  int runningStatus;       // 0=undefined, 1=not running, 2=starts in a few seconds, 3=pausing, 4=running
+  uchar runningStatus;     // 0=undefined, 1=not running, 2=starts in a few seconds, 3=pausing, 4=running
+  uchar parentalRating;    // Parental rating of this event
   char *title;             // Title of this event
   char *shortText;         // Short description of this event (typically the episode name in case of a series)
   char *description;       // Description of this event
   cComponents *components; // The stream components of this event
+  uchar contents[MAXEVCONTENTS]; // Contents of this event
   time_t startTime;        // Start time of this event
   int duration;            // Duration of this event in seconds
   time_t vps;              // Video Programming Service timestamp (VPS, aka "Programme Identification Label", PIL)
@@ -80,6 +97,8 @@
   const char *ShortText(void) const { return shortText; }
   const char *Description(void) const { return description; }
   const cComponents *Components(void) const { return components; }
+  uchar Contents(int i = 0) const { return (0 <= i && i < MAXEVCONTENTS) ? contents[i] : 0; }
+  int ParentalRating(void) const { return parentalRating; }
   time_t StartTime(void) const { return startTime; }
   time_t EndTime(void) const { return startTime + duration; }
   int Duration(void) const { return duration; }
@@ -88,6 +107,8 @@
   bool SeenWithin(int Seconds) const { return time(NULL) - seen < Seconds; }
   bool HasTimer(void) const;
   bool IsRunning(bool OrAboutToStart = false) const;
+  static const char *ContentToString(uchar Content);
+  cString GetParentalRatingString(void) const;
   cString GetDateString(void) const;
   cString GetTimeString(void) const;
   cString GetEndTimeString(void) const;
@@ -100,6 +121,8 @@
   void SetShortText(const char *ShortText);
   void SetDescription(const char *Description);
   void SetComponents(cComponents *Components); // Will take ownership of Components!
+  void SetContents(uchar *Contents);
+  void SetParentalRating(int ParentalRating);
   void SetStartTime(time_t StartTime);
   void SetDuration(int Duration);
   void SetVps(time_t Vps);
diff -ruN vdr-1.7.10/font.c vdr-1.7.11/font.c
--- vdr-1.7.10/font.c	2009-05-03 13:15:39.000000000 +0200
+++ vdr-1.7.11/font.c	2009-12-31 15:49:59.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: font.c 2.2 2009/05/03 11:15:39 kls Exp $
+ * $Id: font.c 2.4 2009/12/31 14:49:59 kls Exp $
  */
 
 #include "font.h"
@@ -93,6 +93,8 @@
 
 class cFreetypeFont : public cFont {
 private:
+  cString fontName;
+  int size;
   int height;
   int bottom;
   FT_Library library; ///< Handle to library
@@ -105,6 +107,8 @@
 public:
   cFreetypeFont(const char *Name, int CharHeight, int CharWidth = 0);
   virtual ~cFreetypeFont();
+  virtual const char *FontName(void) const { return fontName; }
+  virtual int Size(void) const { return size; }
   virtual int Width(uint c) const;
   virtual int Width(const char *s) const;
   virtual int Height(void) const { return height; }
@@ -113,6 +117,8 @@
 
 cFreetypeFont::cFreetypeFont(const char *Name, int CharHeight, int CharWidth)
 {
+  fontName = Name;
+  size = CharHeight;
   height = 0;
   bottom = 0;
   int error = FT_Init_FreeType(&library);
@@ -346,6 +352,7 @@
        case fontOsd: SetFont(Font, Setup.FontOsd, Setup.FontOsdSize); break;
        case fontSml: SetFont(Font, Setup.FontSml, Setup.FontSmlSize); break;
        case fontFix: SetFont(Font, Setup.FontFix, Setup.FontFixSize); break;
+       default: esyslog("ERROR: unknown Font %d (%s %d)", Font, __FUNCTION__, __LINE__);
        }
      }
   return fonts[Font];
diff -ruN vdr-1.7.10/font.h vdr-1.7.11/font.h
--- vdr-1.7.10/font.h	2009-05-23 12:10:40.000000000 +0200
+++ vdr-1.7.11/font.h	2009-12-31 15:48:25.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: font.h 2.2 2009/05/23 10:10:40 kls Exp $
+ * $Id: font.h 2.3 2009/12/31 14:48:25 kls Exp $
  */
 
 #ifndef __FONT_H
@@ -38,6 +38,11 @@
   static cFont *fonts[];
 public:
   virtual ~cFont() {}
+  virtual const char *FontName(void) const { return ""; }
+          ///< Returns the font name.
+  virtual int Size(void) const { return Height(); }
+          ///< Returns the original size as requested when the font was created.
+          ///< This may be different than the actual height. 
   virtual int Width(uint c) const = 0;
           ///< Returns the width of the given character in pixel.
   virtual int Width(const char *s) const = 0;
diff -ruN vdr-1.7.10/libsi/si.c vdr-1.7.11/libsi/si.c
--- vdr-1.7.10/libsi/si.c	2008-03-05 18:00:55.000000000 +0100
+++ vdr-1.7.11/libsi/si.c	2009-12-05 17:20:12.000000000 +0100
@@ -6,7 +6,7 @@
  *   the Free Software Foundation; either version 2 of the License, or     *
  *   (at your option) any later version.                                   *
  *                                                                         *
- *   $Id: si.c 2.0 2008/03/05 17:00:55 kls Exp $
+ *   $Id: si.c 2.1 2009/12/05 16:20:12 kls Exp $
  *                                                                         *
  ***************************************************************************/
 
@@ -720,6 +720,7 @@
             break;
       }
       break;
+   default: ; // unknown domain, nothing to do
    }
    d->setData(da);
    return d;
diff -ruN vdr-1.7.10/libsi/si.h vdr-1.7.11/libsi/si.h
--- vdr-1.7.10/libsi/si.h	2008-09-06 14:44:06.000000000 +0200
+++ vdr-1.7.11/libsi/si.h	2009-12-06 12:37:35.000000000 +0100
@@ -6,7 +6,7 @@
  *   the Free Software Foundation; either version 2 of the License, or     *
  *   (at your option) any later version.                                   *
  *                                                                         *
- *   $Id: si.h 2.1 2008/09/06 12:44:06 kls Exp $
+ *   $Id: si.h 2.2 2009/12/06 11:37:35 kls Exp $
  *                                                                         *
  ***************************************************************************/
 
@@ -411,6 +411,8 @@
             return data.FourBytes(index);
          case 8:
             return (SixtyFourBit(data.FourBytes(index)) << 32) | data.FourBytes(index+4);
+         default:
+            return 0; // just to avoid a compiler warning
          }
          return 0; // just to avoid a compiler warning
       }
diff -ruN vdr-1.7.10/menu.c vdr-1.7.11/menu.c
--- vdr-1.7.10/menu.c	2009-06-21 11:56:06.000000000 +0200
+++ vdr-1.7.11/menu.c	2009-12-06 12:29:05.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: menu.c 2.9 2009/06/21 09:56:06 kls Exp $
+ * $Id: menu.c 2.10 2009/12/06 11:29:05 kls Exp $
  */
 
 #include "menu.h"
@@ -1373,6 +1373,7 @@
     case cMenuScheduleItem::ssmThisThis: PrepareScheduleThisThis(Event, Channel); break;
     case cMenuScheduleItem::ssmThisAll:  PrepareScheduleThisAll(Event, Channel); break;
     case cMenuScheduleItem::ssmAllAll:   PrepareScheduleAllAll(Event, Channel); break;
+    default: esyslog("ERROR: unknown SortMode %d (%s %d)", cMenuScheduleItem::SortMode(), __FUNCTION__, __LINE__);
     }
   CurrentItem = (cMenuScheduleItem *)Get(Current());
   Sort();
@@ -1897,6 +1898,7 @@
        case 1: SetHelp(tr("Button$Open")); break;
        case 2:
        case 3: SetHelp(RecordingCommands.Count() ? tr("Commands") : tr("Button$Play"), tr("Button$Rewind"), tr("Button$Delete"), NewHelpKeys == 3 ? tr("Button$Info") : NULL);
+       default: ;
        }
      helpKeys = NewHelpKeys;
      }
@@ -2242,18 +2244,18 @@
         Utf8Strn0Cpy(data.OSDTheme, themes.Name(themeIndex), sizeof(data.OSDTheme));
         ModifiedAppearance |= themeIndex != originalThemeIndex;
         }
-     if (data.OSDLeftP != Setup.OSDLeftP || data.OSDTopP != Setup.OSDTopP || data.OSDWidthP != Setup.OSDWidthP || data.OSDHeightP != Setup.OSDHeightP)
+     if (!(DoubleEqual(data.OSDLeftP, Setup.OSDLeftP) && DoubleEqual(data.OSDTopP, Setup.OSDTopP) && DoubleEqual(data.OSDWidthP, Setup.OSDWidthP) && DoubleEqual(data.OSDHeightP, Setup.OSDHeightP)))
         ModifiedAppearance = true;
      if (data.UseSmallFont != Setup.UseSmallFont || data.AntiAlias != Setup.AntiAlias)
         ModifiedAppearance = true;
      Utf8Strn0Cpy(data.FontOsd, fontOsdNames[fontOsdIndex], sizeof(data.FontOsd));
      Utf8Strn0Cpy(data.FontSml, fontSmlNames[fontSmlIndex], sizeof(data.FontSml));
      Utf8Strn0Cpy(data.FontFix, fontFixNames[fontFixIndex], sizeof(data.FontFix));
-     if (strcmp(data.FontOsd, Setup.FontOsd) || data.FontOsdSizeP != Setup.FontOsdSizeP)
+     if (strcmp(data.FontOsd, Setup.FontOsd) || !DoubleEqual(data.FontOsdSizeP, Setup.FontOsdSizeP))
         ModifiedAppearance = true;
-     if (strcmp(data.FontSml, Setup.FontSml) || data.FontSmlSizeP != Setup.FontSmlSizeP)
+     if (strcmp(data.FontSml, Setup.FontSml) || !DoubleEqual(data.FontSmlSizeP, Setup.FontSmlSizeP))
         ModifiedAppearance = true;
-     if (strcmp(data.FontFix, Setup.FontFix) || data.FontFixSizeP != Setup.FontFixSizeP)
+     if (strcmp(data.FontFix, Setup.FontFix) || !DoubleEqual(data.FontFixSizeP, Setup.FontFixSizeP))
         ModifiedAppearance = true;
      }
 
@@ -3152,6 +3154,7 @@
                    break;
            case 4: cDevice::PrimaryDevice()->SetAvailableTrack(ttDolby, indexDolby++, 0, LiveChannel ? NULL : p->language, p->description);
                    break;
+           default: ;
            }
          }
      }
diff -ruN vdr-1.7.10/menuitems.c vdr-1.7.11/menuitems.c
--- vdr-1.7.10/menuitems.c	2009-05-03 15:37:55.000000000 +0200
+++ vdr-1.7.11/menuitems.c	2009-12-06 12:31:20.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: menuitems.c 2.4 2009/05/03 13:37:55 kls Exp $
+ * $Id: menuitems.c 2.5 2009/12/06 11:31:20 kls Exp $
  */
 
 #include "menuitems.h"
@@ -257,7 +257,7 @@
             return state;
        }
      newValue /= factor;
-     if (newValue != *value && (!fresh || min <= newValue) && newValue <= max) {
+     if (!DoubleEqual(newValue, *value) && (!fresh || min <= newValue) && newValue <= max) {
         *value = newValue;
         Set();
         }
@@ -666,6 +666,7 @@
                                           return ProcessKey(kYellow);
                                           }
                                        break;
+                            default: ;
                             }
                           }
                        }
@@ -675,6 +676,7 @@
                          case kfEnd:  pos = lengthUtf8 - 1; break;
                          case kfIns:  return ProcessKey(kGreen);
                          case kfDel:  return ProcessKey(kYellow);
+                         default: ;
                          }
                        }
                     }
@@ -975,6 +977,7 @@
                      pos++;
                      }
                   break;
+          default: ;
           }
         }
      else if (NORMALKEY(Key) == kLeft) { // TODO might want to increase the delta if repeated quickly?
diff -ruN vdr-1.7.10/newplugin vdr-1.7.11/newplugin
--- vdr-1.7.10/newplugin	2008-01-13 14:00:23.000000000 +0100
+++ vdr-1.7.11/newplugin	2009-12-06 16:31:58.000000000 +0100
@@ -12,7 +12,7 @@
 # See the main source file 'vdr.c' for copyright information and
 # how to reach the author.
 #
-# $Id: newplugin 2.0 2008/01/13 13:00:23 kls Exp $
+# $Id: newplugin 2.1 2009/12/06 15:31:58 kls Exp $
 
 $PLUGIN_NAME = $ARGV[0] || die "Usage: newplugin <name>\n";
 
@@ -104,6 +104,8 @@
 
 DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"\$(PLUGIN)"'
 
+DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
+
 ### The object files (add further files here):
 
 OBJS = \$(PLUGIN).o
diff -ruN vdr-1.7.10/nit.c vdr-1.7.11/nit.c
--- vdr-1.7.10/nit.c	2008-12-20 11:57:50.000000000 +0100
+++ vdr-1.7.11/nit.c	2009-12-06 12:36:16.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: nit.c 2.3 2008/12/20 10:57:50 kls Exp $
+ * $Id: nit.c 2.4 2009/12/06 11:36:16 kls Exp $
  */
 
 #include "nit.h"
@@ -110,6 +110,7 @@
                   case 1: f = BCD2INT(f) / 100; break;
                   case 2: f = BCD2INT(f) / 10; break;
                   case 3: f = f * 10;  break;
+                  default: ;
                   }
                 Frequencies[n++] = f;
                 }
diff -ruN vdr-1.7.10/osd.c vdr-1.7.11/osd.c
--- vdr-1.7.10/osd.c	2009-05-09 12:42:35.000000000 +0200
+++ vdr-1.7.11/osd.c	2009-12-06 12:33:47.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: osd.c 2.5 2009/05/09 10:42:35 kls Exp $
+ * $Id: osd.c 2.6 2009/12/06 11:33:47 kls Exp $
  */
 
 #include "osd.h"
@@ -101,6 +101,7 @@
          switch (i) {
            case 0: Color = ColorBg; break;
            case 1: Color = ColorFg; break;
+           default: ;
            }
          }
       int n = Index(Color);
@@ -532,6 +533,7 @@
     case 6:          cy = y2; rx /= 2; break;
     case 7: cx = x2;          ry /= 2; break;
     case 8:          cy = y1; rx /= 2; break;
+    default: ;
     }
   int TwoASquare = 2 * rx * rx;
   int TwoBSquare = 2 * ry * ry;
@@ -557,6 +559,7 @@
           case -2: DrawRectangle(x1,     cy - y, cx - x, cy - y, Color); break;
           case -3: DrawRectangle(x1,     cy + y, cx - x, cy + y, Color); break;
           case -4: DrawRectangle(cx + x, cy + y, x2,     cy + y, Color); break;
+          default: ;
           }
         y++;
         StoppingY += TwoASquare;
@@ -591,6 +594,7 @@
           case -2: DrawRectangle(x1,     cy - y, cx - x, cy - y, Color); break;
           case -3: DrawRectangle(x1,     cy + y, cx - x, cy + y, Color); break;
           case -4: DrawRectangle(cx + x, cy + y, x2,     cy + y, Color); break;
+          default: ;
           }
         x++;
         StoppingX += TwoBSquare;
@@ -921,7 +925,7 @@
   int Height;
   double Aspect;
   cDevice::PrimaryDevice()->GetOsdSize(Width, Height, Aspect);
-  if (Width != oldWidth || Height != oldHeight || Aspect != oldAspect || Force) {
+  if (Width != oldWidth || Height != oldHeight || !DoubleEqual(Aspect, oldAspect) || Force) {
      Setup.OSDLeft = int(round(Width * Setup.OSDLeftP));
      Setup.OSDTop = int(round(Height * Setup.OSDTopP));
      Setup.OSDWidth = int(round(Width * Setup.OSDWidthP)) & ~0x07; // OSD width must be a multiple of 8
diff -ruN vdr-1.7.10/pat.c vdr-1.7.11/pat.c
--- vdr-1.7.10/pat.c	2009-08-16 17:01:03.000000000 +0200
+++ vdr-1.7.11/pat.c	2010-01-01 16:40:05.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: pat.c 2.4 2009/08/16 15:01:03 kls Exp $
+ * $Id: pat.c 2.7 2010/01/01 15:40:05 kls Exp $
  */
 
 #include "pat.h"
@@ -144,7 +144,7 @@
   q += sprintf(q, "CAM: %04X %5d %5d %04X %04X -", source, transponder, serviceId, d->getCaType(), EsPid);
   for (int i = 0; i < nca->Length(); i++)
       q += sprintf(q, " %02X", nca->Data()[i]);
-  dsyslog(buffer);
+  dsyslog("%s", buffer);
 #endif
 }
 
@@ -345,6 +345,7 @@
         int NumDpids = 0;
         int NumSpids = 0;
         for (SI::Loop::Iterator it; pmt.streamLoop.getNext(stream, it); ) {
+            bool ProcessCaDescriptors = false;
             int esPid = stream.getPid();
             switch (stream.getStreamType()) {
               case 1: // STREAMTYPE_11172_VIDEO
@@ -353,6 +354,7 @@
                       Vpid = esPid;
                       Ppid = pmt.getPCRPid();
                       Vtype = stream.getStreamType();
+                      ProcessCaDescriptors = true;
                       break;
               case 3: // STREAMTYPE_11172_AUDIO
               case 4: // STREAMTYPE_13818_AUDIO
@@ -385,6 +387,7 @@
                              }
                          NumApids++;
                          }
+                      ProcessCaDescriptors = true;
                       }
                       break;
               case 5: // STREAMTYPE_13818_PRIVATE
@@ -398,6 +401,7 @@
                           switch (d->getDescriptorTag()) {
                             case SI::AC3DescriptorTag:
                                  dpid = esPid;
+                                 ProcessCaDescriptors = true;
                                  break;
                             case SI::SubtitlingDescriptorTag:
                                  if (NumSpids < MAXSPIDS) {
@@ -443,12 +447,14 @@
                          }
                       }
                       break;
-              //default: printf("PID: %5d %5d %2d %3d %3d\n", pmt.getServiceId(), stream.getPid(), stream.getStreamType(), pmt.getVersionNumber(), Channel->Number());//XXX
+              default: ;//printf("PID: %5d %5d %2d %3d %3d\n", pmt.getServiceId(), stream.getPid(), stream.getStreamType(), pmt.getVersionNumber(), Channel->Number());
               }
-            for (SI::Loop::Iterator it; (d = (SI::CaDescriptor*)stream.streamDescriptors.getNext(it, SI::CaDescriptorTag)); ) {
-                CaDescriptors->AddCaDescriptor(d, esPid);
-                delete d;
-                }
+            if (ProcessCaDescriptors) {
+               for (SI::Loop::Iterator it; (d = (SI::CaDescriptor*)stream.streamDescriptors.getNext(it, SI::CaDescriptorTag)); ) {
+                   CaDescriptors->AddCaDescriptor(d, esPid);
+                   delete d;
+                   }
+               }
             }
         if (Setup.UpdateChannels >= 2) {
            Channel->SetPids(Vpid, Ppid, Vtype, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid);
diff -ruN vdr-1.7.10/plugin.c vdr-1.7.11/plugin.c
--- vdr-1.7.10/plugin.c	2009-04-05 12:16:48.000000000 +0200
+++ vdr-1.7.11/plugin.c	2010-01-06 12:36:46.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: plugin.c 2.1 2009/04/05 10:16:48 kls Exp $
+ * $Id: plugin.c 2.2 2010/01/06 11:36:46 kls Exp $
  */
 
 #include "plugin.h"
@@ -172,15 +172,15 @@
 static char *SkipQuote(char *s)
 {
   char c = *s;
-  strcpy(s, s + 1);
+  memmove(s, s + 1, strlen(s));
   while (*s && *s != c) {
         if (*s == '\\')
-           strcpy(s, s + 1);
+           memmove(s, s + 1, strlen(s));
         if (*s)
            s++;
         }
   if (*s) {
-     strcpy(s, s + 1);
+     memmove(s, s + 1, strlen(s));
      return s;
      }
   esyslog("ERROR: missing closing %c", c);
@@ -215,7 +215,7 @@
               if (!q)
                  q = p;
               switch (*p) {
-                case '\\': strcpy(p, p + 1);
+                case '\\': memmove(p, p + 1, strlen(p));
                            if (*p)
                               p++;
                            else {
diff -ruN vdr-1.7.10/po/ca_ES.po vdr-1.7.11/po/ca_ES.po
--- vdr-1.7.10/po/ca_ES.po	2009-11-22 12:28:38.000000000 +0100
+++ vdr-1.7.11/po/ca_ES.po	2010-01-04 15:38:20.000000000 +0100
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-03-02 19:02+0100\n"
 "Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
 "Language-Team: Catalanian\n"
@@ -42,6 +42,247 @@
 msgid "Starting EPG scan"
 msgstr "Iniciant exploraci� EPG"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Sense t�tol"
 
diff -ruN vdr-1.7.10/po/cs_CZ.po vdr-1.7.11/po/cs_CZ.po
--- vdr-1.7.10/po/cs_CZ.po	2009-11-22 12:28:38.000000000 +0100
+++ vdr-1.7.11/po/cs_CZ.po	2010-01-04 15:38:20.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-02-28 15:00+0200\n"
 "Last-Translator: Vladim�r B�rta <vladimir.barta@k2atmitec.cz>, Ji�� Dobr� <jdobry@centrum.cz>\n"
 "Language-Team: Czech\n"
@@ -40,6 +40,247 @@
 msgid "Starting EPG scan"
 msgstr "Za��n� prohled�v�n� EPG"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Bez n�zvu"
 
diff -ruN vdr-1.7.10/po/da_DK.po vdr-1.7.11/po/da_DK.po
--- vdr-1.7.10/po/da_DK.po	2009-11-22 12:28:38.000000000 +0100
+++ vdr-1.7.11/po/da_DK.po	2010-01-04 15:38:20.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2007-08-12 14:17+0200\n"
 "Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
 "Language-Team: Danish\n"
@@ -39,6 +39,247 @@
 msgid "Starting EPG scan"
 msgstr "Starter EPG skanning"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Ingen titel"
 
diff -ruN vdr-1.7.10/po/de_DE.po vdr-1.7.11/po/de_DE.po
--- vdr-1.7.10/po/de_DE.po	2009-11-22 12:30:27.000000000 +0100
+++ vdr-1.7.11/po/de_DE.po	2010-01-04 15:38:20.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2007-11-25 15:19+0200\n"
 "Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n"
 "Language-Team: German\n"
@@ -39,6 +39,247 @@
 msgid "Starting EPG scan"
 msgstr "Aktualisiere EPG-Daten"
 
+msgid "Content$Movie/Drama"
+msgstr "Film/Drama"
+
+msgid "Content$Detective/Thriller"
+msgstr "Detektiv/Thriller"
+
+msgid "Content$Adventure/Western/War"
+msgstr "Abenteuer/Western/Krieg"
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr "Science-Fiction/Fantasy/Horror"
+
+msgid "Content$Comedy"
+msgstr "Kom�die"
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr "Seife/Melodram/Folklore"
+
+msgid "Content$Romance"
+msgstr "Romanze"
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr "Ernst/Klassik/Religion/Historischer Film/Drama"
+
+msgid "Content$Adult Movie/Drama"
+msgstr "Erwachsenen-Film/Drama"
+
+msgid "Content$News/Current Affairs"
+msgstr "Aktuelle Angelegenheiten"
+
+msgid "Content$News/Weather Report"
+msgstr "Wetterbericht"
+
+msgid "Content$News Magazine"
+msgstr "Nachrichtenmagazin"
+
+msgid "Content$Documentary"
+msgstr "Dokumentation"
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr "Diskussion/Interview/Debatte"
+
+msgid "Content$Show/Game Show"
+msgstr "Show/Spielshow"
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr "Spielshow/Quiz/Wettbewerb"
+
+msgid "Content$Variety Show"
+msgstr "Variete-Show"
+
+msgid "Content$Talk Show"
+msgstr "Talkshow"
+
+msgid "Content$Sports"
+msgstr "Sport"
+
+msgid "Content$Special Event"
+msgstr "Besonderes Ereignis"
+
+msgid "Content$Sport Magazine"
+msgstr "Sportmagazin"
+
+msgid "Content$Football/Soccer"
+msgstr "Football/Fu�ball"
+
+msgid "Content$Tennis/Squash"
+msgstr "Tennis/Squash"
+
+msgid "Content$Team Sports"
+msgstr "Mannschaftssport"
+
+msgid "Content$Athletics"
+msgstr "Athletik"
+
+msgid "Content$Motor Sport"
+msgstr "Motorsport"
+
+msgid "Content$Water Sport"
+msgstr "Wassersport"
+
+msgid "Content$Winter Sports"
+msgstr "Wintersport"
+
+msgid "Content$Equestrian"
+msgstr "Reitsport"
+
+msgid "Content$Martial Sports"
+msgstr "Kampfsport"
+
+msgid "Content$Children's/Youth Programme"
+msgstr "Kinder/Jugendprogramm"
+
+msgid "Content$Pre-school Children's Programme"
+msgstr "Programm f�r Vorschulkinder"
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr "Unterhaltungsprogramm f�r 6 bis 14"
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr "Unterhaltungsprogramm f�r 10 bis 16"
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr "Informations/Lehr/Schul-Programm"
+
+msgid "Content$Cartoons/Puppets"
+msgstr "Zeichentrick/Puppen"
+
+msgid "Content$Music/Ballet/Dance"
+msgstr "Musik/Ballett/Tanz"
+
+msgid "Content$Rock/Pop"
+msgstr "Rock/Pop"
+
+msgid "Content$Serious/Classical Music"
+msgstr "Ernste/Klassische Musik"
+
+msgid "Content$Folk/Tradional Music"
+msgstr "Volks/Traditionelle Musik"
+
+msgid "Content$Jazz"
+msgstr "Jazz"
+
+msgid "Content$Musical/Opera"
+msgstr "Musical/Oper"
+
+msgid "Content$Ballet"
+msgstr "Ballett"
+
+msgid "Content$Arts/Culture"
+msgstr "Kunst/Kultur"
+
+msgid "Content$Performing Arts"
+msgstr "Darstellende K�nste"
+
+msgid "Content$Fine Arts"
+msgstr "Bildende K�nste"
+
+msgid "Content$Religion"
+msgstr "Religion"
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr "Pop-Kultur/Traditionelle K�nste"
+
+msgid "Content$Literature"
+msgstr "Literatur"
+
+msgid "Content$Film/Cinema"
+msgstr "Film/Kino"
+
+msgid "Content$Experimental Film/Video"
+msgstr "Experimentalfilm/Video"
+
+msgid "Content$Broadcasting/Press"
+msgstr "Rundfunk/Presse"
+
+msgid "Content$New Media"
+msgstr "Neue Medien"
+
+msgid "Content$Arts/Culture Magazine"
+msgstr "Kunst/Kulturmagazin"
+
+msgid "Content$Fashion"
+msgstr "Mode"
+
+msgid "Content$Social/Political/Economics"
+msgstr "Gesellschaft/Politik/Wirtschaft"
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr "Magazin/Bericht/Dokumentation"
+
+msgid "Content$Economics/Social Advisory"
+msgstr "Wirtschafts/Gesellschaftsberatung"
+
+msgid "Content$Remarkable People"
+msgstr "Bemerkenswerte Leute"
+
+msgid "Content$Education/Science/Factual"
+msgstr "Ausbildung/Wissenschaft/Sachlich"
+
+msgid "Content$Nature/Animals/Environment"
+msgstr "Natur/Tiere/Umwelt"
+
+msgid "Content$Technology/Natural Sciences"
+msgstr "Technik/Naturwissenschaften"
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr "Medizin/Physiologie/Psychologie"
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr "Ausland/Expeditionen"
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr "Sozial/Geisteswissenschaften"
+
+msgid "Content$Further Education"
+msgstr "Weiterbildung"
+
+msgid "Content$Languages"
+msgstr "Sprachen"
+
+msgid "Content$Leisure/Hobbies"
+msgstr "Freizeit/Hobbies"
+
+msgid "Content$Tourism/Travel"
+msgstr "Tourismus/Reisen"
+
+msgid "Content$Handicraft"
+msgstr "Handwerk"
+
+msgid "Content$Motoring"
+msgstr "Autofahren"
+
+msgid "Content$Fitness & Health"
+msgstr "Fitness & Gesundheit"
+
+msgid "Content$Cooking"
+msgstr "Kochen"
+
+msgid "Content$Advertisement/Shopping"
+msgstr "Werbung/Einkaufen"
+
+msgid "Content$Gardening"
+msgstr "Gartenbau"
+
+msgid "Content$Original Language"
+msgstr "Originalsprache"
+
+msgid "Content$Black & White"
+msgstr "Schwarz-wei�"
+
+msgid "Content$Unpublished"
+msgstr "Unver�ffentlicht"
+
+msgid "Content$Live Broadcast"
+msgstr "Live-Sendung"
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr "ab %d"
+
 msgid "No title"
 msgstr "Kein Titel"
 
diff -ruN vdr-1.7.10/po/el_GR.po vdr-1.7.11/po/el_GR.po
--- vdr-1.7.10/po/el_GR.po	2009-11-22 12:28:38.000000000 +0100
+++ vdr-1.7.11/po/el_GR.po	2010-01-04 15:38:21.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2007-08-12 14:17+0200\n"
 "Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
 "Language-Team: Greek\n"
@@ -39,6 +39,247 @@
 msgid "Starting EPG scan"
 msgstr "���� ������ EPG"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "����� �����"
 
diff -ruN vdr-1.7.10/po/es_ES.po vdr-1.7.11/po/es_ES.po
--- vdr-1.7.10/po/es_ES.po	2009-11-22 12:28:38.000000000 +0100
+++ vdr-1.7.11/po/es_ES.po	2010-01-04 15:38:21.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-03-02 19:02+0100\n"
 "Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
 "Language-Team: Spanish\n"
@@ -40,6 +40,247 @@
 msgid "Starting EPG scan"
 msgstr "Iniciando la exploraci�n de EPG"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Sin t�tulo"
 
diff -ruN vdr-1.7.10/po/et_EE.po vdr-1.7.11/po/et_EE.po
--- vdr-1.7.10/po/et_EE.po	2009-11-22 12:28:38.000000000 +0100
+++ vdr-1.7.11/po/et_EE.po	2010-01-04 15:38:21.000000000 +0100
@@ -1,15 +1,15 @@
 # VDR language source file.
 # Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
 # This file is distributed under the same license as the VDR package.
-# Arthur Konovalov <kasjas@hot.ee>, 2004, 2005, 2006, 2007
+# Arthur Konovalov <artlov@gmail.com>, 2004-2009
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2007-08-12 14:17+0200\n"
-"Last-Translator: Arthur Konovalov <kasjas@hot.ee>\n"
+"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
 "Language-Team: Estonian\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=ISO-8859-13\n"
@@ -19,7 +19,7 @@
 msgstr "v�ljas"
 
 msgid "on"
-msgstr ""
+msgstr "sees"
 
 msgid "auto"
 msgstr "automaatne"
@@ -34,11 +34,252 @@
 msgstr "Kanal ei ole k�ttesaadav!"
 
 msgid "Can't start Transfer Mode!"
-msgstr "Siirdemooduse start eba�nnestus!"
+msgstr "Siirdemooduse start nurjus!"
 
 msgid "Starting EPG scan"
 msgstr "EPG skaneerimine k�ivitatud"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Pealkiri puudub"
 
@@ -286,7 +527,7 @@
 msgstr "Polarisatsioon"
 
 msgid "System"
-msgstr ""
+msgstr "S�steem"
 
 msgid "Srate"
 msgstr "Srate"
@@ -316,7 +557,7 @@
 msgstr "Hierarhia"
 
 msgid "Rolloff"
-msgstr ""
+msgstr "Rolloff"
 
 msgid "Channel settings are not unique!"
 msgstr "Kanaliseaded ei ole unikaalsed!"
@@ -325,16 +566,16 @@
 msgstr "Kanalid"
 
 msgid "Button$Edit"
-msgstr "Muuda"
+msgstr "Muutmine"
 
 msgid "Button$New"
 msgstr "Uus"
 
 msgid "Button$Delete"
-msgstr "Kustuta"
+msgstr "Kustutada"
 
 msgid "Button$Mark"
-msgstr "Siirda"
+msgstr "M�rkimine"
 
 msgid "Channel is being used by a timer!"
 msgstr "Kanal on taimeri kasutuses!"
@@ -343,7 +584,7 @@
 msgstr "Kustutada kanal?"
 
 msgid "Edit timer"
-msgstr "Taimeri muutmine"
+msgstr "Taimeri redigeerimine"
 
 msgid "Active"
 msgstr "Aktiivne"
@@ -397,10 +638,10 @@
 msgstr "Taimer"
 
 msgid "Button$Record"
-msgstr "Salvesta"
+msgstr "Salvestada"
 
 msgid "Button$Switch"
-msgstr "Vali"
+msgstr "Valida"
 
 msgid "What's on now?"
 msgstr "Hetkel eetris"
@@ -436,7 +677,7 @@
 
 #, c-format
 msgid "Please enter %d digits!"
-msgstr "Palun sisesta %d numbrit!"
+msgstr "Palun sisestada %d numbrit!"
 
 msgid "CAM not responding!"
 msgstr "CAM ei vasta"
@@ -454,19 +695,19 @@
 msgstr "Salvestused"
 
 msgid "Button$Open"
-msgstr "Ava"
+msgstr "Avada"
 
 msgid "Commands"
 msgstr "K�sud"
 
 msgid "Error while accessing recording!"
-msgstr "Salvestuse taasesitus eba�nnestus!"
+msgstr "Salvestuse taasesitus nurjus!"
 
 msgid "Delete recording?"
 msgstr "Kustutada salvestus?"
 
 msgid "Error while deleting recording!"
-msgstr "Salvestuse kustutamine eba�nnestus!"
+msgstr "Salvestuse kustutamine nurjus!"
 
 msgid "Recording commands"
 msgstr "Salvestuse k�sud"
@@ -505,10 +746,10 @@
 msgstr "K�rgus (%)"
 
 msgid "Setup.OSD$Message time (s)"
-msgstr "Teate esitusaeg (s)"
+msgstr "Teate kuvamisaeg (s)"
 
 msgid "Setup.OSD$Use small font"
-msgstr "V�ikese fondi kasutamine"
+msgstr "V�ikese fondi kasutus"
 
 msgid "Setup.OSD$Anti-alias"
 msgstr "Fondi silumine"
@@ -541,7 +782,7 @@
 msgstr "�leval"
 
 msgid "Setup.OSD$Channel info time (s)"
-msgstr "Kanaliinfo esitusaeg (s)"
+msgstr "Kanaliinfo kuvamisaeg (s)"
 
 msgid "Setup.OSD$Info on channel switch"
 msgstr "Kanaliinfo kuvamine"
@@ -565,7 +806,7 @@
 msgstr "EPG"
 
 msgid "Button$Scan"
-msgstr "Uuenda"
+msgstr "Uuendada"
 
 msgid "Setup.EPG$EPG scan timeout (h)"
 msgstr "EPG skaneerimise viide (h)"
@@ -609,13 +850,13 @@
 msgstr "PID-id"
 
 msgid "names and PIDs"
-msgstr "nimed ja PID-id"
+msgstr "nimed,PID-id"
 
 msgid "add new channels"
-msgstr "kanalite lisamine"
+msgstr "uued kanalid"
 
 msgid "add new transponders"
-msgstr "transponderite lisamine"
+msgstr "uued transponderid"
 
 msgid "DVB"
 msgstr "DVB"
@@ -690,7 +931,7 @@
 msgstr "Men��"
 
 msgid "Button$Reset"
-msgstr "Nullimine"
+msgstr "Reset"
 
 msgid "Opening CAM menu..."
 msgstr "CAM-men�� avamine..."
@@ -702,16 +943,16 @@
 msgstr "CAM on kasutuses - taask�ivitada?"
 
 msgid "Can't reset CAM!"
-msgstr "CAM mooduli taask�ivitus eba�nnestus!"
+msgstr "CAM mooduli taask�ivitus nurjus!"
 
 msgid "do not pause live video"
-msgstr ""
+msgstr "mitte peatada"
 
 msgid "confirm pause live video"
-msgstr ""
+msgstr "peatam. kinnitus"
 
 msgid "pause live video"
-msgstr ""
+msgstr "peatada"
 
 msgid "Recording"
 msgstr "Salvestamine"
@@ -732,7 +973,7 @@
 msgstr "Salvestuse eluiga (p�evi)"
 
 msgid "Setup.Recording$Pause key handling"
-msgstr ""
+msgstr "Pausi klahvi k�sitsemine"
 
 msgid "Setup.Recording$Pause priority"
 msgstr "Pausi prioriteet"
@@ -741,7 +982,7 @@
 msgstr "Pausi eluiga (p�evi)"
 
 msgid "Setup.Recording$Use episode name"
-msgstr "Episoodi nime kasutamine"
+msgstr "Episoodinime kasutamine"
 
 msgid "Setup.Recording$Use VPS"
 msgstr "VPS-i kasutamine"
@@ -750,19 +991,19 @@
 msgstr "VPS-i algusvaru (s)"
 
 msgid "Setup.Recording$Mark instant recording"
-msgstr "Otsesalvestuse m�rgistamine"
+msgstr "Kiirsalvestuse m�rgistamine"
 
 msgid "Setup.Recording$Name instant recording"
-msgstr "Otsesalvestuse nimi"
+msgstr "Kiirsalvestuse nimi"
 
 msgid "Setup.Recording$Instant rec. time (min)"
-msgstr "Otsesalvestuse kestus (min)"
+msgstr "Kiirsalvestuse kestus (min)"
 
 msgid "Setup.Recording$Max. video file size (MB)"
-msgstr "Maksimaalne failisuurus (MB)"
+msgstr "Maks. failisuurus (MB)"
 
 msgid "Setup.Recording$Split edited files"
-msgstr "Failide t�keldamine"
+msgstr "Failide jupitamine"
 
 msgid "Replay"
 msgstr "Taasesitus"
@@ -780,7 +1021,7 @@
 msgstr "Muud s�tted"
 
 msgid "Setup.Miscellaneous$Min. event timeout (min)"
-msgstr "Min. s�ndmuse kestus (min)"
+msgstr "Min. saate taimaut (min)"
 
 msgid "Setup.Miscellaneous$Min. user inactivity (min)"
 msgstr "Min. kasutaja tegevusetus (min)"
@@ -798,7 +1039,7 @@
 msgstr "Kanal k�ivitamisel"
 
 msgid "Setup.Miscellaneous$as before"
-msgstr "nagu enne"
+msgstr "endine"
 
 msgid "Setup.Miscellaneous$Initial volume"
 msgstr "Helitugevus k�ivitamisel"
@@ -845,7 +1086,7 @@
 msgstr "Stopp"
 
 msgid "Button$Resume"
-msgstr "J�tka"
+msgstr "J�tkata"
 
 #. TRANSLATORS: note the leading blank!
 msgid " Cancel editing"
@@ -855,7 +1096,7 @@
 msgstr "L�petada salvestamine?"
 
 msgid "Cancel editing?"
-msgstr "T�histada muudatus?"
+msgstr "T�histada redigeermine?"
 
 msgid "No audio available!"
 msgstr "Audio k�ttesaamatu!"
@@ -876,7 +1117,7 @@
 msgstr "Puudub vaba DVB seade salvestamiseks!"
 
 msgid "Pausing live video..."
-msgstr "Saate edastamise peatamine..."
+msgstr "Otse�lekande peatamine..."
 
 #. TRANSLATORS: note the trailing blank!
 msgid "Jump: "
@@ -886,10 +1127,10 @@
 msgstr "Redigeerimise markerid puuduvad!"
 
 msgid "Can't start editing process!"
-msgstr "Redigeerimise start eba�nnestus!"
+msgstr "Redigeerimise start nurjus!"
 
 msgid "Editing process started"
-msgstr "Redigeerimine algas"
+msgstr "Redigeerimine k�ivitatud"
 
 msgid "Editing process already active!"
 msgstr "Redigeerimine juba aktiivne!"
@@ -925,13 +1166,13 @@
 msgstr "K�vaketas t�is!"
 
 msgid "Regenerating index file"
-msgstr ""
+msgstr "Indeksfaili regenereerimine"
 
 msgid "Index file regeneration complete"
-msgstr ""
+msgstr "Indeksfaili regenereerimine l�petatud"
 
 msgid "Can't shutdown - option '-s' not given!"
-msgstr "V�ljal�litamine eba�nnestus - '-s' parameeter puudub!"
+msgstr "V�ljal�litamine nurjus - '-s' parameeter puudub!"
 
 msgid "Editing - shut down anyway?"
 msgstr "Redigeerimine aktiive - l�litada v�lja?"
@@ -964,10 +1205,10 @@
 msgstr "Helitugevus "
 
 msgid "Classic VDR"
-msgstr "Klassikaline VDR"
+msgstr "Classic VDR"
 
 msgid "ST:TNG Panels"
-msgstr "ST:TNG konsool"
+msgstr "ST:TNG Panels"
 
 #. TRANSLATORS: the first character of each weekday, beginning with monday
 msgid "MTWTFSS"
@@ -1002,10 +1243,10 @@
 msgstr "Salvestamine tulekul!"
 
 msgid "Pause live video?"
-msgstr ""
+msgstr "Peatada otse�lekanne?"
 
 msgid "Recording started"
-msgstr "Salvestamine algas"
+msgstr "Salvestamine k�ivitatud"
 
 msgid "VDR will shut down later - press Power to force"
 msgstr "VDR l�litub v�lja hiljem - vajuta Power kiirendamiseks"
@@ -1017,7 +1258,7 @@
 msgstr "Esmase DVB seadme �mberl�litus..."
 
 msgid "Editing process failed!"
-msgstr "Redigeerimine eba�nnestus"
+msgstr "Redigeerimine nurjus"
 
 msgid "Editing process finished"
 msgstr "Redigeerimine l�petatud"
diff -ruN vdr-1.7.10/po/fi_FI.po vdr-1.7.11/po/fi_FI.po
--- vdr-1.7.10/po/fi_FI.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/fi_FI.po	2010-01-04 15:38:21.000000000 +0100
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2007-08-15 15:52+0200\n"
 "Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
 "Language-Team: Finnish\n"
@@ -42,6 +42,247 @@
 msgid "Starting EPG scan"
 msgstr "Ohjelmaoppaan p�ivitys aloitettu"
 
+msgid "Content$Movie/Drama"
+msgstr "Elokuva/draama"
+
+msgid "Content$Detective/Thriller"
+msgstr "Etsiv�/trilleri"
+
+msgid "Content$Adventure/Western/War"
+msgstr "Seikkailu/western/sota"
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr "Scifi/fantasia/kauhu"
+
+msgid "Content$Comedy"
+msgstr "Komedia"
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr "Saippua/melodraama/kansanperinne"
+
+msgid "Content$Romance"
+msgstr "Romanssi"
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr "Vakava/klassinen/uskonnollinen/historiallinen elokuva/draama"
+
+msgid "Content$Adult Movie/Drama"
+msgstr "Aikuiselokuva/draama"
+
+msgid "Content$News/Current Affairs"
+msgstr "Uutiset/ajankohtaisohjelma"
+
+msgid "Content$News/Weather Report"
+msgstr "Uutiset/s��tiedot"
+
+msgid "Content$News Magazine"
+msgstr "Uutismakasiini"
+
+msgid "Content$Documentary"
+msgstr "Dokumentti"
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr "Keskustelu/haastattelu/v�ittely"
+
+msgid "Content$Show/Game Show"
+msgstr "Show/visailu"
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr "Visailu/kilpailu"
+
+msgid "Content$Variety Show"
+msgstr "Varietee"
+
+msgid "Content$Talk Show"
+msgstr "Keskusteluohjelma"
+
+msgid "Content$Sports"
+msgstr "Urheilua"
+
+msgid "Content$Special Event"
+msgstr "Erikoistapahtuma"
+
+msgid "Content$Sport Magazine"
+msgstr "Urheilumakasiini"
+
+msgid "Content$Football/Soccer"
+msgstr "Jalkapallo"
+
+msgid "Content$Tennis/Squash"
+msgstr "Tennis/Squash"
+
+msgid "Content$Team Sports"
+msgstr "Joukkueurheilua"
+
+msgid "Content$Athletics"
+msgstr "Yleisurheilua"
+
+msgid "Content$Motor Sport"
+msgstr "Moottoriurheilua"
+
+msgid "Content$Water Sport"
+msgstr "Vesiurheilua"
+
+msgid "Content$Winter Sports"
+msgstr "Talviurheilua"
+
+msgid "Content$Equestrian"
+msgstr "Ratsastusta"
+
+msgid "Content$Martial Sports"
+msgstr "Kamppailu-urheilua"
+
+msgid "Content$Children's/Youth Programme"
+msgstr "Lasten ja nuorten ohjelma"
+
+msgid "Content$Pre-school Children's Programme"
+msgstr "Alle kouluik�isten ohjelma"
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr "Viihdeohjelma 6-14 vuotiaille"
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr "Viihdeohjelma 10-16 vuotiaille"
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr "Opetus/kouluohjelma"
+
+msgid "Content$Cartoons/Puppets"
+msgstr "Piirretty/nukke-esitys"
+
+msgid "Content$Music/Ballet/Dance"
+msgstr "Musiikki/baletti/tanssi"
+
+msgid "Content$Rock/Pop"
+msgstr "Rock/pop"
+
+msgid "Content$Serious/Classical Music"
+msgstr "Vakava/klassinen musiikki"
+
+msgid "Content$Folk/Tradional Music"
+msgstr "Folk/kansanmusiikki"
+
+msgid "Content$Jazz"
+msgstr "Jazz"
+
+msgid "Content$Musical/Opera"
+msgstr "Musikaali/ooppera"
+
+msgid "Content$Ballet"
+msgstr "Baletti"
+
+msgid "Content$Arts/Culture"
+msgstr "Taide/kulttuuri"
+
+msgid "Content$Performing Arts"
+msgstr "Performanssitaide"
+
+msgid "Content$Fine Arts"
+msgstr "Kuvataide"
+
+msgid "Content$Religion"
+msgstr "Uskonto"
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr "Populaarikulttuuri/perinnetaiteet"
+
+msgid "Content$Literature"
+msgstr "Kirjallisuus"
+
+msgid "Content$Film/Cinema"
+msgstr "Elokuvataide"
+
+msgid "Content$Experimental Film/Video"
+msgstr "Kokeellinen elokuva/video"
+
+msgid "Content$Broadcasting/Press"
+msgstr "Televisio/radio/lehdist�"
+
+msgid "Content$New Media"
+msgstr "Uusmedia"
+
+msgid "Content$Arts/Culture Magazine"
+msgstr "Taide/kulttuurimakasiini"
+
+msgid "Content$Fashion"
+msgstr "Muoti"
+
+msgid "Content$Social/Political/Economics"
+msgstr "Yhteiskunta/politiikka/talous"
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr "Makasiini/reportaasi/dokumentti"
+
+msgid "Content$Economics/Social Advisory"
+msgstr "Talous/yhteiskunnallinen neuvonta"
+
+msgid "Content$Remarkable People"
+msgstr "Merkitt�v�t henkil�t"
+
+msgid "Content$Education/Science/Factual"
+msgstr "Koulutus/tiede"
+
+msgid "Content$Nature/Animals/Environment"
+msgstr "Luonto/el�imet/ymp�rist�"
+
+msgid "Content$Technology/Natural Sciences"
+msgstr "Teknologia/luonnontiede"
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr "L��ketiede/fysiologia/psykologia"
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr "Vieraat maat/tutkimusretket"
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr "Yhteiskunta/hengelliset tieteet"
+
+msgid "Content$Further Education"
+msgstr "Jatkokoulutus"
+
+msgid "Content$Languages"
+msgstr "Kielet"
+
+msgid "Content$Leisure/Hobbies"
+msgstr "Vapaa-aika ja harrastukset"
+
+msgid "Content$Tourism/Travel"
+msgstr "Turismi/matkustaminen"
+
+msgid "Content$Handicraft"
+msgstr "K�sity�t"
+
+msgid "Content$Motoring"
+msgstr "Autoilu"
+
+msgid "Content$Fitness & Health"
+msgstr "Kuntoilu & terveys"
+
+msgid "Content$Cooking"
+msgstr "Ruuanlaitto"
+
+msgid "Content$Advertisement/Shopping"
+msgstr "Mainostaminen/ostaminen"
+
+msgid "Content$Gardening"
+msgstr "Puutarhanhoito"
+
+msgid "Content$Original Language"
+msgstr "Alkuper�iskieli"
+
+msgid "Content$Black & White"
+msgstr "Mustavalkoinen"
+
+msgid "Content$Unpublished"
+msgstr "Julkaisematon"
+
+msgid "Content$Live Broadcast"
+msgstr "Suoral�hetys"
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Ei esityst�"
 
diff -ruN vdr-1.7.10/po/fr_FR.po vdr-1.7.11/po/fr_FR.po
--- vdr-1.7.10/po/fr_FR.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/fr_FR.po	2010-01-04 15:38:21.000000000 +0100
@@ -13,7 +13,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-02-27 18:14+0100\n"
 "Last-Translator: Jean-Claude Repetto <jc@repetto.org>\n"
 "Language-Team: French\n"
@@ -45,6 +45,247 @@
 msgid "Starting EPG scan"
 msgstr "Mise � jour du guide des programmes"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Sans titre"
 
diff -ruN vdr-1.7.10/po/hr_HR.po vdr-1.7.11/po/hr_HR.po
--- vdr-1.7.10/po/hr_HR.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/hr_HR.po	2010-01-04 15:38:21.000000000 +0100
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-03-17 19:00+0100\n"
 "Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
 "Language-Team: Croatian\n"
@@ -41,6 +41,247 @@
 msgid "Starting EPG scan"
 msgstr "Po�injem EPG pretragu"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Bez naziva"
 
diff -ruN vdr-1.7.10/po/hu_HU.po vdr-1.7.11/po/hu_HU.po
--- vdr-1.7.10/po/hu_HU.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/hu_HU.po	2010-01-04 15:38:21.000000000 +0100
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2007-12-01 21:42+0200\n"
 "Last-Translator: Istv�n F�ley <ifuley@tigercomp.ro>\n"
 "Language-Team: Hungarian\n"
@@ -42,6 +42,247 @@
 msgid "Starting EPG scan"
 msgstr "EPG adatok aktualiz�l�sa"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "n�v n�lk�l"
 
diff -ruN vdr-1.7.10/po/it_IT.po vdr-1.7.11/po/it_IT.po
--- vdr-1.7.10/po/it_IT.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/it_IT.po	2010-01-04 15:38:21.000000000 +0100
@@ -11,8 +11,8 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
-"PO-Revision-Date: 2009-08-29 11:16+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
+"PO-Revision-Date: 2009-11-28 22:50+0100\n"
 "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
 "Language-Team: Italian\n"
 "MIME-Version: 1.0\n"
@@ -46,6 +46,247 @@
 msgid "Starting EPG scan"
 msgstr "Inizio scansione EPG"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Senza titolo"
 
@@ -932,10 +1173,10 @@
 msgstr "Poco spazio su disco!"
 
 msgid "Regenerating index file"
-msgstr ""
+msgstr "Rigenerazione file indice"
 
 msgid "Index file regeneration complete"
-msgstr ""
+msgstr "Rigenerazione file indice completata"
 
 msgid "Can't shutdown - option '-s' not given!"
 msgstr "Impossibile spegnere - parametro '-s' non assegnato!"
diff -ruN vdr-1.7.10/po/lt_LT.po vdr-1.7.11/po/lt_LT.po
--- vdr-1.7.10/po/lt_LT.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/lt_LT.po	2010-01-04 15:38:21.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.7.9\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2009-10-17 14:19+0200\n"
 "Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
 "Language-Team: Lithuanian\n"
@@ -39,6 +39,247 @@
 msgid "Starting EPG scan"
 msgstr "Pradedamas EPG skanavimas"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Be pavadinimo"
 
diff -ruN vdr-1.7.10/po/nl_NL.po vdr-1.7.11/po/nl_NL.po
--- vdr-1.7.10/po/nl_NL.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/nl_NL.po	2010-01-04 15:38:21.000000000 +0100
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-02-26 17:20+0100\n"
 "Last-Translator: Johan Schuring <johan.schuring@vetteblei.nl>\n"
 "Language-Team: Dutch\n"
@@ -43,6 +43,247 @@
 msgid "Starting EPG scan"
 msgstr "Bezig met starten EPG scan"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Geen titel"
 
diff -ruN vdr-1.7.10/po/nn_NO.po vdr-1.7.11/po/nn_NO.po
--- vdr-1.7.10/po/nn_NO.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/nn_NO.po	2010-01-04 15:38:21.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2007-08-12 14:17+0200\n"
 "Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
 "Language-Team: Norwegian\n"
@@ -40,6 +40,247 @@
 msgid "Starting EPG scan"
 msgstr ""
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr ""
 
diff -ruN vdr-1.7.10/po/pl_PL.po vdr-1.7.11/po/pl_PL.po
--- vdr-1.7.10/po/pl_PL.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/pl_PL.po	2010-01-04 15:38:21.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-03-09 12:59+0100\n"
 "Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
 "Language-Team:  Polish\n"
@@ -40,6 +40,247 @@
 msgid "Starting EPG scan"
 msgstr "Rozpoczynam skanowanie EPG"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Bez tytu�u"
 
diff -ruN vdr-1.7.10/po/pt_PT.po vdr-1.7.11/po/pt_PT.po
--- vdr-1.7.10/po/pt_PT.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/pt_PT.po	2010-01-04 15:38:21.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-03-18 17:04+0100\n"
 "Last-Translator: anonymous\n"
 "Language-Team: Portuguese\n"
@@ -39,6 +39,247 @@
 msgid "Starting EPG scan"
 msgstr "Iniciar a procura de EPG"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Sem t�tulo"
 
diff -ruN vdr-1.7.10/po/ro_RO.po vdr-1.7.11/po/ro_RO.po
--- vdr-1.7.10/po/ro_RO.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/ro_RO.po	2010-01-04 15:38:21.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-02-25 00:39+0100\n"
 "Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
 "Language-Team: Romanian\n"
@@ -42,6 +42,247 @@
 msgid "Starting EPG scan"
 msgstr "Pornesc achizi�ia EPG"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "F�r� titlu"
 
diff -ruN vdr-1.7.10/po/ru_RU.po vdr-1.7.11/po/ru_RU.po
--- vdr-1.7.10/po/ru_RU.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/ru_RU.po	2010-01-04 15:38:21.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-12-15 14:37+0100\n"
 "Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n"
 "Language-Team: Russian\n"
@@ -40,6 +40,247 @@
 msgid "Starting EPG scan"
 msgstr "������� EPG-������������"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "��� ��������"
 
diff -ruN vdr-1.7.10/po/sk_SK.po vdr-1.7.11/po/sk_SK.po
--- vdr-1.7.10/po/sk_SK.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/sk_SK.po	2010-01-04 15:38:21.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2009-09-30 12:50+0100\n"
 "Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
 "Language-Team: Slovak\n"
@@ -40,6 +40,247 @@
 msgid "Starting EPG scan"
 msgstr "Za��na preh�ad�va� EPG"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Bez n�zvu"
 
diff -ruN vdr-1.7.10/po/sl_SI.po vdr-1.7.11/po/sl_SI.po
--- vdr-1.7.10/po/sl_SI.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/sl_SI.po	2010-01-04 15:38:21.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-02-28 19:44+0100\n"
 "Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
 "Language-Team: Slovenian\n"
@@ -40,6 +40,247 @@
 msgid "Starting EPG scan"
 msgstr "Pri�enjam EPG-scan"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Brez naziva"
 
diff -ruN vdr-1.7.10/po/sv_SE.po vdr-1.7.11/po/sv_SE.po
--- vdr-1.7.10/po/sv_SE.po	2009-11-22 12:28:39.000000000 +0100
+++ vdr-1.7.11/po/sv_SE.po	2010-01-04 15:38:21.000000000 +0100
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-03-12 18:25+0100\n"
 "Last-Translator: Magnus Andersson <svankan@bahnhof.se>\n"
 "Language-Team: Swedish\n"
@@ -42,6 +42,247 @@
 msgid "Starting EPG scan"
 msgstr "P�b�rjar EPG skanning"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "ingen titel"
 
diff -ruN vdr-1.7.10/po/tr_TR.po vdr-1.7.11/po/tr_TR.po
--- vdr-1.7.10/po/tr_TR.po	2009-11-22 12:28:40.000000000 +0100
+++ vdr-1.7.11/po/tr_TR.po	2010-01-04 15:38:22.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2008-02-28 00:33+0100\n"
 "Last-Translator: Oktay Yolge�en <oktay_73@yahoo.de>\n"
 "Language-Team: Turkish\n"
@@ -39,6 +39,247 @@
 msgid "Starting EPG scan"
 msgstr "EPG tarama ba�l�yor"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "�sim yok"
 
diff -ruN vdr-1.7.10/po/uk_UA.po vdr-1.7.11/po/uk_UA.po
--- vdr-1.7.10/po/uk_UA.po	2009-11-22 12:28:40.000000000 +0100
+++ vdr-1.7.11/po/uk_UA.po	2010-01-04 15:38:22.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.7.7\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2009-05-31 13:17+0200\n"
 "Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
 "Language-Team: Ukrainian\n"
@@ -39,6 +39,247 @@
 msgid "Starting EPG scan"
 msgstr "Починаю EPG-сканування"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "Без назви"
 
diff -ruN vdr-1.7.10/po/zh_CN.po vdr-1.7.11/po/zh_CN.po
--- vdr-1.7.10/po/zh_CN.po	2009-11-22 12:28:40.000000000 +0100
+++ vdr-1.7.11/po/zh_CN.po	2010-01-04 15:38:22.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2009-11-22 12:28+0100\n"
+"POT-Creation-Date: 2010-01-03 15:10+0100\n"
 "PO-Revision-Date: 2009-09-23 23:50+0800\n"
 "Last-Translator: Nan Feng <nfgx@21cn.com>\n"
 "Language-Team: Chinese\n"
@@ -42,6 +42,247 @@
 msgid "Starting EPG scan"
 msgstr "开始节目单扫描"
 
+msgid "Content$Movie/Drama"
+msgstr ""
+
+msgid "Content$Detective/Thriller"
+msgstr ""
+
+msgid "Content$Adventure/Western/War"
+msgstr ""
+
+msgid "Content$Science Fiction/Fantasy/Horror"
+msgstr ""
+
+msgid "Content$Comedy"
+msgstr ""
+
+msgid "Content$Soap/Melodrama/Folkloric"
+msgstr ""
+
+msgid "Content$Romance"
+msgstr ""
+
+msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
+msgstr ""
+
+msgid "Content$Adult Movie/Drama"
+msgstr ""
+
+msgid "Content$News/Current Affairs"
+msgstr ""
+
+msgid "Content$News/Weather Report"
+msgstr ""
+
+msgid "Content$News Magazine"
+msgstr ""
+
+msgid "Content$Documentary"
+msgstr ""
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr ""
+
+msgid "Content$Show/Game Show"
+msgstr ""
+
+msgid "Content$Game Show/Quiz/Contest"
+msgstr ""
+
+msgid "Content$Variety Show"
+msgstr ""
+
+msgid "Content$Talk Show"
+msgstr ""
+
+msgid "Content$Sports"
+msgstr ""
+
+msgid "Content$Special Event"
+msgstr ""
+
+msgid "Content$Sport Magazine"
+msgstr ""
+
+msgid "Content$Football/Soccer"
+msgstr ""
+
+msgid "Content$Tennis/Squash"
+msgstr ""
+
+msgid "Content$Team Sports"
+msgstr ""
+
+msgid "Content$Athletics"
+msgstr ""
+
+msgid "Content$Motor Sport"
+msgstr ""
+
+msgid "Content$Water Sport"
+msgstr ""
+
+msgid "Content$Winter Sports"
+msgstr ""
+
+msgid "Content$Equestrian"
+msgstr ""
+
+msgid "Content$Martial Sports"
+msgstr ""
+
+msgid "Content$Children's/Youth Programme"
+msgstr ""
+
+msgid "Content$Pre-school Children's Programme"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr ""
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr ""
+
+msgid "Content$Informational/Educational/School Programme"
+msgstr ""
+
+msgid "Content$Cartoons/Puppets"
+msgstr ""
+
+msgid "Content$Music/Ballet/Dance"
+msgstr ""
+
+msgid "Content$Rock/Pop"
+msgstr ""
+
+msgid "Content$Serious/Classical Music"
+msgstr ""
+
+msgid "Content$Folk/Tradional Music"
+msgstr ""
+
+msgid "Content$Jazz"
+msgstr ""
+
+msgid "Content$Musical/Opera"
+msgstr ""
+
+msgid "Content$Ballet"
+msgstr ""
+
+msgid "Content$Arts/Culture"
+msgstr ""
+
+msgid "Content$Performing Arts"
+msgstr ""
+
+msgid "Content$Fine Arts"
+msgstr ""
+
+msgid "Content$Religion"
+msgstr ""
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr ""
+
+msgid "Content$Literature"
+msgstr ""
+
+msgid "Content$Film/Cinema"
+msgstr ""
+
+msgid "Content$Experimental Film/Video"
+msgstr ""
+
+msgid "Content$Broadcasting/Press"
+msgstr ""
+
+msgid "Content$New Media"
+msgstr ""
+
+msgid "Content$Arts/Culture Magazine"
+msgstr ""
+
+msgid "Content$Fashion"
+msgstr ""
+
+msgid "Content$Social/Political/Economics"
+msgstr ""
+
+msgid "Content$Magazine/Report/Documentary"
+msgstr ""
+
+msgid "Content$Economics/Social Advisory"
+msgstr ""
+
+msgid "Content$Remarkable People"
+msgstr ""
+
+msgid "Content$Education/Science/Factual"
+msgstr ""
+
+msgid "Content$Nature/Animals/Environment"
+msgstr ""
+
+msgid "Content$Technology/Natural Sciences"
+msgstr ""
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr ""
+
+msgid "Content$Foreign Countries/Expeditions"
+msgstr ""
+
+msgid "Content$Social/Spiritual Sciences"
+msgstr ""
+
+msgid "Content$Further Education"
+msgstr ""
+
+msgid "Content$Languages"
+msgstr ""
+
+msgid "Content$Leisure/Hobbies"
+msgstr ""
+
+msgid "Content$Tourism/Travel"
+msgstr ""
+
+msgid "Content$Handicraft"
+msgstr ""
+
+msgid "Content$Motoring"
+msgstr ""
+
+msgid "Content$Fitness & Health"
+msgstr ""
+
+msgid "Content$Cooking"
+msgstr ""
+
+msgid "Content$Advertisement/Shopping"
+msgstr ""
+
+msgid "Content$Gardening"
+msgstr ""
+
+msgid "Content$Original Language"
+msgstr ""
+
+msgid "Content$Black & White"
+msgstr ""
+
+msgid "Content$Unpublished"
+msgstr ""
+
+msgid "Content$Live Broadcast"
+msgstr ""
+
+#, c-format
+msgid "ParentalRating$from %d"
+msgstr ""
+
 msgid "No title"
 msgstr "没有标题"
 
diff -ruN vdr-1.7.10/receiver.c vdr-1.7.11/receiver.c
--- vdr-1.7.10/receiver.c	2007-08-12 13:52:59.000000000 +0200
+++ vdr-1.7.11/receiver.c	2010-01-01 16:38:48.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: receiver.c 2.0 2007/08/12 11:52:59 kls Exp $
+ * $Id: receiver.c 2.1 2010/01/01 15:38:48 kls Exp $
  */
 
 #include "receiver.h"
@@ -40,7 +40,7 @@
 {
   if (device) {
      const char *msg = "ERROR: cReceiver has not been detached yet! This is a design fault and VDR will segfault now!";
-     esyslog(msg);
+     esyslog("%s", msg);
      fprintf(stderr, "%s\n", msg);
      *(char *)0 = 0; // cause a segfault
      }
diff -ruN vdr-1.7.10/recorder.c vdr-1.7.11/recorder.c
--- vdr-1.7.10/recorder.c	2009-11-21 16:58:12.000000000 +0100
+++ vdr-1.7.11/recorder.c	2009-12-06 12:34:41.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: recorder.c 2.6 2009/11/21 15:58:12 kls Exp $
+ * $Id: recorder.c 2.7 2009/12/06 11:34:41 kls Exp $
  */
 
 #include "recorder.h"
@@ -128,7 +128,7 @@
               if (frameDetector->Synced()) {
                  if (!InfoWritten) {
                     if (recordingInfo.Read()) {
-                       if (frameDetector->FramesPerSecond() > 0 && recordingInfo.FramesPerSecond() != frameDetector->FramesPerSecond()) {
+                       if (frameDetector->FramesPerSecond() > 0 && !DoubleEqual(recordingInfo.FramesPerSecond(), frameDetector->FramesPerSecond())) {
                           recordingInfo.SetFramesPerSecond(frameDetector->FramesPerSecond());
                           recordingInfo.Write();
                           }
diff -ruN vdr-1.7.10/recording.c vdr-1.7.11/recording.c
--- vdr-1.7.10/recording.c	2009-11-22 12:20:53.000000000 +0100
+++ vdr-1.7.11/recording.c	2010-01-02 14:46:05.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: recording.c 2.18 2009/11/22 11:20:53 kls Exp $
+ * $Id: recording.c 2.21 2010/01/02 13:46:05 kls Exp $
  */
 
 #include "recording.h"
@@ -260,6 +260,7 @@
                  switch (*s) {
                    case 'I': resume = atoi(t);
                              break;
+                   default: ;
                    }
                  }
            fclose(f);
@@ -443,8 +444,8 @@
                             ownEvent->SetEventID(EventID);
                             ownEvent->SetStartTime(StartTime);
                             ownEvent->SetDuration(Duration);
-                            ownEvent->SetTableID(TableID);
-                            ownEvent->SetVersion(Version);
+                            ownEvent->SetTableID(uchar(TableID));
+                            ownEvent->SetVersion(uchar(Version));
                             }
                        }
                        break;
@@ -570,7 +571,7 @@
                      if (strlen(p) > 2 && isxdigit(*(p + 1)) && isxdigit(*(p + 2))) {
                         char buf[3];
                         sprintf(buf, "%c%c", *(p + 1), *(p + 2));
-                        unsigned char c = strtol(buf, NULL, 16);
+                        uchar c = uchar(strtol(buf, NULL, 16));
                         if (c) {
                            *p = c;
                            memmove(p + 1, p + 3, strlen(p) - 2);
@@ -582,6 +583,7 @@
                 case '\x01': *p = '\''; break;
                 case '\x02': *p = '/';  break;
                 case '\x03': *p = ':';  break;
+                default: ;
                 }
               }
            }
@@ -672,7 +674,9 @@
   deleted = 0;
   titleBuffer = NULL;
   sortBuffer = NULL;
-  fileName = strdup(FileName);
+  FileName = fileName = strdup(FileName);
+  if (*(fileName + strlen(fileName) - 1) == '/')
+     *(fileName + strlen(fileName) - 1) = 0;
   FileName += strlen(VideoDirectory) + 1;
   const char *p = strrchr(FileName, '/');
 
@@ -1412,8 +1416,11 @@
         // Read data:
         else if (ReplayFile) {
            int Result = Buffer.Read(ReplayFile, BufferChunks);
-           if (Result == 0) // EOF
+           if (Result == 0) { // EOF
               ReplayFile = FileName.NextFile();
+              FileSize = 0;
+              FrameOffset = -1;
+              }
            }
         // Recording has been processed:
         else {
@@ -1498,19 +1505,19 @@
         if (access(fileName, R_OK) == 0) {
            struct stat buf;
            if (stat(fileName, &buf) == 0) {
-              delta = buf.st_size % sizeof(tIndexTs);
+              delta = int(buf.st_size % sizeof(tIndexTs));
               if (delta) {
                  delta = sizeof(tIndexTs) - delta;
                  esyslog("ERROR: invalid file size (%lld) in '%s'", buf.st_size, fileName);
                  }
-              last = (buf.st_size + delta) / sizeof(tIndexTs) - 1;
+              last = int((buf.st_size + delta) / sizeof(tIndexTs) - 1);
               if (!Record && last >= 0) {
                  size = last + 1;
                  index = MALLOC(tIndexTs, size);
                  if (index) {
                     f = open(fileName, O_RDONLY);
                     if (f >= 0) {
-                       if ((int)safe_read(f, index, buf.st_size) != buf.st_size) {
+                       if (safe_read(f, index, size_t(buf.st_size)) != buf.st_size) {
                           esyslog("ERROR: can't read from file '%s'", fileName);
                           free(index);
                           index = NULL;
@@ -1576,8 +1583,8 @@
   tIndexPes IndexPes;
   while (Count-- > 0) {
         IndexPes.offset = uint32_t(IndexTs->offset);
-        IndexPes.type = IndexTs->independent ? 1 : 2; // I_FRAME : "not I_FRAME" (exact frame type doesn't matter)
-        IndexPes.number = IndexTs->number;
+        IndexPes.type = uchar(IndexTs->independent ? 1 : 2); // I_FRAME : "not I_FRAME" (exact frame type doesn't matter)
+        IndexPes.number = uchar(IndexTs->number);
         IndexPes.reserved = 0;
         memcpy(IndexTs, &IndexPes, sizeof(*IndexTs));
         IndexTs++;
@@ -1598,7 +1605,7 @@
                f = -1;
                break;
                }
-            int newLast = buf.st_size / sizeof(tIndexTs) - 1;
+            int newLast = int(buf.st_size / sizeof(tIndexTs) - 1);
             if (newLast > last) {
                if (size <= newLast) {
                   size *= 2;
@@ -1668,7 +1675,7 @@
            uint16_t fn = index[Index + 1].number;
            off_t fo = index[Index + 1].offset;
            if (fn == *FileNumber)
-              *Length = fo - *FileOffset;
+              *Length = int(fo - *FileOffset);
            else
               *Length = -1; // this means "everything up to EOF" (the buffer's Read function will act accordingly)
            }
@@ -1699,7 +1706,7 @@
                   uint16_t fn = index[Index + 1].number;
                   off_t fo = index[Index + 1].offset;
                   if (fn == *FileNumber)
-                     *Length = fo - *FileOffset;
+                     *Length = int(fo - *FileOffset);
                   else {
                      esyslog("ERROR: 'I' frame at end of file #%d", *FileNumber);
                      *Length = -1;
@@ -1746,6 +1753,33 @@
      }
 }
 
+bool GenerateIndex(const char *FileName) 
+{
+  if (DirectoryOk(FileName)) {
+     cRecording Recording(FileName);
+     if (Recording.Name()) {
+        if (!Recording.IsPesRecording()) {
+           cString IndexFileName = AddDirectory(FileName, INDEXFILESUFFIX);
+           unlink(IndexFileName);
+           cIndexFileGenerator *IndexFileGenerator = new cIndexFileGenerator(FileName);
+           while (IndexFileGenerator->Active())
+                 cCondWait::SleepMs(INDEXFILECHECKINTERVAL);
+           if (access(IndexFileName, R_OK) == 0)
+              return true;
+           else
+              fprintf(stderr, "cannot create '%s'\n", *IndexFileName);
+           }
+        else
+           fprintf(stderr, "'%s' is not a TS recording\n", FileName);
+        }
+     else
+        fprintf(stderr, "'%s' is not a recording\n", FileName);
+     }
+  else
+     fprintf(stderr, "'%s' is not a directory\n", FileName);
+  return false;
+}
+
 // --- cFileName -------------------------------------------------------------
 
 #define MAXFILESPERRECORDINGPES 255
@@ -1868,11 +1902,11 @@
      Close();
   int MaxFilesPerRecording = isPesRecording ? MAXFILESPERRECORDINGPES : MAXFILESPERRECORDINGTS;
   if (0 < Number && Number <= MaxFilesPerRecording) {
-     fileNumber = Number;
+     fileNumber = uint16_t(Number);
      sprintf(pFileNumber, isPesRecording ? RECORDFILESUFFIXPES : RECORDFILESUFFIXTS, fileNumber);
      if (record) {
         if (access(fileName, F_OK) == 0) {
-           // files exists, check if it has non-zero size
+           // file exists, check if it has non-zero size
            struct stat buf;
            if (stat(fileName, &buf) == 0) {
               if (buf.st_size != 0)
diff -ruN vdr-1.7.10/recording.h vdr-1.7.11/recording.h
--- vdr-1.7.10/recording.h	2009-11-21 17:12:55.000000000 +0100
+++ vdr-1.7.11/recording.h	2010-01-02 13:10:07.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: recording.h 2.10 2009/11/21 16:12:55 kls Exp $
+ * $Id: recording.h 2.12 2010/01/02 12:10:07 kls Exp $
  */
 
 #ifndef __RECORDING_H
@@ -253,7 +253,7 @@
 class cFileName {
 private:
   cUnbufferedFile *file;
-  int fileNumber;
+  uint16_t fileNumber;
   char *fileName, *pFileNumber;
   bool record;
   bool blocking;
@@ -262,11 +262,11 @@
   cFileName(const char *FileName, bool Record, bool Blocking = false, bool IsPesRecording = false);
   ~cFileName();
   const char *Name(void) { return fileName; }
-  int Number(void) { return fileNumber; }
+  uint16_t Number(void) { return fileNumber; }
   bool GetLastPatPmtVersions(int &PatVersion, int &PmtVersion);
   cUnbufferedFile *Open(void);
   void Close(void);
-  cUnbufferedFile *SetOffset(int Number, off_t Offset = 0);
+  cUnbufferedFile *SetOffset(int Number, off_t Offset = 0); // yes, Number is int for easier internal calculating
   cUnbufferedFile *NextFile(void);
   };
 
@@ -285,4 +285,6 @@
       // be modified and may be reallocated if more space is needed. The return
       // value points to the resulting string, which may be different from s.
 
+bool GenerateIndex(const char *FileName);
+
 #endif //__RECORDING_H
diff -ruN vdr-1.7.10/remote.c vdr-1.7.11/remote.c
--- vdr-1.7.10/remote.c	2008-02-23 15:14:46.000000000 +0100
+++ vdr-1.7.11/remote.c	2009-12-06 13:08:03.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: remote.c 2.0 2008/02/23 14:14:46 kls Exp $
+ * $Id: remote.c 2.1 2009/12/06 12:08:03 kls Exp $
  */
 
 #include "remote.h"
@@ -287,7 +287,9 @@
       if (p->code == Code)
          return p->func;
       }
-  return (Code <= 0xFF) ? Code : kfNone;
+  if (Code <= 0xFF)
+     return Code;
+  return kfNone;
 }
 
 int cKbdRemote::ReadKey(void)
@@ -337,9 +339,11 @@
                                 k |= key1 & 0xFF;
                                 } while (key1 != 0x7E);
                              break;
+                        default: ;
                         }
                       }
                    break;
+              default: ;
               }
             }
         }
diff -ruN vdr-1.7.10/remux.c vdr-1.7.11/remux.c
--- vdr-1.7.10/remux.c	2009-11-22 12:23:27.000000000 +0100
+++ vdr-1.7.11/remux.c	2009-12-29 16:56:33.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: remux.c 2.29 2009/11/22 11:23:27 kls Exp $
+ * $Id: remux.c 2.37 2009/12/29 15:56:33 kls Exp $
  */
 
 #include "remux.h"
@@ -295,7 +295,7 @@
   numPmtPackets = 0;
   if (Channel) {
      int Vpid = Channel->Vpid();
-     int Ppid = Channel->Ppid();
+     int Ppid = 0x1FFF; // no PCR pid
      uchar *p = buf;
      int i = 0;
      p[i++] = 0x02; // table id
@@ -486,6 +486,11 @@
      int NumDpids = 0;
      int NumSpids = 0;
      vpid = vtype = 0;
+     apids[0] = 0;
+     dpids[0] = 0;
+     spids[0] = 0;
+     atypes[0] = 0;
+     dtypes[0] = 0;
      SI::PMT::Stream stream;
      for (SI::Loop::Iterator it; Pmt.streamLoop.getNext(stream, it); ) {
          dbgpatpmt("     stream type = %02X, pid = %d", stream.getStreamType(), stream.getPid());
@@ -496,17 +501,20 @@
                       vpid = stream.getPid();
                       vtype = stream.getStreamType();
                       break;
+           case 0x03: // STREAMTYPE_11172_AUDIO
            case 0x04: // STREAMTYPE_13818_AUDIO
                       {
                       if (NumApids < MAXAPIDS) {
-                         char ALangs[MAXLANGCODE2] = "";
+                         apids[NumApids] = stream.getPid();
+                         atypes[NumApids] = stream.getStreamType();
+                         *alangs[NumApids] = 0;
                          SI::Descriptor *d;
                          for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) {
                              switch (d->getDescriptorTag()) {
                                case SI::ISO639LanguageDescriptorTag: {
                                     SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d;
                                     SI::ISO639LanguageDescriptor::Language l;
-                                    char *s = ALangs;
+                                    char *s = alangs[NumApids];
                                     int n = 0;
                                     for (SI::Loop::Iterator it; ld->languageLoop.getNext(l, it); ) {
                                         if (*ld->languageCode != '-') { // some use "---" to indicate "none"
@@ -526,8 +534,9 @@
                              delete d;
                              }
                          if (updatePrimaryDevice)
-                            cDevice::PrimaryDevice()->SetAvailableTrack(ttAudio, NumApids, stream.getPid(), ALangs);
+                            cDevice::PrimaryDevice()->SetAvailableTrack(ttAudio, NumApids, apids[NumApids], alangs[NumApids]);
                          NumApids++;
+                         apids[NumApids]= 0;
                          }
                       }
                       break;
@@ -545,14 +554,21 @@
                             case SI::SubtitlingDescriptorTag:
                                  dbgpatpmt(" subtitling");
                                  if (NumSpids < MAXSPIDS) {
+                                    spids[NumSpids] = stream.getPid();
+                                    *slangs[NumSpids] = 0;
+                                    subtitlingTypes[NumSpids] = 0;
+                                    compositionPageIds[NumSpids] = 0;
+                                    ancillaryPageIds[NumSpids] = 0;
                                     SI::SubtitlingDescriptor *sd = (SI::SubtitlingDescriptor *)d;
                                     SI::SubtitlingDescriptor::Subtitling sub;
-                                    char SLangs[MAXLANGCODE2] = "";
-                                    char *s = SLangs;
+                                    char *s = slangs[NumSpids];
                                     int n = 0;
                                     for (SI::Loop::Iterator it; sd->subtitlingLoop.getNext(sub, it); ) {
                                         if (sub.languageCode[0]) {
                                            dbgpatpmt(" '%s'", sub.languageCode);
+                                           subtitlingTypes[NumSpids] = sub.getSubtitlingType();
+                                           compositionPageIds[NumSpids] = sub.getCompositionPageId();
+                                           ancillaryPageIds[NumSpids] = sub.getAncillaryPageId();
                                            if (n > 0)
                                               *s++ = '+';
                                            strn0cpy(s, I18nNormalizeLanguageCode(sub.languageCode), MAXLANGCODE1);
@@ -562,8 +578,9 @@
                                            }
                                         }
                                     if (updatePrimaryDevice)
-                                       cDevice::PrimaryDevice()->SetAvailableTrack(ttSubtitle, NumSpids, stream.getPid(), SLangs);
+                                       cDevice::PrimaryDevice()->SetAvailableTrack(ttSubtitle, NumSpids, spids[NumSpids], slangs[NumSpids]);
                                     NumSpids++;
+                                    spids[NumSpids]= 0;
                                     }
                                  break;
                             case SI::ISO639LanguageDescriptorTag: {
@@ -578,13 +595,18 @@
                           }
                       if (dpid) {
                          if (NumDpids < MAXDPIDS) {
+                            dpids[NumDpids] = dpid;
+                            dtypes[NumDpids] = stream.getStreamType();
+                            strn0cpy(dlangs[NumDpids], lang, sizeof(dlangs[NumDpids]));
                             if (updatePrimaryDevice)
                                cDevice::PrimaryDevice()->SetAvailableTrack(ttDolby, NumDpids, dpid, lang);
                             NumDpids++;
+                            dpids[NumDpids]= 0;
                             }
                          }
                       }
                       break;
+           default: ;
            }
          dbgpatpmt("\n");
          if (updatePrimaryDevice) {
@@ -599,7 +621,7 @@
   pmtSize = 0;
 }
 
-bool cPatPmtParser::GetVersions(int &PatVersion, int &PmtVersion)
+bool cPatPmtParser::GetVersions(int &PatVersion, int &PmtVersion) const
 {
   PatVersion = patVersion;
   PmtVersion = pmtVersion;
diff -ruN vdr-1.7.10/remux.h vdr-1.7.11/remux.h
--- vdr-1.7.10/remux.h	2009-11-21 16:55:34.000000000 +0100
+++ vdr-1.7.11/remux.h	2009-12-29 16:53:54.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: remux.h 2.20 2009/11/21 15:55:34 kls Exp $
+ * $Id: remux.h 2.23 2009/12/29 15:53:54 kls Exp $
  */
 
 #ifndef __REMUX_H
@@ -214,6 +214,17 @@
   int pmtPid;
   int vpid;
   int vtype;
+  int apids[MAXAPIDS + 1]; // list is zero-terminated
+  int atypes[MAXAPIDS + 1]; // list is zero-terminated
+  char alangs[MAXAPIDS][MAXLANGCODE2];
+  int dpids[MAXDPIDS + 1]; // list is zero-terminated
+  int dtypes[MAXDPIDS + 1]; // list is zero-terminated
+  char dlangs[MAXDPIDS][MAXLANGCODE2];
+  int spids[MAXSPIDS + 1]; // list is zero-terminated
+  char slangs[MAXSPIDS][MAXLANGCODE2];
+  uchar subtitlingTypes[MAXSPIDS];
+  uint16_t compositionPageIds[MAXSPIDS];
+  uint16_t ancillaryPageIds[MAXSPIDS];
   bool updatePrimaryDevice;
 protected:
   int SectionLength(const uchar *Data, int Length) { return (Length >= 3) ? ((int(Data[1]) & 0x0F) << 8)| Data[2] : 0; }
@@ -232,18 +243,32 @@
        ///< are delivered to the parser through several subsequent calls to
        ///< ParsePmt(). The whole PMT data will be processed once the last packet
        ///< has been received.
-  bool GetVersions(int &PatVersion, int &PmtVersion);
+  bool GetVersions(int &PatVersion, int &PmtVersion) const;
        ///< Returns true if a valid PAT/PMT has been parsed and stores
        ///< the current version numbers in the given variables.
-  int PmtPid(void) { return pmtPid; }
+  int PmtPid(void) const { return pmtPid; }
        ///< Returns the PMT pid as defined by the current PAT.
        ///< If no PAT has been received yet, -1 will be returned.
-  int Vpid(void) { return vpid; }
+  int Vpid(void) const { return vpid; }
        ///< Returns the video pid as defined by the current PMT, or 0 if no video
        ///< pid has been detected, yet.
-  int Vtype(void) { return vtype; }
+  int Vtype(void) const { return vtype; }
        ///< Returns the video stream type as defined by the current PMT, or 0 if no video
        ///< stream type has been detected, yet.
+  const int *Apids(void) const { return apids; }
+  const int *Dpids(void) const { return dpids; }
+  const int *Spids(void) const { return spids; }
+  int Apid(int i) const { return (0 <= i && i < MAXAPIDS) ? apids[i] : 0; }
+  int Dpid(int i) const { return (0 <= i && i < MAXDPIDS) ? dpids[i] : 0; }
+  int Spid(int i) const { return (0 <= i && i < MAXSPIDS) ? spids[i] : 0; }
+  int Atype(int i) const { return (0 <= i && i < MAXAPIDS) ? atypes[i] : 0; }
+  int Dtype(int i) const { return (0 <= i && i < MAXDPIDS) ? dtypes[i] : 0; }
+  const char *Alang(int i) const { return (0 <= i && i < MAXAPIDS) ? alangs[i] : ""; }
+  const char *Dlang(int i) const { return (0 <= i && i < MAXDPIDS) ? dlangs[i] : ""; }
+  const char *Slang(int i) const { return (0 <= i && i < MAXSPIDS) ? slangs[i] : ""; }
+  uchar SubtitlingType(int i) const { return (0 <= i && i < MAXSPIDS) ? subtitlingTypes[i] : uchar(0); }
+  uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : uint16_t(0); }
+  uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : uint16_t(0); }
   };
 
 // TS to PES converter:
diff -ruN vdr-1.7.10/sdt.c vdr-1.7.11/sdt.c
--- vdr-1.7.10/sdt.c	2008-04-12 15:33:55.000000000 +0200
+++ vdr-1.7.11/sdt.c	2009-12-23 17:02:47.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: sdt.c 2.1 2008/04/12 13:33:55 kls Exp $
+ * $Id: sdt.c 2.4 2009/12/23 16:02:47 kls Exp $
  */
 
 #include "sdt.h"
@@ -65,16 +65,18 @@
                         char *ps = compactspace(ShortNameBuf);
                         if (!*ps && cSource::IsCable(Source())) {
                            // Some cable providers don't mark short channel names according to the
-                           // standard, but rather go their own way and use "name>short name" or
-                           // "name, short name":
+                           // standard, but rather go their own way and use "name>short name":
                            char *p = strchr(pn, '>'); // fix for UPC Wien
-                           if (!p)
-                              p = strchr(pn, ','); // fix for "Kabel Deutschland"
                            if (p && p > pn) {
                               *p++ = 0;
                               strcpy(ShortNameBuf, skipspace(p));
                               }
                            }
+                        // Avoid ',' in short name (would cause trouble in channels.conf):
+                        for (char *p = ShortNameBuf; *p; p++) {
+                            if (*p == ',')
+                               *p = '.';
+                            }
                         sd->providerName.getText(ProviderNameBuf, sizeof(ProviderNameBuf));
                         char *pp = compactspace(ProviderNameBuf);
                         if (channel) {
@@ -92,6 +94,7 @@
                            patFilter->Trigger();
                            }
                         }
+                   default: ;
                    }
                  }
                  break;
diff -ruN vdr-1.7.10/skinclassic.c vdr-1.7.11/skinclassic.c
--- vdr-1.7.10/skinclassic.c	2008-02-23 11:31:58.000000000 +0100
+++ vdr-1.7.11/skinclassic.c	2010-01-03 15:55:10.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: skinclassic.c 2.0 2008/02/23 10:31:58 kls Exp $
+ * $Id: skinclassic.c 2.3 2010/01/03 14:55:10 kls Exp $
  */
 
 #include "skinclassic.h"
@@ -345,6 +345,12 @@
      osd->DrawText(x3 - w, y, buffer, Theme.Color(clrMenuEventVpsFg), Theme.Color(clrMenuEventVpsBg), font, w);
      }
   y += ts.Height();
+  if (Event->ParentalRating()) {
+     cString buffer = cString::sprintf(" %s ", *Event->GetParentalRatingString());
+     const cFont *font = cFont::GetFont(fontSml);
+     int w = font->Width(buffer);
+     osd->DrawText(x3 - w, y, buffer, Theme.Color(clrMenuEventVpsFg), Theme.Color(clrMenuEventVpsBg), font, w);
+     }
   y += font->Height();
   ts.Set(osd, x1, y, x2 - x1, y3 - y, Event->Title(), font, Theme.Color(clrMenuEventTitle), Theme.Color(clrBackground));
   y += ts.Height();
@@ -353,6 +359,14 @@
      ts.Set(osd, x1, y, x2 - x1, y3 - y, Event->ShortText(), font, Theme.Color(clrMenuEventShortText), Theme.Color(clrBackground));
      y += ts.Height();
      }
+  for (int i = 0; Event->Contents(i); i++) {
+      const char *s = Event->ContentToString(Event->Contents(i));
+      if (!isempty(s)) {
+         const cFont *font = cFont::GetFont(fontSml);
+         ts.Set(osd, x1, y, x2 - x1, y3 - y, s, font, Theme.Color(clrMenuEventShortText), Theme.Color(clrBackground));
+         y += ts.Height();
+         }
+      }
   y += font->Height();
   if (!isempty(Event->Description())) {
      textScroller.Set(osd, x1, y, x2 - x1, y3 - y, Event->Description(), font, Theme.Color(clrMenuEventDescription), Theme.Color(clrBackground));
@@ -372,6 +386,12 @@
   snprintf(t, sizeof(t), "%s  %s", *DateString(Recording->start), *TimeString(Recording->start));
   ts.Set(osd, x1, y, x2 - x1, y3 - y, t, font, Theme.Color(clrMenuEventTime), Theme.Color(clrBackground));
   y += ts.Height();
+  if (Info->GetEvent()->ParentalRating()) {
+     cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString());
+     const cFont *font = cFont::GetFont(fontSml);
+     int w = font->Width(buffer);
+     osd->DrawText(x3 - w, y, buffer, Theme.Color(clrMenuEventVpsFg), Theme.Color(clrMenuEventVpsBg), font, w);
+     }
   y += font->Height();
   const char *Title = Info->Title();
   if (isempty(Title))
@@ -383,6 +403,14 @@
      ts.Set(osd, x1, y, x2 - x1, y3 - y, Info->ShortText(), font, Theme.Color(clrMenuEventShortText), Theme.Color(clrBackground));
      y += ts.Height();
      }
+  for (int i = 0; Info->GetEvent()->Contents(i); i++) {
+      const char *s = Info->GetEvent()->ContentToString(Info->GetEvent()->Contents(i));
+      if (!isempty(s)) {
+         const cFont *font = cFont::GetFont(fontSml);
+         ts.Set(osd, x1, y, x2 - x1, y3 - y, s, font, Theme.Color(clrMenuEventShortText), Theme.Color(clrBackground));
+         y += ts.Height();
+         }
+      }
   y += font->Height();
   if (!isempty(Info->Description())) {
      textScroller.Set(osd, x1, y, x2 - x1, y3 - y, Info->Description(), font, Theme.Color(clrMenuEventDescription), Theme.Color(clrBackground));
diff -ruN vdr-1.7.10/skinsttng.c vdr-1.7.11/skinsttng.c
--- vdr-1.7.10/skinsttng.c	2008-02-23 11:23:44.000000000 +0100
+++ vdr-1.7.11/skinsttng.c	2010-01-03 15:51:35.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: skinsttng.c 2.0 2008/02/23 10:23:44 kls Exp $
+ * $Id: skinsttng.c 2.4 2010/01/03 14:51:35 kls Exp $
  */
 
 // Star Trek: The Next Generation� is a registered trademark of Paramount Pictures
@@ -593,6 +593,15 @@
      osd->DrawEllipse  (x6, y, x7 - 1, yb - 1, frameColor, 5);
      }
   y += ts.Height();
+  if (Event->ParentalRating()) {
+     cString buffer = cString::sprintf(" %s ", *Event->GetParentalRatingString());
+     const cFont *font = cFont::GetFont(fontSml);
+     int w = font->Width(buffer);
+     osd->DrawText(x4 - w, y, buffer, Theme.Color(clrMenuEventVps), frameColor, font, w);
+     int yb = y + font->Height();
+     osd->DrawRectangle(x5, y, x6 - 1, yb - 1, frameColor);
+     osd->DrawEllipse  (x6, y, x7 - 1, yb - 1, frameColor, 5);
+     }
   y += font->Height();
   ts.Set(osd, xl, y, x4 - xl, y4 - y, Event->Title(), font, Theme.Color(clrMenuEventTitle), Theme.Color(clrBackground));
   y += ts.Height();
@@ -601,6 +610,14 @@
      ts.Set(osd, xl, y, x4 - xl, y4 - y, Event->ShortText(), font, Theme.Color(clrMenuEventShortText), Theme.Color(clrBackground));
      y += ts.Height();
      }
+  for (int i = 0; Event->Contents(i); i++) {
+      const char *s = Event->ContentToString(Event->Contents(i));
+      if (!isempty(s)) {
+         const cFont *font = cFont::GetFont(fontSml);
+         ts.Set(osd, xl, y, x4 - xl, y4 - y, s, font, Theme.Color(clrMenuEventShortText), Theme.Color(clrBackground));
+         y += ts.Height();
+         }
+      }
   y += font->Height();
   if (!isempty(Event->Description())) {
      int yt = y;
@@ -627,6 +644,15 @@
   snprintf(t, sizeof(t), "%s  %s", *DateString(Recording->start), *TimeString(Recording->start));
   ts.Set(osd, xl, y, x4 - xl, y4 - y, t, font, Theme.Color(clrMenuEventTime), Theme.Color(clrBackground));
   y += ts.Height();
+  if (Info->GetEvent()->ParentalRating()) {
+     cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString());
+     const cFont *font = cFont::GetFont(fontSml);
+     int w = font->Width(buffer);
+     osd->DrawText(x4 - w, y, buffer, Theme.Color(clrMenuEventVps), frameColor, font, w);
+     int yb = y + font->Height();
+     osd->DrawRectangle(x5, y, x6 - 1, yb - 1, frameColor);
+     osd->DrawEllipse  (x6, y, x7 - 1, yb - 1, frameColor, 5);
+     }
   y += font->Height();
   const char *Title = Info->Title();
   if (isempty(Title))
@@ -638,6 +664,14 @@
      ts.Set(osd, xl, y, x4 - xl, y4 - y, Info->ShortText(), font, Theme.Color(clrMenuEventShortText), Theme.Color(clrBackground));
      y += ts.Height();
      }
+  for (int i = 0; Info->GetEvent()->Contents(i); i++) {
+      const char *s = Info->GetEvent()->ContentToString(Info->GetEvent()->Contents(i));
+      if (!isempty(s)) {
+         const cFont *font = cFont::GetFont(fontSml);
+         ts.Set(osd, xl, y, x4 - xl, y4 - y, s, font, Theme.Color(clrMenuEventShortText), Theme.Color(clrBackground));
+         y += ts.Height();
+         }
+      }
   y += font->Height();
   if (!isempty(Info->Description())) {
      int yt = y;
@@ -1068,6 +1102,7 @@
     case 0: bm = &bmAudioStereo; break;
     case 1: bm = &bmAudioLeft;   break;
     case 2: bm = &bmAudioRight;  break;
+    default: ;
     }
   if (bm)
      osd->DrawBitmap(x3 + 5, y6 + (y7 - y6 - bm->Height()) / 2, *bm, Theme.Color(clrChannelSymbolOn), frameColor);
diff -ruN vdr-1.7.10/sources.conf vdr-1.7.11/sources.conf
--- vdr-1.7.10/sources.conf	2009-10-18 16:08:53.000000000 +0200
+++ vdr-1.7.11/sources.conf	2009-12-23 15:35:49.000000000 +0100
@@ -174,12 +174,13 @@
 S111.1W Anik F2
 S113W   SatMex 6
 S116.8W SatMex 5
-S119W   Anik F3 & Echostar 7 & DirecTV 7S
+S118.8W Anik F3
+S119W   Echostar 7 & DirecTV 7S
 S121W   Echostar 9 & Galaxy 23
 S123W   Galaxy 18
 S125W   Galaxy 14
 S127W   Galaxy 13/Horizons 1
-S129W   Echostar 5 & Galaxy 27
+S129W   Ciel 2 & Galaxy 27
 S131W   AMC 11
 S133W   Galaxy15
 S135W   AMC 10
diff -ruN vdr-1.7.10/svdrp.c vdr-1.7.11/svdrp.c
--- vdr-1.7.10/svdrp.c	2009-10-18 16:08:58.000000000 +0200
+++ vdr-1.7.11/svdrp.c	2010-01-03 16:41:26.000000000 +0100
@@ -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 2.6 2009/10/18 14:08:58 kls Exp $
+ * $Id: svdrp.c 2.7 2010/01/03 15:41:26 kls Exp $
  */
 
 #include "svdrp.h"
@@ -179,6 +179,8 @@
 // --- cSVDRP ----------------------------------------------------------------
 
 #define MAXHELPTOPIC 10
+#define EITDISABLETIME 10 // seconds until EIT processing is enabled again after a CLRE command
+                          // adjust the help for CLRE accordingly if changing this!
 
 const char *HelpPages[] = {
   "CHAN [ + | - | <number> | <name> | <id> ]\n"
@@ -187,7 +189,10 @@
   "    it returns the current channel number and name.",
   "CLRE [ <number> | <name> | <id> ]\n"
   "    Clear the EPG list of the given channel number, name or id.\n"
-  "    Without option it clears the entire EPG list.",
+  "    Without option it clears the entire EPG list.\n"
+  "    After a CLRE command, no further EPG processing is done for 10\n"
+  "    seconds, so that data sent with subsequent PUTE commands doesn't\n"
+  "    interfere with data from the broadcasters.",
   "DELC <number>\n"
   "    Delete channel.",
   "DELR <number>\n"
@@ -574,6 +579,7 @@
                }
            if (Schedule) {
               Schedule->Cleanup(INT_MAX);
+              cEitFilter::SetDisableUntil(time(NULL) + EITDISABLETIME);
               Reply(250, "EPG data of channel \"%s\" cleared", Option);
               }
            else {
@@ -589,6 +595,7 @@
      }
   else {
      cSchedules::ClearAll();
+     cEitFilter::SetDisableUntil(time(NULL) + EITDISABLETIME);
      Reply(250, "EPG data cleared");
      }
 }
diff -ruN vdr-1.7.10/tools.c vdr-1.7.11/tools.c
--- vdr-1.7.10/tools.c	2009-11-06 16:21:17.000000000 +0100
+++ vdr-1.7.11/tools.c	2009-12-23 16:12:15.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: tools.c 2.4 2009/11/06 15:21:17 kls Exp $
+ * $Id: tools.c 2.6 2009/12/23 15:12:15 kls Exp $
  */
 
 #include "tools.h"
@@ -633,6 +633,7 @@
     case 2: return ((*s & 0x1F) <<  6) |  (*(s + 1) & 0x3F);
     case 3: return ((*s & 0x0F) << 12) | ((*(s + 1) & 0x3F) <<  6) |  (*(s + 2) & 0x3F);
     case 4: return ((*s & 0x07) << 18) | ((*(s + 1) & 0x3F) << 12) | ((*(s + 2) & 0x3F) << 6) | (*(s + 3) & 0x3F);
+    default: ;
     }
   return *s;
 }
@@ -768,10 +769,10 @@
 cCharSetConv::cCharSetConv(const char *FromCode, const char *ToCode)
 {
   if (!FromCode)
-     FromCode = systemCharacterTable;
+     FromCode = systemCharacterTable ? systemCharacterTable : "UTF-8";
   if (!ToCode)
      ToCode = "UTF-8";
-  cd = (FromCode && ToCode) ? iconv_open(ToCode, FromCode) : (iconv_t)-1;
+  cd = iconv_open(ToCode, FromCode);
   result = NULL;
   length = 0;
 }
@@ -942,8 +943,8 @@
     case 4: return tr("Friday");
     case 5: return tr("Saturday");
     case 6: return tr("Sunday");
+    default: return "???";
     }
-  return "???";
 }
 
 cString WeekDayNameFull(time_t t)
diff -ruN vdr-1.7.10/tools.h vdr-1.7.11/tools.h
--- vdr-1.7.10/tools.h	2009-04-14 22:41:39.000000000 +0200
+++ vdr-1.7.11/tools.h	2009-12-23 16:14:39.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: tools.h 2.2 2009/04/14 20:41:39 kls Exp $
+ * $Id: tools.h 2.4 2009/12/23 15:14:39 kls Exp $
  */
 
 #ifndef __TOOLS_H
@@ -13,7 +13,9 @@
 #include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <float.h>
 #include <iconv.h>
+#include <math.h>
 #include <poll.h>
 #include <stddef.h>
 #include <stdint.h>
@@ -60,7 +62,7 @@
 int BCD2INT(int x);
 
 // Unfortunately there are no platform independent macros for unaligned
-// access. so we do it this way:
+// access, so we do it this way:
 
 template<class T> inline T get_unaligned(T *p)
 {
@@ -74,6 +76,14 @@
   ((s *)p)->v = v;
 }
 
+// Comparing doubles for equality is unsafe, but unfortunately we can't
+// overwrite operator==(double, double), so this will have to do:
+
+inline bool DoubleEqual(double a, double b)
+{
+  return fabs(a - b) <= DBL_EPSILON;
+}
+
 // When handling strings that might contain UTF-8 characters, it may be necessary
 // to process a "symbol" that consists of several actual character bytes. The
 // following functions allow transparently accessing a "char *" string without
@@ -132,7 +142,8 @@
 public:
   cCharSetConv(const char *FromCode = NULL, const char *ToCode = NULL);
      ///< Sets up a character set converter to convert from FromCode to ToCode.
-     ///< If FromCode is NULL, the previously set systemCharacterTable is used.
+     ///< If FromCode is NULL, the previously set systemCharacterTable is used
+     ///< (or "UTF-8" if no systemCharacterTable has been set).
      ///< If ToCode is NULL, "UTF-8" is used.
   ~cCharSetConv();
   const char *Convert(const char *From, char *To = NULL, size_t ToLength = 0);
diff -ruN vdr-1.7.10/transfer.c vdr-1.7.11/transfer.c
--- vdr-1.7.10/transfer.c	2009-01-23 16:34:26.000000000 +0100
+++ vdr-1.7.11/transfer.c	2009-12-06 15:22:23.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: transfer.c 2.3 2009/01/23 15:34:26 kls Exp $
+ * $Id: transfer.c 2.4 2009/12/06 14:22:23 kls Exp $
  */
 
 #include "transfer.h"
@@ -45,7 +45,6 @@
      for (int i = 0; i < 100; i++) {
          if (PlayTs(Data, Length) > 0)
             return;
-         fprintf(stderr, "-");//XXX just for testing - remove when stable
          cCondWait::SleepMs(10);
          }
      esyslog("ERROR: TS packet not accepted in Transfer Mode");
diff -ruN vdr-1.7.10/vdr.1 vdr-1.7.11/vdr.1
--- vdr-1.7.10/vdr.1	2009-10-18 16:09:03.000000000 +0200
+++ vdr-1.7.11/vdr.1	2010-01-02 13:08:40.000000000 +0100
@@ -8,7 +8,7 @@
 .\" License as specified in the file COPYING that comes with the
 .\" vdr distribution.
 .\"
-.\" $Id: vdr.1 2.3 2009/10/18 14:09:03 kls Exp $
+.\" $Id: vdr.1 2.4 2010/01/02 12:08:40 kls Exp $
 .\"
 .TH vdr 1 "10 Feb 2008" "1.6" "Video Disk Recorder"
 .SH NAME
@@ -54,6 +54,11 @@
 Use only the given DVB device (\fInum\fR = 0, 1, 2...).
 There may be several \fB\-D\fR options (by default all DVB devices will be used).
 .TP
+.BI \-\-edit= rec
+Edit the given recording.
+\fIrec\fR must be the full path name of an existing recording.
+The program will return immediately after editing the recording.
+.TP
 .BI \-E\  file ,\ \-\-epgfile= file
 Write the EPG data into the given \fIfile\fR
 (default is \fI/video/epg.data\fR).
@@ -61,6 +66,17 @@
 If \fIfile\fR is a directory, the file \fIepg.data\fR
 will be created in that directory.
 .TP
+.BI \-\-genindex= rec
+Generate the index file for the given recording.
+\fIrec\fR must be the full path name of an existing recording.
+The recording must be in TS format.
+If the recording already has an index file, it will be deleted
+before creating the new one.
+The program will return immediately after generating the index.
+Note that using this option while another instance of VDR is
+currently replaying the given recording, or if the recording
+has not been finished yet, may lead to unexpected results.
+.TP
 .BI \-g,\ \-\-grab= dir
 Write images from the SVDRP command GRAB into the
 given directory \fIdir\fR. \fIdir\fR must be the full path name of an
diff -ruN vdr-1.7.10/vdr.5 vdr-1.7.11/vdr.5
--- vdr-1.7.10/vdr.5	2009-10-18 16:09:07.000000000 +0200
+++ vdr-1.7.11/vdr.5	2010-01-03 14:37:07.000000000 +0100
@@ -8,7 +8,7 @@
 .\" License as specified in the file COPYING that comes with the
 .\" vdr distribution.
 .\"
-.\" $Id: vdr.5 2.7 2009/10/18 14:09:07 kls Exp $
+.\" $Id: vdr.5 2.11 2010/01/03 13:37:07 kls Exp $
 .\"
 .TH vdr 5 "10 Feb 2008" "1.6" "Video Disk Recorder Files"
 .SH NAME
@@ -45,7 +45,7 @@
 A \fBchannel definition\fR is a line with channel data, where the fields
 are separated by ':' characters. Example:
 
-\fBRTL Television,RTL:12188:h:S19.2E:27500:163:104:105:0:12003:1:1089:0\fR
+\fBRTL Television,RTL;RTL World:12187:hC34M2O0S0:S19.2E:27500:163=2:104=deu;106=deu:105:0:12003:1:1089:0\fR
 
 The line number of a channel definition (not counting group separators,
 and based on a possible previous '@...' parameter)
@@ -65,6 +65,10 @@
 
 \fBRTL Television,RTL:...\fR
 
+If the short name itself would contain a comma, it is replaced with a '.'.
+Note that some long channel names may contain a comma, so the delimiting comma
+is always the rightmost one.
+
 If present, the name of the service provider or "bouquet" is appended
 to the channel name, separated by a semicolon, as in
 
@@ -99,6 +103,47 @@
 \fBY\fR@hierarchY (0, 1, 2, 4)
 .TE
 
+\fBBandwidth:\fR The bandwidth of the channel in MHz (DVB-T only).
+
+\fBCode rate high priority:\fR Forward Error Correction (FEC) of the high priority stream (DVB-T).
+For DVB-S/DVB-S2 this parameter specifies the inner FEC scheme.
+12 = 1/2, 23 = 2/3, 34 = 3/4, ...
+
+\fBCode rate low priority:\fR Forward Error Correction (FEC) of the low priority stream (DVB-T only).
+If no hierarchy is used, set to 0.
+
+\fBGuard interval:\fR The guard interval value (DVB-T only): 4 = 1/4, 8 = 1/8, 16 = 1/16, 32 = 1/32.
+
+\fBInversion:\fR Specifes whether the DVB frontend needs spectral inversion (DVB-T and DVB-C only). This is frontend specific, if in doubt, omit.
+
+\fBModulation:\fR Specifies the modulation/constellation of the channel as follows:
+.TS
+tab (@);
+l l.
+\fB2\fR@QPSK (DVB-S, DVB-S2, DVB-T)
+\fB5\fR@8PSK (DVB-S2)
+\fB6\fR@16APSK (DVB-S2)
+\fB10\fR@VSB8 (ATSC aerial)
+\fB11\fR@VSB16 (ATSC aerial)
+\fB16\fR@QAM16 (DVB-T)
+\fB64\fR@QAM64 (DVB-C, DVB-T)
+\fB128\fR@QAM128 (DVB-C)
+\fB256\fR@QAM256 (DVB-C)
+.TE
+
+\fBRolloff:\fR The Nyquist filter rolloff factor for DVB-S (\fB35\fR) and DVB-S2 (\fB35\fR, 25, 20),
+35 = 0.35, 25 = 0.25, 20 = 0.20, DVB-S/DVB-S2 default value is 0.35
+
+\fBTransmission mode:\fR Number of DVB-T OFDM carriers, 8 = 8k, 2 = 2k. If in doubt, try 8k.
+
+\fBHierarchy:\fR If set to 1, this transponder uses two streams, high priority and low priority.
+If in doubt, try 0 (off). (DVB-T only).
+
+\fBDelivery System:\fR The satellite delivery system (0 = DVB-S, 1 = DVB-S2).
+
+\fBPolarization:\fR Satellite antenna polarization.
+h = horizontal, v = vertical, r = circular right, l = circular left.
+
 The polarization parameters have no integer numbers following them. This is for
 compatibility with files from older versions and also to keep the DVB-S entries
 as simple as possible.
@@ -107,8 +152,17 @@
 will automatically determine the proper value (if possible).
 
 An example of a parameter field for a DVB-T channel might look like this:
+\fBB8C23D12G8M16T8Y0\fR
+
+An example of a parameter field for a DVB-C channel might look like this:
+\fBC0M64\fR
+
+An example of a parameter field for a DVB-S channel might look like this:
+\fBhC56M2O35S0\fR
+
+An example of a parameter field for a DVB-S2 channel might look like this:
+\fBhC910M2O35S1\fR
 
-\fBB8C23D12M64T2G32Y0\fR
 .TP
 .B Source
 The signal source of this channel, as defined in the file \fIsources.conf\fR.
@@ -641,6 +695,8 @@
 \fBT\fR@<title>
 \fBS\fR@<short text>
 \fBD\fR@<description>
+\fBG\fR@<genre> <genre>...
+\fBR\fR@<parental rating>
 \fBX\fR@<stream> <type> <language> <descr>
 \fBV\fR@<vps time>
 \fBe\fR@
@@ -653,6 +709,7 @@
 \fBE\fR...\fBe\fR (Event) entries are allowed.
 All other tags are optional (although every event
 should at least have a \fBT\fR entry).
+
 There may be several \fBX\fR tags, depending on the number of tracks (video, audio etc.)
 the event provides.
 
@@ -669,6 +726,8 @@
 <title>        @is the title of the event
 <short text>   @is the short text of the event (typically the name of the episode etc.)
 <description>  @is the description of the event (any '|' characters will be interpreted as newlines)
+<genre>        @is a two digit hex code, as defined in  ETSI EN 300 468, table 28 (up to 4 genre codes are supported)
+<parental rating>@is the minimum age of the intended audience
 <stream>       @is the stream content (1 = video, 2 = audio, 3 = subtitles, 4 = AC3)
 <type>         @is the stream type according to ETSI EN 300 468
 <language>     @is the three letter language code (optionally two codes, separated by '+')
diff -ruN vdr-1.7.10/vdr.c vdr-1.7.11/vdr.c
--- vdr-1.7.10/vdr.c	2009-10-25 15:45:47.000000000 +0100
+++ vdr-1.7.11/vdr.c	2010-01-02 12:52:40.000000000 +0100
@@ -22,7 +22,7 @@
  *
  * The project's page is at http://www.tvdr.de
  *
- * $Id: vdr.c 2.12 2009/10/25 14:45:47 kls Exp $
+ * $Id: vdr.c 2.14 2010/01/02 11:52:40 kls Exp $
  */
 
 #include <getopt.h>
@@ -220,7 +220,9 @@
       { "config",   required_argument, NULL, 'c' },
       { "daemon",   no_argument,       NULL, 'd' },
       { "device",   required_argument, NULL, 'D' },
+      { "edit",     required_argument, NULL, 'e' | 0x100 },
       { "epgfile",  required_argument, NULL, 'E' },
+      { "genindex", required_argument, NULL, 'g' | 0x100 },
       { "grab",     required_argument, NULL, 'g' },
       { "help",     no_argument,       NULL, 'h' },
       { "instance", required_argument, NULL, 'i' },
@@ -242,11 +244,11 @@
       { "vfat",     no_argument,       NULL, 'v' | 0x100 },
       { "video",    required_argument, NULL, 'v' },
       { "watchdog", required_argument, NULL, 'w' },
-      { NULL }
+      { NULL,       no_argument,       NULL,  0  }
     };
 
   int c;
-  while ((c = getopt_long(argc, argv, "a:c:dD:E:g:hi:l:L:mp:P:r:s:t:u:v:Vw:", long_options, NULL)) != -1) {
+  while ((c = getopt_long(argc, argv, "a:c:dD:e:E:g:hi:l:L:mp:P:r:s:t:u:v:Vw:", long_options, NULL)) != -1) {
         switch (c) {
           case 'a': AudioCommand = optarg;
                     break;
@@ -263,8 +265,12 @@
                     fprintf(stderr, "vdr: invalid DVB device number: %s\n", optarg);
                     return 2;
                     break;
+          case 'e' | 0x100:
+                    return CutRecording(optarg) ? 0 : 2;
           case 'E': EpgDataFileName = (*optarg != '-' ? optarg : NULL);
                     break;
+          case 'g' | 0x100:
+                    return GenerateIndex(optarg) ? 0 : 2;
           case 'g': cSVDRP::SetGrabImageDir(*optarg != '-' ? optarg : NULL);
                     break;
           case 'h': DisplayHelp = true;
@@ -406,11 +412,13 @@
                "  -D NUM,   --device=NUM   use only the given DVB device (NUM = 0, 1, 2...)\n"
                "                           there may be several -D options (default: all DVB\n"
                "                           devices will be used)\n"
+               "            --edit=REC     cut recording REC and exit\n"
                "  -E FILE,  --epgfile=FILE write the EPG data into the given FILE (default is\n"
                "                           '%s' in the video directory)\n"
                "                           '-E-' disables this\n"
                "                           if FILE is a directory, the default EPG file will be\n"
                "                           created in that directory\n"
+               "            --genindex=REC generate index for recording REC and exit\n"
                "  -g DIR,   --grab=DIR     write images from the SVDRP command GRAB into the\n"
                "                           given DIR; DIR must be the full path name of an\n"
                "                           existing directory, without any \"..\", double '/'\n"
