summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS31
-rw-r--r--HISTORY79
-rw-r--r--Makefile4
-rw-r--r--PLUGINS/src/dvbsddevice/COPYING (renamed from PLUGINS/src/sky/COPYING)0
-rw-r--r--PLUGINS/src/dvbsddevice/HISTORY12
-rw-r--r--PLUGINS/src/dvbsddevice/Makefile (renamed from PLUGINS/src/sky/Makefile)43
-rw-r--r--PLUGINS/src/dvbsddevice/README20
-rw-r--r--PLUGINS/src/dvbsddevice/dvbsddevice.c35
-rw-r--r--PLUGINS/src/dvbsddevice/dvbsdffdevice.c799
-rw-r--r--PLUGINS/src/dvbsddevice/dvbsdffdevice.h107
-rw-r--r--PLUGINS/src/dvbsddevice/dvbsdffosd.c (renamed from dvbosd.c)36
-rw-r--r--PLUGINS/src/dvbsddevice/dvbsdffosd.h22
-rw-r--r--PLUGINS/src/hello/HISTORY6
-rw-r--r--PLUGINS/src/hello/hello.c6
-rw-r--r--PLUGINS/src/pictures/HISTORY4
-rw-r--r--PLUGINS/src/pictures/pictures.c6
-rw-r--r--PLUGINS/src/skincurses/HISTORY5
-rw-r--r--PLUGINS/src/skincurses/skincurses.c26
-rw-r--r--PLUGINS/src/sky/HISTORY70
-rw-r--r--PLUGINS/src/sky/README49
-rw-r--r--PLUGINS/src/sky/channels.conf.sky34
-rwxr-xr-xPLUGINS/src/sky/getskyepg.pl260
-rw-r--r--PLUGINS/src/sky/lircd.conf.sky299
-rw-r--r--PLUGINS/src/sky/sky.c303
-rw-r--r--Syd0
-rw-r--r--channels.c31
-rw-r--r--channels.h8
-rw-r--r--ci.c42
-rw-r--r--config.c4
-rw-r--r--config.h10
-rw-r--r--cutter.c30
-rw-r--r--cutter.h4
-rw-r--r--device.c14
-rw-r--r--device.h12
-rw-r--r--diseqc.c6
-rw-r--r--dvbdevice.c899
-rw-r--r--dvbdevice.h112
-rw-r--r--dvbosd.h23
-rw-r--r--dvbplayer.c6
-rw-r--r--dvbspu.c128
-rw-r--r--dvbspu.h8
-rw-r--r--dvbsubtitle.c15
-rw-r--r--eit.c51
-rw-r--r--eit.h5
-rw-r--r--epg.c193
-rw-r--r--epg.h27
-rw-r--r--font.c9
-rw-r--r--font.h7
-rw-r--r--libsi/si.c3
-rw-r--r--libsi/si.h4
-rw-r--r--menu.c13
-rw-r--r--menuitems.c7
-rwxr-xr-xnewplugin4
-rw-r--r--nit.c3
-rw-r--r--osd.c8
-rw-r--r--pat.c20
-rw-r--r--plugin.c10
-rw-r--r--po/ca_ES.po243
-rw-r--r--po/cs_CZ.po243
-rw-r--r--po/da_DK.po243
-rw-r--r--po/de_DE.po243
-rw-r--r--po/el_GR.po243
-rw-r--r--po/es_ES.po243
-rw-r--r--po/et_EE.po343
-rw-r--r--po/fi_FI.po243
-rw-r--r--po/fr_FR.po243
-rw-r--r--po/hr_HR.po243
-rw-r--r--po/hu_HU.po243
-rw-r--r--po/it_IT.po249
-rw-r--r--po/lt_LT.po243
-rw-r--r--po/nl_NL.po243
-rw-r--r--po/nn_NO.po243
-rw-r--r--po/pl_PL.po243
-rw-r--r--po/pt_PT.po243
-rw-r--r--po/ro_RO.po243
-rw-r--r--po/ru_RU.po243
-rw-r--r--po/sk_SK.po243
-rw-r--r--po/sl_SI.po243
-rw-r--r--po/sv_SE.po243
-rw-r--r--po/tr_TR.po243
-rw-r--r--po/uk_UA.po243
-rw-r--r--po/zh_CN.po243
-rw-r--r--receiver.c4
-rw-r--r--recorder.c4
-rw-r--r--recording.c66
-rw-r--r--recording.h10
-rw-r--r--remote.c8
-rw-r--r--remux.c40
-rw-r--r--remux.h35
-rw-r--r--sdt.c13
-rw-r--r--skinclassic.c30
-rw-r--r--skinsttng.c37
-rw-r--r--sources.conf5
-rw-r--r--svdrp.c11
-rw-r--r--tools.c9
-rw-r--r--tools.h17
-rw-r--r--transfer.c3
-rw-r--r--vdr.118
-rw-r--r--vdr.565
-rw-r--r--vdr.c14
100 files changed, 8342 insertions, 2200 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 2e0eab9..1c1da69 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -600,6 +600,9 @@ Helmut Auer <vdr@helmutauer.de>
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 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi>
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 @@ Andreas Regel <andreas.regel@gmx.de>
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 @@ Dick Streefland <Dick.Streefland@xs4all.nl>
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 @@ Udo Richter <udo_richter@gmx.de>
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 @@ Joachim Wilke <vdr@joachim-wilke.de>
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 @@ Anssi Hannula <anssi.hannula@gmail.com>
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 @@ Michael Nork <mnork0@gmx.net>
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 @@ Johann Friedrichs <johann.friedrichs@web.de>
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 @@ Derek Kelly (user.vdr@gmail.com)
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 @@ Milan Hrala <hrala.milan@gmail.com>
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 --git a/HISTORY b/HISTORY
index 70321b0..84430d5 100644
--- a/HISTORY
+++ b/HISTORY
@@ -6196,3 +6196,82 @@ Video Disk Recorder Revision History
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 --git a/Makefile b/Makefile
index 703b801..e13ea5e 100644
--- a/Makefile
+++ b/Makefile
@@ -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 @@ DOXYFILE = Doxyfile
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 --git a/PLUGINS/src/sky/COPYING b/PLUGINS/src/dvbsddevice/COPYING
index f90922e..f90922e 100644
--- a/PLUGINS/src/sky/COPYING
+++ b/PLUGINS/src/dvbsddevice/COPYING
diff --git a/PLUGINS/src/dvbsddevice/HISTORY b/PLUGINS/src/dvbsddevice/HISTORY
new file mode 100644
index 0000000..18cd625
--- /dev/null
+++ b/PLUGINS/src/dvbsddevice/HISTORY
@@ -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 --git a/PLUGINS/src/sky/Makefile b/PLUGINS/src/dvbsddevice/Makefile
index 87fbcba..8ef273c 100644
--- a/PLUGINS/src/sky/Makefile
+++ b/PLUGINS/src/dvbsddevice/Makefile
@@ -1,13 +1,15 @@
#
# Makefile for a Video Disk Recorder plugin
#
-# $Id: Makefile 2.0 2008/01/13 13:00:16 kls Exp $
+# $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 = sky
+PLUGIN = dvbsddevice
### The version number of this plugin (taken from the main source file):
@@ -43,28 +45,55 @@ 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
+OBJS = $(PLUGIN).o dvbsdffdevice.o dvbsdffosd.o
### The main target:
-all: libvdr-$(PLUGIN).so
+all: libvdr-$(PLUGIN).so i18n
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
-# Dependencies:
+### Dependencies:
-MAKEDEP = g++ -MM -MG
+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)
@@ -80,4 +109,4 @@ dist: clean
@echo Distribution package created as $(PACKAGE).tgz
clean:
- @-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
+ @-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot
diff --git a/PLUGINS/src/dvbsddevice/README b/PLUGINS/src/dvbsddevice/README
new file mode 100644
index 0000000..9b1280f
--- /dev/null
+++ b/PLUGINS/src/dvbsddevice/README
@@ -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 --git a/PLUGINS/src/dvbsddevice/dvbsddevice.c b/PLUGINS/src/dvbsddevice/dvbsddevice.c
new file mode 100644
index 0000000..e2248e9
--- /dev/null
+++ b/PLUGINS/src/dvbsddevice/dvbsddevice.c
@@ -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 --git a/PLUGINS/src/dvbsddevice/dvbsdffdevice.c b/PLUGINS/src/dvbsddevice/dvbsdffdevice.c
new file mode 100644
index 0000000..21a60a5
--- /dev/null
+++ b/PLUGINS/src/dvbsddevice/dvbsdffdevice.c
@@ -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 --git a/PLUGINS/src/dvbsddevice/dvbsdffdevice.h b/PLUGINS/src/dvbsddevice/dvbsdffdevice.h
new file mode 100644
index 0000000..b382bf6
--- /dev/null
+++ b/PLUGINS/src/dvbsddevice/dvbsdffdevice.h
@@ -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 --git a/dvbosd.c b/PLUGINS/src/dvbsddevice/dvbsdffosd.c
index ab34cbd..4ff8db9 100644
--- a/dvbosd.c
+++ b/PLUGINS/src/dvbsddevice/dvbsdffosd.c
@@ -1,26 +1,24 @@
/*
- * dvbosd.c: Implementation of the DVB On Screen Display
+ * dvbsdffosd.c: Implementation of the DVB SD Full Featured On Screen Display
*
- * See the main source file 'vdr.c' for copyright information and
- * how to reach the author.
+ * See the README file for copyright information and how to reach the author.
*
- * $Id: dvbosd.c 2.0 2007/09/16 08:55:54 kls Exp $
+ * $Id: dvbsdffosd.c 2.1 2009/12/29 11:52:48 kls Exp $
*/
-#include "dvbosd.h"
+#include "dvbsdffosd.h"
#include <linux/dvb/osd.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <sys/unistd.h>
-#include "dvbdevice.h"
-#include "tools.h"
+#include "vdr/tools.h"
-// --- cDvbOsd ---------------------------------------------------------------
+// --- 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 cDvbOsd : public cOsd {
+class cDvbSdFfOsd : public cOsd {
private:
int osdDev;
int osdMem;
@@ -29,14 +27,14 @@ private:
protected:
virtual void SetActive(bool On);
public:
- cDvbOsd(int Left, int Top, int OsdDev, uint Level);
- virtual ~cDvbOsd();
+ 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);
};
-cDvbOsd::cDvbOsd(int Left, int Top, int OsdDev, uint Level)
+cDvbSdFfOsd::cDvbSdFfOsd(int Left, int Top, int OsdDev, uint Level)
:cOsd(Left, Top, Level)
{
osdDev = OsdDev;
@@ -55,12 +53,12 @@ cDvbOsd::cDvbOsd(int Left, int Top, int OsdDev, uint Level)
}
}
-cDvbOsd::~cDvbOsd()
+cDvbSdFfOsd::~cDvbSdFfOsd()
{
SetActive(false);
}
-void cDvbOsd::SetActive(bool On)
+void cDvbSdFfOsd::SetActive(bool On)
{
if (On != Active()) {
cOsd::SetActive(On);
@@ -85,7 +83,7 @@ void cDvbOsd::SetActive(bool On)
}
}
-eOsdError cDvbOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
+eOsdError cDvbSdFfOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
{
eOsdError Result = cOsd::CanHandleAreas(Areas, NumAreas);
if (Result == oeOk) {
@@ -107,7 +105,7 @@ eOsdError cDvbOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
return Result;
}
-eOsdError cDvbOsd::SetAreas(const tArea *Areas, int NumAreas)
+eOsdError cDvbSdFfOsd::SetAreas(const tArea *Areas, int NumAreas)
{
if (shown) {
cBitmap *Bitmap;
@@ -120,7 +118,7 @@ eOsdError cDvbOsd::SetAreas(const tArea *Areas, int NumAreas)
return cOsd::SetAreas(Areas, NumAreas);
}
-void cDvbOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, const void *data)
+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;
@@ -135,7 +133,7 @@ void cDvbOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, co
}
}
-void cDvbOsd::Flush(void)
+void cDvbSdFfOsd::Flush(void)
{
if (!Active())
return;
@@ -211,5 +209,5 @@ cDvbOsdProvider::cDvbOsdProvider(int OsdDev)
cOsd *cDvbOsdProvider::CreateOsd(int Left, int Top, uint Level)
{
- return new cDvbOsd(Left, Top, osdDev, Level);
+ return new cDvbSdFfOsd(Left, Top, osdDev, Level);
}
diff --git a/PLUGINS/src/dvbsddevice/dvbsdffosd.h b/PLUGINS/src/dvbsddevice/dvbsdffosd.h
new file mode 100644
index 0000000..8a1bc62
--- /dev/null
+++ b/PLUGINS/src/dvbsddevice/dvbsdffosd.h
@@ -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 --git a/PLUGINS/src/hello/HISTORY b/PLUGINS/src/hello/HISTORY
index 14e78f6..9adeab9 100644
--- a/PLUGINS/src/hello/HISTORY
+++ b/PLUGINS/src/hello/HISTORY
@@ -63,6 +63,10 @@ VDR Plugin 'hello' Revision History
- 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 --git a/PLUGINS/src/hello/hello.c b/PLUGINS/src/hello/hello.c
index 86adee6..32a74e3 100644
--- a/PLUGINS/src/hello/hello.c
+++ b/PLUGINS/src/hello/hello.c
@@ -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 @@ bool cPluginHello::ProcessArgs(int argc, char *argv[])
static struct option long_options[] = {
{ "aaa", required_argument, NULL, 'a' },
{ "bbb", no_argument, NULL, 'b' },
- { NULL }
+ { NULL, no_argument, NULL, 0 }
};
int c;
diff --git a/PLUGINS/src/pictures/HISTORY b/PLUGINS/src/pictures/HISTORY
index 5f24a74..34da938 100644
--- a/PLUGINS/src/pictures/HISTORY
+++ b/PLUGINS/src/pictures/HISTORY
@@ -33,3 +33,7 @@ VDR Plugin 'pictures' Revision History
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 --git a/PLUGINS/src/pictures/pictures.c b/PLUGINS/src/pictures/pictures.c
index 9c4e515..9de6889 100644
--- a/PLUGINS/src/pictures/pictures.c
+++ b/PLUGINS/src/pictures/pictures.c
@@ -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 @@ bool cPluginPictures::ProcessArgs(int argc, char *argv[])
// 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 --git a/PLUGINS/src/skincurses/HISTORY b/PLUGINS/src/skincurses/HISTORY
index cf793cd..ca820f9 100644
--- a/PLUGINS/src/skincurses/HISTORY
+++ b/PLUGINS/src/skincurses/HISTORY
@@ -79,3 +79,8 @@ VDR Plugin 'skincurses' Revision History
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 --git a/PLUGINS/src/skincurses/skincurses.c b/PLUGINS/src/skincurses/skincurses.c
index 8a7a846..d8134f6 100644
--- a/PLUGINS/src/skincurses/skincurses.c
+++ b/PLUGINS/src/skincurses/skincurses.c
@@ -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 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
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 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
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 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
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 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
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 --git a/PLUGINS/src/sky/HISTORY b/PLUGINS/src/sky/HISTORY
deleted file mode 100644
index 25b8fc8..0000000
--- a/PLUGINS/src/sky/HISTORY
+++ /dev/null
@@ -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 --git a/PLUGINS/src/sky/README b/PLUGINS/src/sky/README
deleted file mode 100644
index 19d5d98..0000000
--- a/PLUGINS/src/sky/README
+++ /dev/null
@@ -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 --git a/PLUGINS/src/sky/channels.conf.sky b/PLUGINS/src/sky/channels.conf.sky
deleted file mode 100644
index 5f0b773..0000000
--- a/PLUGINS/src/sky/channels.conf.sky
+++ /dev/null
@@ -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 --git a/PLUGINS/src/sky/getskyepg.pl b/PLUGINS/src/sky/getskyepg.pl
deleted file mode 100755
index dfca96a..0000000
--- a/PLUGINS/src/sky/getskyepg.pl
+++ /dev/null
@@ -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 --git a/PLUGINS/src/sky/lircd.conf.sky b/PLUGINS/src/sky/lircd.conf.sky
deleted file mode 100644
index 191dcb5..0000000
--- a/PLUGINS/src/sky/lircd.conf.sky
+++ /dev/null
@@ -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 --git a/PLUGINS/src/sky/sky.c b/PLUGINS/src/sky/sky.c
deleted file mode 100644
index 75bd9ec..0000000
--- a/PLUGINS/src/sky/sky.c
+++ /dev/null
@@ -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 --git a/Syd b/Syd
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Syd
diff --git a/channels.c b/channels.c
index cca0eee..c14df19 100644
--- a/channels.c
+++ b/channels.c
@@ -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 @@ const tChannelParameterMap InversionValues[] = {
{ 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 @@ const tChannelParameterMap CoderateValues[] = {
{ 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 @@ const tChannelParameterMap ModulationValues[] = {
{ 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 @@ const tChannelParameterMap GuardValues[] = {
{ 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 @@ const tChannelParameterMap HierarchyValues[] = {
{ 2, HIERARCHY_2, "2" },
{ 4, HIERARCHY_4, "4" },
{ 999, HIERARCHY_AUTO, trNOOP("auto") },
- { -1 }
+ { -1, 0, NULL }
};
const tChannelParameterMap RollOffValues[] = {
@@ -101,7 +101,7 @@ const tChannelParameterMap RollOffValues[] = {
{ 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 @@ int cChannel::Transponder(int Frequency, char Polarization)
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 @@ void cChannel::SetLinkChannels(cLinkChannels *LinkChannels)
else
q += sprintf(q, " none");
if (Number())
- dsyslog(buffer);
+ dsyslog("%s", buffer);
}
void cChannel::SetRefChannel(cChannel *RefChannel)
@@ -726,6 +727,8 @@ cString cChannel::ToText(const cChannel *Channel)
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 @@ bool cChannel::Parse(const char *s)
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 @@ bool cChannel::Parse(const char *s)
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 @@ bool cChannel::Parse(const char *s)
*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 --git a/channels.h b/channels.h
index 634fa5a..b465f6a 100644
--- a/channels.h
+++ b/channels.h
@@ -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 @@ public:
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 --git a/ci.c b/ci.c
index 8db1853..6c7b031 100644
--- a/ci.c
+++ b/ci.c
@@ -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 @@ cCiCaPmt::cCiCaPmt(uint8_t CmdId, int Source, int Transponder, int ProgramNumber
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 @@ void cCiCaPmt::AddPid(int Pid, uint8_t StreamType)
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 @@ bool cCiTransportConnection::Process(cTPDU *TPDU)
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 @@ bool cCiTransportConnection::Process(cTPDU *TPDU)
state = stIDLE;
}
return true;
+ default:
+ esyslog("ERROR: unknown state: %d (%s)", state, __FUNCTION__);
}
return true;
}
@@ -1668,6 +1678,8 @@ void cCamSlot::Process(cTPDU *TPDU)
NewConnection();
resendPmt = caProgramList.Count() > 0;
break;
+ default:
+ esyslog("ERROR: unknown module status %d (%s)", ms, __FUNCTION__);
}
lastModuleStatus = ms;
}
diff --git a/config.c b/config.c
index df82baa..61de0f5 100644
--- a/config.c
+++ b/config.c
@@ -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 @@ const char *cCommand::Execute(const char *Parameters)
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 --git a/config.h b/config.h
index 6afe902..f0cc67b 100644
--- a/config.h
+++ b/config.h
@@ -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 --git a/cutter.c b/cutter.c
index e83c5ac..ff6b4ed 100644
--- a/cutter.c
+++ b/cutter.c
@@ -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 @@ bool cCutter::Ended(void)
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 --git a/cutter.h b/cutter.h
index e27ceb6..afc5e93 100644
--- a/cutter.h
+++ b/cutter.h
@@ -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 @@ public:
static bool Ended(void);
};
+bool CutRecording(const char *FileName);
+
#endif //__CUTTER_H
diff --git a/device.c b/device.c
index 3a60fe4..3228af2 100644
--- a/device.c
+++ b/device.c
@@ -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 @@ cDevice::cDevice(void)
:patPmtParser(true)
{
cardIndex = nextCardIndex++;
+ dsyslog("new device number %d", CardIndex() + 1);
SetDescription("receiver on device %d", CardIndex() + 1);
@@ -153,6 +154,10 @@ int cDevice::DeviceNumber(void) const
void cDevice::MakePrimaryDevice(bool On)
{
+ if (!On) {
+ DELETENULL(liveSubtitle);
+ DELETENULL(dvbSubtitleConverter);
+ }
}
bool cDevice::SetPrimaryDevice(int n)
@@ -371,6 +376,7 @@ void cDevice::SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat)
case vdfCenterCutOut:
spuDecoder->setScaleMode(cSpuDecoder::eSpuNormal);
break;
+ default: esyslog("ERROR: invalid value for VideoDisplayFormat '%d'", VideoDisplayFormat);
}
}
}
@@ -399,7 +405,7 @@ void cDevice::GetOsdSize(int &Width, int &Height, double &PixelAspect)
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 @@ bool cDevice::HasPid(int Pid) const
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 @@ bool cDevice::AddPid(int Pid, ePidType PidType)
}
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 @@ bool cDevice::SwitchChannel(const cChannel *Channel, bool LiveView)
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 --git a/device.h b/device.h
index 5698fde..897de2a 100644
--- a/device.h
+++ b/device.h
@@ -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 @@ protected:
///< 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 @@ protected:
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 @@ private:
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 --git a/diseqc.c b/diseqc.c
index 91f6d5f..2bf6f00 100644
--- a/diseqc.c
+++ b/diseqc.c
@@ -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 @@ bool cDiseqc::Parse(const char *s)
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 @@ char *cDiseqc::Codes(char *s)
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 --git a/dvbdevice.c b/dvbdevice.c
index dd425c8..07e2dbb 100644
--- a/dvbdevice.c
+++ b/dvbdevice.c
@@ -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 @@ private:
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 @@ cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, fe_delivery_system Frontend
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 @@ bool cDvbTuner::IsTunedTo(const cChannel *Channel) const
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 @@ bool cDvbTuner::SetFrontend(void)
#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 @@ bool cDvbTuner::SetFrontend(void)
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 @@ bool cDvbTuner::SetFrontend(void)
}
}
break;
+ default: esyslog("ERROR: unknown diseqc command %d", da);
}
}
diseqcCommands = diseqc->Commands();
@@ -279,7 +240,7 @@ bool cDvbTuner::SetFrontend(void)
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 @@ bool cDvbTuner::SetFrontend(void)
}
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 @@ void cDvbTuner::Action(void)
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 @@ void cDvbTuner::Action(void)
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 @@ void cDvbTuner::Action(void)
}
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 @@ void cDvbTuner::Action(void)
// --- cDvbDevice ------------------------------------------------------------
-int cDvbDevice::devVideoOffset = -1;
int cDvbDevice::setTransferModeForDolbyDigital = 1;
const char *DeliverySystems[] = {
@@ -415,30 +377,22 @@ const char *DeliverySystems[] = {
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 @@ cDvbDevice::cDvbDevice(int n)
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 @@ cDvbDevice::cDvbDevice(int n)
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 @@ cDvbDevice::cDvbDevice(int n)
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(int n)
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 @@ bool cDvbDevice::Ready(void)
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 @@ bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On)
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 @@ bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On)
}
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 @@ bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On)
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 @@ bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On)
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 @@ int cDvbDevice::OpenFilter(u_short Pid, u_char Tid, u_char Mask)
}
}
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 @@ void cDvbDevice::CloseFilter(int Handle)
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 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
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 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
}
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::IsTunedToTransponder(const cChannel *Channel)
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 @@ bool cDvbDevice::HasLock(int TimeoutMs)
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 @@ bool cDvbDevice::GetTSPacket(uchar *&Data)
}
return false;
}
+
+// --- cDvbDeviceProbe -------------------------------------------------------
+
+cList<cDvbDeviceProbe> DvbDeviceProbes;
+
+cDvbDeviceProbe::cDvbDeviceProbe(void)
+{
+ DvbDeviceProbes.Add(this);
+}
+
+cDvbDeviceProbe::~cDvbDeviceProbe()
+{
+ DvbDeviceProbes.Del(this, false);
+}
diff --git a/dvbdevice.h b/dvbdevice.h
index 3e35d91..b6cc950 100644
--- a/dvbdevice.h
+++ b/dvbdevice.h
@@ -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 @@ public:
// PID handle facilities
-private:
- bool SetAudioBypass(bool On);
protected:
virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
@@ -94,67 +97,18 @@ protected:
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 @@ protected:
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 --git a/dvbosd.h b/dvbosd.h
deleted file mode 100644
index 3eb56f0..0000000
--- a/dvbosd.h
+++ /dev/null
@@ -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 --git a/dvbplayer.c b/dvbplayer.c
index 9f96462..d02884b 100644
--- a/dvbplayer.c
+++ b/dvbplayer.c
@@ -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 @@ void cDvbPlayer::Action(void)
cPoller Poller;
DevicePoll(Poller, 10);
Sleep = false;
+ if (playMode == pmStill || playMode==pmPause)
+ cCondWait::SleepMs(3);
}
{
LOCK_THREAD;
@@ -666,6 +668,7 @@ void cDvbPlayer::Forward(void)
trickSpeed = NORMAL_SPEED;
TrickSpeed(Setup.MultiSpeedMode ? -1 : -MAX_SPEEDS);
break;
+ default: esyslog("ERROR: unknown playMode %d (%s)", playMode, __FUNCTION__);
}
}
}
@@ -717,6 +720,7 @@ void cDvbPlayer::Backward(void)
TrickSpeed(Setup.MultiSpeedMode ? -1 : -MAX_SPEEDS);
}
break;
+ default: esyslog("ERROR: unknown playMode %d (%s)", playMode, __FUNCTION__);
}
}
}
diff --git a/dvbspu.c b/dvbspu.c
index 76ed405..488bd89 100644
--- a/dvbspu.c
+++ b/dvbspu.c
@@ -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 @@ bool cDvbSpuBitmap::getMinSize(const aDvbSpuPalDescr paldescr,
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 @@ sDvbSpuRect cDvbSpuDecoder::CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDv
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 @@ void cDvbSpuDecoder::Draw(void)
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);
- 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)
+ 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);
+
+#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 @@ int cDvbSpuDecoder::setTime(uint32_t pts)
}
}
if (fodd != 0 && feven != 0) {
+ Hide();
delete spubmp;
spubmp = new cDvbSpuBitmap(size, spu + fodd, spu + feven,
spu + feven, spu + cmdOffs());
diff --git a/dvbspu.h b/dvbspu.h
index 685681b..9e33e45 100644
--- a/dvbspu.h
+++ b/dvbspu.h
@@ -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 @@ class cDvbSpuBitmap {
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 @@ class cDvbSpuDecoder:public cSpuDecoder {
uint32_t spupts;
bool clean;
bool ready;
+ bool restricted_osd;
enum spFlag { spNONE, spHIDE, spSHOW, spMENU };
spFlag state;
@@ -129,6 +131,7 @@ class cDvbSpuDecoder:public cSpuDecoder {
};
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::yuv2rgb(uint32_t yuv_color)
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 --git a/dvbsubtitle.c b/dvbsubtitle.c
index cd77fde..221523f 100644
--- a/dvbsubtitle.c
+++ b/dvbsubtitle.c
@@ -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 @@ void cSubtitleObject::DecodeSubBlock(const uchar *Data, int Length, bool Even)
;
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 @@ bool cSubtitleObject::Decode2BppCodeString(const uchar *Data, int &Index, int &x
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 @@ bool cSubtitleObject::Decode2BppCodeString(const uchar *Data, int &Index, int &x
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 @@ bool cSubtitleObject::Decode4BppCodeString(const uchar *Data, int &Index, int &x
rl = (Get4Bits(Data, Index) << 4) + Get4Bits(Data, Index) + 25;
color = Get4Bits(Data, Index);
break;
+ default: ;
}
}
else {
@@ -516,6 +519,7 @@ void cDvbSubtitlePage::SetState(int State)
break;
case 3: // reserved
break;
+ default: dbgpages("unknown page state (%s %d)\n", __FUNCTION__, __LINE__);
}
}
@@ -900,6 +904,7 @@ int cDvbSubtitleConverter::ExtractSegment(const uchar *Data, int Length, int64_t
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 --git a/eit.c b/eit.c
index 486784b..72d05cb 100644
--- a/eit.c
+++ b/eit.c
@@ -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 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
}
}
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 @@ cTDT::cTDT(const u_char *Data)
// --- 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 @@ cEitFilter::cEitFilter(void)
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 @@ void cEitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
cTDT TDT(Data);
}
break;
+ default: ;
}
}
diff --git a/eit.h b/eit.h
index ae3f9d1..b552372 100644
--- a/eit.h
+++ b/eit.h
@@ -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 --git a/epg.c b/epg.c
index 0c52a0c..e1cfe18 100644
--- a/epg.c
+++ b/epg.c
@@ -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 @@ cEvent::cEvent(tEventID EventID)
shortText = NULL;
description = NULL;
components = NULL;
+ memset(contents, 0, sizeof(contents));
+ parentalRating = 0;
startTime = 0;
duration = 0;
vps = 0;
@@ -186,6 +188,17 @@ void cEvent::SetComponents(cComponents *Components)
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 @@ bool cEvent::IsRunning(bool OrAboutToStart) const
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 @@ void cEvent::Dump(FILE *f, const char *Prefix, bool InfoOnly) const
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 @@ bool cEvent::Parse(char *s)
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 @@ void cEvent::FixEpgBugs(void)
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 @@ void cEvent::FixEpgBugs(void)
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 @@ void cSchedule::Dump(FILE *f, const char *Prefix, eDumpMode DumpMode, time_t AtT
p->Dump(f, Prefix);
}
break;
+ default: esyslog("ERROR: unknown DumpMode %d (%s %d)", DumpMode, __FUNCTION__, __LINE__);
}
fprintf(f, "%sc\n", Prefix);
}
diff --git a/epg.h b/epg.h
index 9acfa82..fbc9e06 100644
--- a/epg.h
+++ b/epg.h
@@ -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 @@ typedef u_int32_t tEventID;
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 @@ public:
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 @@ public:
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 @@ public:
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 --git a/font.c b/font.c
index 3fa97df..515017b 100644
--- a/font.c
+++ b/font.c
@@ -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 @@ void cGlyph::SetKerningCache(uint PrevSym, int Kerning)
class cFreetypeFont : public cFont {
private:
+ cString fontName;
+ int size;
int height;
int bottom;
FT_Library library; ///< Handle to library
@@ -105,6 +107,8 @@ private:
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 @@ public:
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 @@ const cFont *cFont::GetFont(eDvbFont Font)
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 --git a/font.h b/font.h
index eadf88c..449b429 100644
--- a/font.h
+++ b/font.h
@@ -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 @@ private:
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 --git a/libsi/si.c b/libsi/si.c
index bf00041..01ab9bf 100644
--- a/libsi/si.c
+++ b/libsi/si.c
@@ -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 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain,
break;
}
break;
+ default: ; // unknown domain, nothing to do
}
d->setData(da);
return d;
diff --git a/libsi/si.h b/libsi/si.h
index 9d47d30..b28b14a 100644
--- a/libsi/si.h
+++ b/libsi/si.h
@@ -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 @@ public:
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 --git a/menu.c b/menu.c
index 05793e8..b0077a0 100644
--- a/menu.c
+++ b/menu.c
@@ -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 @@ eOSState cMenuSchedule::Number(void)
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 @@ void cMenuRecordings::SetHelpKeys(void)
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 @@ eOSState cMenuSetupOSD::ProcessKey(eKeys Key)
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 @@ static void SetTrackDescriptions(int LiveChannel)
break;
case 4: cDevice::PrimaryDevice()->SetAvailableTrack(ttDolby, indexDolby++, 0, LiveChannel ? NULL : p->language, p->description);
break;
+ default: ;
}
}
}
diff --git a/menuitems.c b/menuitems.c
index df14b10..05521ad 100644
--- a/menuitems.c
+++ b/menuitems.c
@@ -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 @@ eOSState cMenuEditPrcItem::ProcessKey(eKeys Key)
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 @@ eOSState cMenuEditStrItem::ProcessKey(eKeys Key)
return ProcessKey(kYellow);
}
break;
+ default: ;
}
}
}
@@ -675,6 +676,7 @@ eOSState cMenuEditStrItem::ProcessKey(eKeys Key)
case kfEnd: pos = lengthUtf8 - 1; break;
case kfIns: return ProcessKey(kGreen);
case kfDel: return ProcessKey(kYellow);
+ default: ;
}
}
}
@@ -975,6 +977,7 @@ eOSState cMenuEditTimeItem::ProcessKey(eKeys Key)
pos++;
}
break;
+ default: ;
}
}
else if (NORMALKEY(Key) == kLeft) { // TODO might want to increase the delta if repeated quickly?
diff --git a/newplugin b/newplugin
index 22e2b72..52ef72e 100755
--- a/newplugin
+++ b/newplugin
@@ -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 @@ 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
diff --git a/nit.c b/nit.c
index 2ec8960..3864040 100644
--- a/nit.c
+++ b/nit.c
@@ -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 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
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 --git a/osd.c b/osd.c
index d16dafb..5529f12 100644
--- a/osd.c
+++ b/osd.c
@@ -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 @@ void cPalette::Take(const cPalette &Palette, tIndexes *Indexes, tColor ColorFg,
switch (i) {
case 0: Color = ColorBg; break;
case 1: Color = ColorFg; break;
+ default: ;
}
}
int n = Index(Color);
@@ -532,6 +533,7 @@ void cBitmap::DrawEllipse(int x1, int y1, int x2, int y2, tColor Color, int Quad
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 @@ void cBitmap::DrawEllipse(int x1, int y1, int x2, int y2, tColor Color, int Quad
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 @@ void cBitmap::DrawEllipse(int x1, int y1, int x2, int y2, tColor Color, int Quad
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 @@ void cOsdProvider::UpdateOsdSize(bool Force)
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 --git a/pat.c b/pat.c
index cc96cd9..9b3ded6 100644
--- a/pat.c
+++ b/pat.c
@@ -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 @@ void cCaDescriptors::AddCaDescriptor(SI::CaDescriptor *d, int EsPid)
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 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
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 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
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 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
}
NumApids++;
}
+ ProcessCaDescriptors = true;
}
break;
case 5: // STREAMTYPE_13818_PRIVATE
@@ -398,6 +401,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
switch (d->getDescriptorTag()) {
case SI::AC3DescriptorTag:
dpid = esPid;
+ ProcessCaDescriptors = true;
break;
case SI::SubtitlingDescriptorTag:
if (NumSpids < MAXSPIDS) {
@@ -443,12 +447,14 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
}
}
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 --git a/plugin.c b/plugin.c
index 240d4b4..97b4436 100644
--- a/plugin.c
+++ b/plugin.c
@@ -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 @@ cDll::~cDll()
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 @@ bool cDll::Load(bool Log)
if (!q)
q = p;
switch (*p) {
- case '\\': strcpy(p, p + 1);
+ case '\\': memmove(p, p + 1, strlen(p));
if (*p)
p++;
else {
diff --git a/po/ca_ES.po b/po/ca_ES.po
index 8915752..14f3c21 100644
--- a/po/ca_ES.po
+++ b/po/ca_ES.po
@@ -10,7 +10,7 @@ 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: 2008-03-02 19:02+0100\n"
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
"Language-Team: Catalanian\n"
@@ -42,6 +42,247 @@ msgstr "No puc iniciar el mode de transferència!"
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 --git a/po/cs_CZ.po b/po/cs_CZ.po
index b32c293..6394008 100644
--- a/po/cs_CZ.po
+++ b/po/cs_CZ.po
@@ -8,7 +8,7 @@ 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: 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 @@ msgstr "Nelze zaèít s pøenosem"
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 --git a/po/da_DK.po b/po/da_DK.po
index 5bcf776..faa3632 100644
--- a/po/da_DK.po
+++ b/po/da_DK.po
@@ -7,7 +7,7 @@ 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: Mogens Elneff <mogens@elneff.dk>\n"
"Language-Team: Danish\n"
@@ -39,6 +39,247 @@ msgstr "Kan ikke starte Transfer Mode!"
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 --git a/po/de_DE.po b/po/de_DE.po
index c6c875d..ff25a33 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -7,7 +7,7 @@ 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-11-25 15:19+0200\n"
"Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n"
"Language-Team: German\n"
@@ -39,6 +39,247 @@ msgstr "Transfer-Mode kann nicht gestartet werden!"
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 --git a/po/el_GR.po b/po/el_GR.po
index c89b689..2c310ab 100644
--- a/po/el_GR.po
+++ b/po/el_GR.po
@@ -7,7 +7,7 @@ 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: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
"Language-Team: Greek\n"
@@ -39,6 +39,247 @@ msgstr "Áäõíáìßá åêêßíçóçò êáôÜóôáóçò ìåôáöïñÜò!"
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 --git a/po/es_ES.po b/po/es_ES.po
index 6cc9cee..6cb029c 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
@@ -8,7 +8,7 @@ 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: 2008-03-02 19:02+0100\n"
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
"Language-Team: Spanish\n"
@@ -40,6 +40,247 @@ msgstr "¡No se puede iniciar el modo de transferencia!"
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 --git a/po/et_EE.po b/po/et_EE.po
index 2823c74..f8a0f60 100644
--- a/po/et_EE.po
+++ b/po/et_EE.po
@@ -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 @@ msgid "off"
msgstr "väljas"
msgid "on"
-msgstr ""
+msgstr "sees"
msgid "auto"
msgstr "automaatne"
@@ -34,11 +34,252 @@ msgid "Channel not available!"
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 @@ msgid "Polarization"
msgstr "Polarisatsioon"
msgid "System"
-msgstr ""
+msgstr "Süsteem"
msgid "Srate"
msgstr "Srate"
@@ -316,7 +557,7 @@ msgid "Hierarchy"
msgstr "Hierarhia"
msgid "Rolloff"
-msgstr ""
+msgstr "Rolloff"
msgid "Channel settings are not unique!"
msgstr "Kanaliseaded ei ole unikaalsed!"
@@ -325,16 +566,16 @@ msgid "Channels"
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 @@ msgid "Delete channel?"
msgstr "Kustutada kanal?"
msgid "Edit timer"
-msgstr "Taimeri muutmine"
+msgstr "Taimeri redigeerimine"
msgid "Active"
msgstr "Aktiivne"
@@ -397,10 +638,10 @@ msgid "Button$Timer"
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 @@ msgstr "Kõik saated - kõik kanalid"
#, 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 @@ msgid "Recordings"
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 @@ msgid "Setup.OSD$Height (%)"
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 @@ msgid "top"
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 @@ msgid "EPG"
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 @@ msgid "PIDs only"
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 @@ msgid "Button$Menu"
msgstr "Menüü"
msgid "Button$Reset"
-msgstr "Nullimine"
+msgstr "Reset"
msgid "Opening CAM menu..."
msgstr "CAM-menüü avamine..."
@@ -702,16 +943,16 @@ msgid "CAM is in use - really reset?"
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 @@ msgid "Setup.Recording$Default lifetime (d)"
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 @@ msgid "Setup.Recording$Pause lifetime (d)"
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 @@ msgid "Setup.Recording$VPS margin (s)"
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 @@ msgid "Miscellaneous"
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 @@ msgid "Setup.Miscellaneous$Initial channel"
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 @@ msgid "Button$Stop"
msgstr "Stopp"
msgid "Button$Resume"
-msgstr "Jätka"
+msgstr "Jätkata"
#. TRANSLATORS: note the leading blank!
msgid " Cancel editing"
@@ -855,7 +1096,7 @@ msgid "Stop recording?"
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 @@ msgid "No free DVB device to record!"
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 @@ msgid "No editing marks defined!"
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 @@ msgid "Low disk space!"
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 @@ msgid "Volume "
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 @@ msgid "Upcoming recording!"
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 @@ msgid "Switching primary DVB..."
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 --git a/po/fi_FI.po b/po/fi_FI.po
index 9718e53..410bd67 100644
--- a/po/fi_FI.po
+++ b/po/fi_FI.po
@@ -10,7 +10,7 @@ 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-15 15:52+0200\n"
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
"Language-Team: Finnish\n"
@@ -42,6 +42,247 @@ msgstr "Siirtotilan aloitus epäonnistui!"
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 --git a/po/fr_FR.po b/po/fr_FR.po
index 8f6778a..9f2768a 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -13,7 +13,7 @@ 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: 2008-02-27 18:14+0100\n"
"Last-Translator: Jean-Claude Repetto <jc@repetto.org>\n"
"Language-Team: French\n"
@@ -45,6 +45,247 @@ msgstr "Impossible d'utiliser le mode transfert !"
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 --git a/po/hr_HR.po b/po/hr_HR.po
index 32976b8..7d923af 100644
--- a/po/hr_HR.po
+++ b/po/hr_HR.po
@@ -9,7 +9,7 @@ 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: 2008-03-17 19:00+0100\n"
"Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
"Language-Team: Croatian\n"
@@ -41,6 +41,247 @@ msgstr "Nemoguæe zapoèeti Prijenos!!"
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 --git a/po/hu_HU.po b/po/hu_HU.po
index e3d2b70..1517920 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -10,7 +10,7 @@ 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-12-01 21:42+0200\n"
"Last-Translator: István Füley <ifuley@tigercomp.ro>\n"
"Language-Team: Hungarian\n"
@@ -42,6 +42,247 @@ msgstr "Transfer-Mode nem indítható!"
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 --git a/po/it_IT.po b/po/it_IT.po
index 9032a7c..1a403ad 100644
--- a/po/it_IT.po
+++ b/po/it_IT.po
@@ -11,8 +11,8 @@ 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"
-"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 @@ msgstr "Impossibile avviare mod. trasferimento!"
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 @@ msgid "Low disk space!"
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 --git a/po/lt_LT.po b/po/lt_LT.po
index c50a74b..dd36754 100644
--- a/po/lt_LT.po
+++ b/po/lt_LT.po
@@ -7,7 +7,7 @@ msgid ""
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 @@ msgstr "Negali pradÄ—ti perdavimo"
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 --git a/po/nl_NL.po b/po/nl_NL.po
index 99a8f45..3634438 100644
--- a/po/nl_NL.po
+++ b/po/nl_NL.po
@@ -11,7 +11,7 @@ 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: 2008-02-26 17:20+0100\n"
"Last-Translator: Johan Schuring <johan.schuring@vetteblei.nl>\n"
"Language-Team: Dutch\n"
@@ -43,6 +43,247 @@ msgstr "Kan Transfer-Mode niet starten"
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 --git a/po/nn_NO.po b/po/nn_NO.po
index 070e974..56975a5 100644
--- a/po/nn_NO.po
+++ b/po/nn_NO.po
@@ -8,7 +8,7 @@ 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: Truls Slevigen <truls@slevigen.no>\n"
"Language-Team: Norwegian\n"
@@ -40,6 +40,247 @@ msgstr "Kan ikke starte transfer modus!"
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 --git a/po/pl_PL.po b/po/pl_PL.po
index daca48f..0143db8 100644
--- a/po/pl_PL.po
+++ b/po/pl_PL.po
@@ -8,7 +8,7 @@ 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: 2008-03-09 12:59+0100\n"
"Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
"Language-Team: Polish\n"
@@ -40,6 +40,247 @@ msgstr "Nie mo¿na uruchomiæ trybu transferu!"
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 --git a/po/pt_PT.po b/po/pt_PT.po
index cee93d7..e863f8c 100644
--- a/po/pt_PT.po
+++ b/po/pt_PT.po
@@ -7,7 +7,7 @@ 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: 2008-03-18 17:04+0100\n"
"Last-Translator: anonymous\n"
"Language-Team: Portuguese\n"
@@ -39,6 +39,247 @@ msgstr "Impossível iniciar modo de transferência!"
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 --git a/po/ro_RO.po b/po/ro_RO.po
index 6059aa5..79a2690 100644
--- a/po/ro_RO.po
+++ b/po/ro_RO.po
@@ -8,7 +8,7 @@ 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: 2008-02-25 00:39+0100\n"
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
"Language-Team: Romanian\n"
@@ -42,6 +42,247 @@ msgstr "Nu pot porni modul de transfer!"
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 --git a/po/ru_RU.po b/po/ru_RU.po
index 3de7043..eb71a20 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -8,7 +8,7 @@ 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: 2008-12-15 14:37+0100\n"
"Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n"
"Language-Team: Russian\n"
@@ -40,6 +40,247 @@ msgstr "½ÕÒÞ×ÜÞÖÝÞ ÒÚÛîçØâì àÕÖØÜ ßàÞßãáÚÐ!"
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 --git a/po/sk_SK.po b/po/sk_SK.po
index 8471140..5068882 100644
--- a/po/sk_SK.po
+++ b/po/sk_SK.po
@@ -8,7 +8,7 @@ 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: 2009-09-30 12:50+0100\n"
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
"Language-Team: Slovak\n"
@@ -40,6 +40,247 @@ msgstr "Nemô¾e spusti» prenos!"
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 --git a/po/sl_SI.po b/po/sl_SI.po
index 4f89ff7..7b3b05f 100644
--- a/po/sl_SI.po
+++ b/po/sl_SI.po
@@ -8,7 +8,7 @@ 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: 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 @@ msgstr "Ne morem zaèeti s prenosnim naèinom!"
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 --git a/po/sv_SE.po b/po/sv_SE.po
index d368bb6..17a1da6 100644
--- a/po/sv_SE.po
+++ b/po/sv_SE.po
@@ -10,7 +10,7 @@ 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: 2008-03-12 18:25+0100\n"
"Last-Translator: Magnus Andersson <svankan@bahnhof.se>\n"
"Language-Team: Swedish\n"
@@ -42,6 +42,247 @@ msgstr "Kan inte starta Transfer Mode!"
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 --git a/po/tr_TR.po b/po/tr_TR.po
index 39138d5..e921986 100644
--- a/po/tr_TR.po
+++ b/po/tr_TR.po
@@ -7,7 +7,7 @@ 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: 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 @@ msgstr "Transfer modu baþlatýlamýyor!"
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 --git a/po/uk_UA.po b/po/uk_UA.po
index 6c2f58a..17c8371 100644
--- a/po/uk_UA.po
+++ b/po/uk_UA.po
@@ -7,7 +7,7 @@ msgid ""
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 @@ msgstr "Ðеможливо включити режим пропуÑку!"
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 --git a/po/zh_CN.po b/po/zh_CN.po
index 03bddab..1f6eaac 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -7,7 +7,7 @@ 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: 2009-09-23 23:50+0800\n"
"Last-Translator: Nan Feng <nfgx@21cn.com>\n"
"Language-Team: Chinese\n"
@@ -42,6 +42,247 @@ msgstr "ä¸èƒ½å¯åŠ¨ä¼ é€æ¨¡å¼"
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 --git a/receiver.c b/receiver.c
index f4c0a78..08346e4 100644
--- a/receiver.c
+++ b/receiver.c
@@ -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 @@ cReceiver::~cReceiver()
{
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 --git a/recorder.c b/recorder.c
index 145d020..7d01b07 100644
--- a/recorder.c
+++ b/recorder.c
@@ -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 @@ void cRecorder::Action(void)
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 --git a/recording.c b/recording.c
index ab94c32..41ad47a 100644
--- a/recording.c
+++ b/recording.c
@@ -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 @@ int cResumeFile::Read(void)
switch (*s) {
case 'I': resume = atoi(t);
break;
+ default: ;
}
}
fclose(f);
@@ -443,8 +444,8 @@ bool cRecordingInfo::Read(FILE *f)
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 @@ char *ExchangeChars(char *s, bool ToFileSystem)
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 @@ char *ExchangeChars(char *s, bool ToFileSystem)
case '\x01': *p = '\''; break;
case '\x02': *p = '/'; break;
case '\x03': *p = ':'; break;
+ default: ;
}
}
}
@@ -672,7 +674,9 @@ cRecording::cRecording(const char *FileName)
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 @@ void cIndexFileGenerator::Action(void)
// 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 @@ cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording)
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 @@ void cIndexFile::ConvertToPes(tIndexTs *IndexTs, int Count)
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 @@ bool cIndexFile::CatchUp(int Index)
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 @@ bool cIndexFile::Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *I
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 @@ int cIndexFile::GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber, off
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 @@ void cIndexFile::Delete(void)
}
}
+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 @@ cUnbufferedFile *cFileName::SetOffset(int Number, off_t Offset)
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 --git a/recording.h b/recording.h
index bc3479f..663d66d 100644
--- a/recording.h
+++ b/recording.h
@@ -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 @@ public:
class cFileName {
private:
cUnbufferedFile *file;
- int fileNumber;
+ uint16_t fileNumber;
char *fileName, *pFileNumber;
bool record;
bool blocking;
@@ -262,11 +262,11 @@ public:
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 @@ char *ExchangeChars(char *s, bool ToFileSystem);
// 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 --git a/remote.c b/remote.c
index 37a6bbd..82d5f00 100644
--- a/remote.c
+++ b/remote.c
@@ -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 @@ int cKbdRemote::MapCodeToFunc(uint64_t Code)
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 @@ uint64_t cKbdRemote::ReadKeySequence(void)
k |= key1 & 0xFF;
} while (key1 != 0x7E);
break;
+ default: ;
}
}
break;
+ default: ;
}
}
}
diff --git a/remux.c b/remux.c
index c5055b6..6d00692 100644
--- a/remux.c
+++ b/remux.c
@@ -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 @@ void cPatPmtGenerator::GeneratePmt(cChannel *Channel)
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 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
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 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
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 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
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 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
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 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
}
}
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 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
}
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 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
pmtSize = 0;
}
-bool cPatPmtParser::GetVersions(int &PatVersion, int &PmtVersion)
+bool cPatPmtParser::GetVersions(int &PatVersion, int &PmtVersion) const
{
PatVersion = patVersion;
PmtVersion = pmtVersion;
diff --git a/remux.h b/remux.h
index ad099c6..39d6e09 100644
--- a/remux.h
+++ b/remux.h
@@ -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 @@ private:
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 @@ public:
///< 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 --git a/sdt.c b/sdt.c
index 0b11bb7..1ed9b32 100644
--- a/sdt.c
+++ b/sdt.c
@@ -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 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
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 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
patFilter->Trigger();
}
}
+ default: ;
}
}
break;
diff --git a/skinclassic.c b/skinclassic.c
index a73e97c..7b45b1b 100644
--- a/skinclassic.c
+++ b/skinclassic.c
@@ -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 @@ void cSkinClassicDisplayMenu::SetEvent(const cEvent *Event)
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 @@ void cSkinClassicDisplayMenu::SetEvent(const cEvent *Event)
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 @@ void cSkinClassicDisplayMenu::SetRecording(const cRecording *Recording)
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 @@ void cSkinClassicDisplayMenu::SetRecording(const cRecording *Recording)
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 --git a/skinsttng.c b/skinsttng.c
index 5513c91..5551091 100644
--- a/skinsttng.c
+++ b/skinsttng.c
@@ -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 @@ void cSkinSTTNGDisplayMenu::SetEvent(const cEvent *Event)
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 @@ void cSkinSTTNGDisplayMenu::SetEvent(const cEvent *Event)
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 @@ void cSkinSTTNGDisplayMenu::SetRecording(const cRecording *Recording)
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 @@ void cSkinSTTNGDisplayMenu::SetRecording(const cRecording *Recording)
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 @@ void cSkinSTTNGDisplayTracks::SetAudioChannel(int AudioChannel)
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 --git a/sources.conf b/sources.conf
index c9b385c..90f4a1c 100644
--- a/sources.conf
+++ b/sources.conf
@@ -174,12 +174,13 @@ S110W DirecTV 5 & Echostar 8/10
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 --git a/svdrp.c b/svdrp.c
index 5729052..b181fcd 100644
--- a/svdrp.c
+++ b/svdrp.c
@@ -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 @@ bool cPUTEhandler::Process(const char *s)
// --- 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 @@ const char *HelpPages[] = {
" 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 @@ void cSVDRP::CmdCLRE(const char *Option)
}
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 @@ void cSVDRP::CmdCLRE(const char *Option)
}
else {
cSchedules::ClearAll();
+ cEitFilter::SetDisableUntil(time(NULL) + EITDISABLETIME);
Reply(250, "EPG data cleared");
}
}
diff --git a/tools.c b/tools.c
index fae8763..39c17e2 100644
--- a/tools.c
+++ b/tools.c
@@ -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 @@ uint Utf8CharGet(const char *s, int Length)
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 @@ char *cCharSetConv::systemCharacterTable = NULL;
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 @@ cString WeekDayNameFull(int WeekDay)
case 4: return tr("Friday");
case 5: return tr("Saturday");
case 6: return tr("Sunday");
+ default: return "???";
}
- return "???";
}
cString WeekDayNameFull(time_t t)
diff --git a/tools.h b/tools.h
index 22b7e99..95c35ff 100644
--- a/tools.h
+++ b/tools.h
@@ -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 @@ void syslog_with_tid(int priority, const char *format, ...) __attribute__ ((form
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 @@ template<class T> inline void put_unaligned(unsigned int v, T* p)
((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 @@ private:
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 --git a/transfer.c b/transfer.c
index a2ec9b4..02ef042 100644
--- a/transfer.c
+++ b/transfer.c
@@ -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 @@ void cTransfer::Receive(uchar *Data, int Length)
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 --git a/vdr.1 b/vdr.1
index 97780dd..9bd1f0e 100644
--- a/vdr.1
+++ b/vdr.1
@@ -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 @@ Run in daemon mode (implies \-\-no\-kbd).
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 @@ Use \fB\-E\-\fR to disable this.
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 --git a/vdr.5 b/vdr.5
index e1023af..875a7de 100644
--- a/vdr.5
+++ b/vdr.5
@@ -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 @@ Such a delimiter will not appear in the Channels menu.
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 @@ as in
\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 @@ l l.
\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 @@ The special value \fB999\fR is used for "automatic", which means the driver
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 @@ l l.
\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 @@ of one or more \fBC\fR...\fBc\fR (Channel) entries. Inside these any number of
\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 @@ l l.
<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 --git a/vdr.c b/vdr.c
index f03409a..e1bfc16 100644
--- a/vdr.c
+++ b/vdr.c
@@ -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 @@ int main(int argc, char *argv[])
{ "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 @@ int main(int argc, char *argv[])
{ "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 @@ int main(int argc, char *argv[])
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 @@ int main(int argc, char *argv[])
" -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"