summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <Klaus (dot) Schmidinger (at) tvdr (dot) de>2010-01-06 13:34:00 +0100
committerKlaus Schmidinger <Klaus (dot) Schmidinger (at) tvdr (dot) de>2010-01-06 13:34:00 +0100
commit939081e274d0a9868e5ba9a7951666ad508afb96 (patch)
treee79853c0ab397e609897a8f9dfc731231ce0aee4
parentea01358b3bca9d55402ba632c95cdd6458abfdb3 (diff)
downloadvdr-patches-939081e274d0a9868e5ba9a7951666ad508afb96.tar.gz
vdr-patches-939081e274d0a9868e5ba9a7951666ad508afb96.tar.bz2
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).
-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 Khler <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 Khler).
+- 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 Khler).
+- 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 Schller <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 Yolgeen).
+
+2009-12-06: Version 0.2.4
+
+- Several code modifications to avoid compiler warnings (thanks to Winfried Khler).
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 Khler).
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 Schller <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 Schller <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 transferncia!"
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 ttol"
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: Vladimr Brta <vladimir.barta@k2atmitec.cz>, Ji Dobr <jdobry@centrum.cz>\n"
"Language-Team: Czech\n"
@@ -40,6 +40,247 @@ msgstr "Nelze zat s penosem"
msgid "Starting EPG scan"
msgstr "Zan prohledvn 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 nzvu"
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 "Komdie"
+
+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/Fuball"
+
+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 fr Vorschulkinder"
+
+msgid "Content$Entertainment Programme for 6 to 14"
+msgstr "Unterhaltungsprogramm fr 6 bis 14"
+
+msgid "Content$Entertainment Programme for 10 to 16"
+msgstr "Unterhaltungsprogramm fr 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 Knste"
+
+msgid "Content$Fine Arts"
+msgstr "Bildende Knste"
+
+msgid "Content$Religion"
+msgstr "Religion"
+
+msgid "Content$Popular Culture/Traditional Arts"
+msgstr "Pop-Kultur/Traditionelle Knste"
+
+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 "Unverffentlicht"
+
+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 exploracin 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 ttulo"
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 "vljas"
msgid "on"
-msgstr ""
+msgstr "sees"
msgid "auto"
msgstr "automaatne"
@@ -34,11 +34,252 @@ msgid "Channel not available!"
msgstr "Kanal ei ole kttesaadav!"
msgid "Can't start Transfer Mode!"
-msgstr "Siirdemooduse start ebannestus!"
+msgstr "Siirdemooduse start nurjus!"
msgid "Starting EPG scan"
msgstr "EPG skaneerimine kivitatud"
+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 "Ssteem"
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 "Mrkimine"
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 "Kik saated - kik 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 "Ksud"
msgid "Error while accessing recording!"
-msgstr "Salvestuse taasesitus ebannestus!"
+msgstr "Salvestuse taasesitus nurjus!"
msgid "Delete recording?"
msgstr "Kustutada salvestus?"
msgid "Error while deleting recording!"
-msgstr "Salvestuse kustutamine ebannestus!"
+msgstr "Salvestuse kustutamine nurjus!"
msgid "Recording commands"
msgstr "Salvestuse ksud"
@@ -505,10 +746,10 @@ msgid "Setup.OSD$Height (%)"
msgstr "Krgus (%)"
msgid "Setup.OSD$Message time (s)"
-msgstr "Teate esitusaeg (s)"
+msgstr "Teate kuvamisaeg (s)"
msgid "Setup.OSD$Use small font"
-msgstr "Vikese fondi kasutamine"
+msgstr "Vikese 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 - taaskivitada?"
msgid "Can't reset CAM!"
-msgstr "CAM mooduli taaskivitus ebannestus!"
+msgstr "CAM mooduli taaskivitus 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 (pevi)"
msgid "Setup.Recording$Pause key handling"
-msgstr ""
+msgstr "Pausi klahvi ksitsemine"
msgid "Setup.Recording$Pause priority"
msgstr "Pausi prioriteet"
@@ -741,7 +982,7 @@ msgid "Setup.Recording$Pause lifetime (d)"
msgstr "Pausi eluiga (pevi)"
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 mrgistamine"
+msgstr "Kiirsalvestuse mrgistamine"
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 tkeldamine"
+msgstr "Failide jupitamine"
msgid "Replay"
msgstr "Taasesitus"
@@ -780,7 +1021,7 @@ msgid "Miscellaneous"
msgstr "Muud stted"
msgid "Setup.Miscellaneous$Min. event timeout (min)"
-msgstr "Min. sndmuse 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 kivitamisel"
msgid "Setup.Miscellaneous$as before"
-msgstr "nagu enne"
+msgstr "endine"
msgid "Setup.Miscellaneous$Initial volume"
msgstr "Helitugevus kivitamisel"
@@ -845,7 +1086,7 @@ msgid "Button$Stop"
msgstr "Stopp"
msgid "Button$Resume"
-msgstr "Jtka"
+msgstr "Jtkata"
#. TRANSLATORS: note the leading blank!
msgid " Cancel editing"
@@ -855,7 +1096,7 @@ msgid "Stop recording?"
msgstr "Lpetada salvestamine?"
msgid "Cancel editing?"
-msgstr "Thistada muudatus?"
+msgstr "Thistada redigeermine?"
msgid "No audio available!"
msgstr "Audio kttesaamatu!"
@@ -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 "Otselekande 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 ebannestus!"
+msgstr "Redigeerimise start nurjus!"
msgid "Editing process started"
-msgstr "Redigeerimine algas"
+msgstr "Redigeerimine kivitatud"
msgid "Editing process already active!"
msgstr "Redigeerimine juba aktiivne!"
@@ -925,13 +1166,13 @@ msgid "Low disk space!"
msgstr "Kvaketas tis!"
msgid "Regenerating index file"
-msgstr ""
+msgstr "Indeksfaili regenereerimine"
msgid "Index file regeneration complete"
-msgstr ""
+msgstr "Indeksfaili regenereerimine lpetatud"
msgid "Can't shutdown - option '-s' not given!"
-msgstr "Vljallitamine ebannestus - '-s' parameeter puudub!"
+msgstr "Vljallitamine nurjus - '-s' parameeter puudub!"
msgid "Editing - shut down anyway?"
msgstr "Redigeerimine aktiive - llitada vlja?"
@@ -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 otselekanne?"
msgid "Recording started"
-msgstr "Salvestamine algas"
+msgstr "Salvestamine kivitatud"
msgid "VDR will shut down later - press Power to force"
msgstr "VDR llitub vlja hiljem - vajuta Power kiirendamiseks"
@@ -1017,7 +1258,7 @@ msgid "Switching primary DVB..."
msgstr "Esmase DVB seadme mberllitus..."
msgid "Editing process failed!"
-msgstr "Redigeerimine ebannestus"
+msgstr "Redigeerimine nurjus"
msgid "Editing process finished"
msgstr "Redigeerimine lpetatud"
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 eponnistui!"
msgid "Starting EPG scan"
msgstr "Ohjelmaoppaan pivitys 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/stiedot"
+
+msgid "Content$News Magazine"
+msgstr "Uutismakasiini"
+
+msgid "Content$Documentary"
+msgstr "Dokumentti"
+
+msgid "Content$Discussion/Inverview/Debate"
+msgstr "Keskustelu/haastattelu/vittely"
+
+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 kouluikisten 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 "Merkittvt henkilt"
+
+msgid "Content$Education/Science/Factual"
+msgstr "Koulutus/tiede"
+
+msgid "Content$Nature/Animals/Environment"
+msgstr "Luonto/elimet/ymprist"
+
+msgid "Content$Technology/Natural Sciences"
+msgstr "Teknologia/luonnontiede"
+
+msgid "Content$Medicine/Physiology/Psychology"
+msgstr "Lketiede/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 "Ksityt"
+
+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 "Alkuperiskieli"
+
+msgid "Content$Black & White"
+msgstr "Mustavalkoinen"
+
+msgid "Content$Unpublished"
+msgstr "Julkaisematon"
+
+msgid "Content$Live Broadcast"
+msgstr "Suoralhetys"
+
+#, 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 "Nemogue zapoeti Prijenos!!"
msgid "Starting EPG scan"
msgstr "Poinjem 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: Istvn Fley <ifuley@tigercomp.ro>\n"
"Language-Team: Hungarian\n"
@@ -42,6 +42,247 @@ msgstr "Transfer-Mode nem indthat!"
msgid "Starting EPG scan"
msgstr "EPG adatok aktualizlsa"
+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 "nv nlkl"
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 mona 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 tytuu"
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 "Impossvel iniciar modo de transferncia!"
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 ttulo"
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 achiziia 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 "Fr 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 "Neme spusti prenos!"
msgid "Starting EPG scan"
msgstr "Zana prehadva 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 nzvu"
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 zaeti s prenosnim nainom!"
msgid "Starting EPG scan"
msgstr "Prienjam 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 "Pbrjar 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 Yolgeen <oktay_73@yahoo.de>\n"
"Language-Team: Turkish\n"
@@ -39,6 +39,247 @@ msgstr "Transfer modu balatlamyor!"
msgid "Starting EPG scan"
msgstr "EPG tarama balyor"
+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"