diff options
-rw-r--r-- | CONTRIBUTORS | 31 | ||||
-rw-r--r-- | HISTORY | 79 | ||||
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | PLUGINS/src/dvbsddevice/COPYING (renamed from PLUGINS/src/sky/COPYING) | 0 | ||||
-rw-r--r-- | PLUGINS/src/dvbsddevice/HISTORY | 12 | ||||
-rw-r--r-- | PLUGINS/src/dvbsddevice/Makefile (renamed from PLUGINS/src/sky/Makefile) | 43 | ||||
-rw-r--r-- | PLUGINS/src/dvbsddevice/README | 20 | ||||
-rw-r--r-- | PLUGINS/src/dvbsddevice/dvbsddevice.c | 35 | ||||
-rw-r--r-- | PLUGINS/src/dvbsddevice/dvbsdffdevice.c | 799 | ||||
-rw-r--r-- | PLUGINS/src/dvbsddevice/dvbsdffdevice.h | 107 | ||||
-rw-r--r-- | PLUGINS/src/dvbsddevice/dvbsdffosd.c (renamed from dvbosd.c) | 36 | ||||
-rw-r--r-- | PLUGINS/src/dvbsddevice/dvbsdffosd.h | 22 | ||||
-rw-r--r-- | PLUGINS/src/hello/HISTORY | 6 | ||||
-rw-r--r-- | PLUGINS/src/hello/hello.c | 6 | ||||
-rw-r--r-- | PLUGINS/src/pictures/HISTORY | 4 | ||||
-rw-r--r-- | PLUGINS/src/pictures/pictures.c | 6 | ||||
-rw-r--r-- | PLUGINS/src/skincurses/HISTORY | 5 | ||||
-rw-r--r-- | PLUGINS/src/skincurses/skincurses.c | 26 | ||||
-rw-r--r-- | PLUGINS/src/sky/HISTORY | 70 | ||||
-rw-r--r-- | PLUGINS/src/sky/README | 49 | ||||
-rw-r--r-- | PLUGINS/src/sky/channels.conf.sky | 34 | ||||
-rwxr-xr-x | PLUGINS/src/sky/getskyepg.pl | 260 | ||||
-rw-r--r-- | PLUGINS/src/sky/lircd.conf.sky | 299 | ||||
-rw-r--r-- | PLUGINS/src/sky/sky.c | 303 | ||||
-rw-r--r-- | Syd | 0 | ||||
-rw-r--r-- | channels.c | 31 | ||||
-rw-r--r-- | channels.h | 8 | ||||
-rw-r--r-- | ci.c | 42 | ||||
-rw-r--r-- | config.c | 4 | ||||
-rw-r--r-- | config.h | 10 | ||||
-rw-r--r-- | cutter.c | 30 | ||||
-rw-r--r-- | cutter.h | 4 | ||||
-rw-r--r-- | device.c | 14 | ||||
-rw-r--r-- | device.h | 12 | ||||
-rw-r--r-- | diseqc.c | 6 | ||||
-rw-r--r-- | dvbdevice.c | 899 | ||||
-rw-r--r-- | dvbdevice.h | 112 | ||||
-rw-r--r-- | dvbosd.h | 23 | ||||
-rw-r--r-- | dvbplayer.c | 6 | ||||
-rw-r--r-- | dvbspu.c | 128 | ||||
-rw-r--r-- | dvbspu.h | 8 | ||||
-rw-r--r-- | dvbsubtitle.c | 15 | ||||
-rw-r--r-- | eit.c | 51 | ||||
-rw-r--r-- | eit.h | 5 | ||||
-rw-r--r-- | epg.c | 193 | ||||
-rw-r--r-- | epg.h | 27 | ||||
-rw-r--r-- | font.c | 9 | ||||
-rw-r--r-- | font.h | 7 | ||||
-rw-r--r-- | libsi/si.c | 3 | ||||
-rw-r--r-- | libsi/si.h | 4 | ||||
-rw-r--r-- | menu.c | 13 | ||||
-rw-r--r-- | menuitems.c | 7 | ||||
-rwxr-xr-x | newplugin | 4 | ||||
-rw-r--r-- | nit.c | 3 | ||||
-rw-r--r-- | osd.c | 8 | ||||
-rw-r--r-- | pat.c | 20 | ||||
-rw-r--r-- | plugin.c | 10 | ||||
-rw-r--r-- | po/ca_ES.po | 243 | ||||
-rw-r--r-- | po/cs_CZ.po | 243 | ||||
-rw-r--r-- | po/da_DK.po | 243 | ||||
-rw-r--r-- | po/de_DE.po | 243 | ||||
-rw-r--r-- | po/el_GR.po | 243 | ||||
-rw-r--r-- | po/es_ES.po | 243 | ||||
-rw-r--r-- | po/et_EE.po | 343 | ||||
-rw-r--r-- | po/fi_FI.po | 243 | ||||
-rw-r--r-- | po/fr_FR.po | 243 | ||||
-rw-r--r-- | po/hr_HR.po | 243 | ||||
-rw-r--r-- | po/hu_HU.po | 243 | ||||
-rw-r--r-- | po/it_IT.po | 249 | ||||
-rw-r--r-- | po/lt_LT.po | 243 | ||||
-rw-r--r-- | po/nl_NL.po | 243 | ||||
-rw-r--r-- | po/nn_NO.po | 243 | ||||
-rw-r--r-- | po/pl_PL.po | 243 | ||||
-rw-r--r-- | po/pt_PT.po | 243 | ||||
-rw-r--r-- | po/ro_RO.po | 243 | ||||
-rw-r--r-- | po/ru_RU.po | 243 | ||||
-rw-r--r-- | po/sk_SK.po | 243 | ||||
-rw-r--r-- | po/sl_SI.po | 243 | ||||
-rw-r--r-- | po/sv_SE.po | 243 | ||||
-rw-r--r-- | po/tr_TR.po | 243 | ||||
-rw-r--r-- | po/uk_UA.po | 243 | ||||
-rw-r--r-- | po/zh_CN.po | 243 | ||||
-rw-r--r-- | receiver.c | 4 | ||||
-rw-r--r-- | recorder.c | 4 | ||||
-rw-r--r-- | recording.c | 66 | ||||
-rw-r--r-- | recording.h | 10 | ||||
-rw-r--r-- | remote.c | 8 | ||||
-rw-r--r-- | remux.c | 40 | ||||
-rw-r--r-- | remux.h | 35 | ||||
-rw-r--r-- | sdt.c | 13 | ||||
-rw-r--r-- | skinclassic.c | 30 | ||||
-rw-r--r-- | skinsttng.c | 37 | ||||
-rw-r--r-- | sources.conf | 5 | ||||
-rw-r--r-- | svdrp.c | 11 | ||||
-rw-r--r-- | tools.c | 9 | ||||
-rw-r--r-- | tools.h | 17 | ||||
-rw-r--r-- | transfer.c | 3 | ||||
-rw-r--r-- | vdr.1 | 18 | ||||
-rw-r--r-- | vdr.5 | 65 | ||||
-rw-r--r-- | vdr.c | 14 |
100 files changed, 8342 insertions, 2200 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 2e0eab9..1c1da69 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -600,6 +600,9 @@ Helmut Auer <vdr@helmutauer.de> for suggesting to improve logging system time changes to avoid problems on slow systems under heavy load for making the SVDRP command PUTE support reading the EPG data from a given file + for a patch that was used to implement the command line options --edit and + --genindex + for suggesting to disable EPG processing for a while after a CLRE command Jeremy Hall <jhall@UU.NET> for fixing an incomplete initialization of the filter parameters in eit.c @@ -1083,6 +1086,10 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi> contain UTF-8 characters for fixing wrong bracketing in cChannel::SubtitlingType() etc. for fixing handling DVB subtitles for PES recordings + for fixing compiler warnings "format not a string literal and no format arguments" + in some syslog calls + for a patch that was used to implement handling the "component descriptor" ("genre") + for a patch that was used to implement handling the "parental rating descriptor" Ralf Klueber <ralf.klueber@vodafone.com> for reporting a bug in cutting a recording if there is only a single editing mark @@ -1361,6 +1368,8 @@ Andreas Regel <andreas.regel@gmx.de> for fixing handling numeric keys in the channel display after switching channel groups for adding some missing 'const' statements to cBitmap + for making cDevice::AddPid() store the stream type of the given pid + for adding cFont::FontName() and cFont::Size() Thomas Bergwinkl <Thomas.Bergwinkl@vr-web.de> for fixing the validity check for channel IDs, because some providers use TIDs @@ -1570,12 +1579,13 @@ Dick Streefland <Dick.Streefland@xs4all.nl> Kimmo Tykkala <tykkala@iki.fi> for pointing out a problem in showing the replay mode if the OSD is currently in use -Arthur Konovalov <kasjas@hot.ee> +Arthur Konovalov <artlov@gmail.com> for translating OSD texts to the Estonian language for fixing a missing ',' in the Greek OSD texts for fixing a missing ',' in the Swedish OSD texts for reporting problems with CAMs when checking the CAM status too frequently for reporting references to old *.vdr file names in MANUAL + for reporting that the video stream type was set to 2 even if the vpid was 0 Milos Kapoun <m.kapoun@cra.cz> for suggesting to skip code table info in SI data @@ -1651,6 +1661,7 @@ Udo Richter <udo_richter@gmx.de> for reporting wrong variable types in cIndexFile for reporting a problem with cDevice::PlayTsVideo() and cDevice::PlayTsAudio() in case only part of the buffer has been accepted by the device + for reporting missing defines for large files in the 'newplugin' script Sven Kreiensen <svenk@kammer.uni-hannover.de> for his help in keeping 'channels.conf.terr' up to date @@ -1687,6 +1698,8 @@ Joachim Wilke <vdr@joachim-wilke.de> for reporting a problem with cStatus::MsgOsdTextItem() being called without a text for reporting a missing install-i18n in the install target in the Makefile for adding a missing 'const' to cRecording::FramesPerSecond() + for modifying cCharSetConv so that it can be used to convert from "whatever VDR uses" + to a given code Sascha Klek <sklek@gmx.de> for reporting a problem with the '0' key in the "Day" item of the "Timers" menu @@ -2250,6 +2263,8 @@ Anssi Hannula <anssi.hannula@gmail.com> for suggesting to change the default for LOCDIR in Makefile and Make.config.template to "./locale", so that internationalization works by default when running VDR from within its source directory + for fixing stopping subtitle display when switching the primary device + for fixing plugin arguments corruption with glibc 2.11 on x86_64 Antti Hartikainen <ami+vdr@ah.fi> for updating 'S13E' in 'sources.conf' @@ -2459,6 +2474,8 @@ Michael Nork <mnork0@gmx.net> Winfried Köhler <w_koehl@gmx.de> for fixing wrong value for TableIdBAT in libsi/si.h + for making several code modifications to avoid compiler warnings + for improving the description of the transponder parameters in vdr.5 Igor M. Liplianin <liplianin@tut.by> for a patch that was used to convert VDR to the S2API driver API @@ -2473,6 +2490,10 @@ Johann Friedrichs <johann.friedrichs@web.de> for fixing incrementing the continuity counter in cPatPmtGenerator::GetPmt() for pointing out that "DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE" should be added to Make.config. + for adding stream type 11172 AUDIO to cPatPmtParser::ParsePmt() + for removing the workaround for short channel names of "Kabel Deutschland" + for some fixes to dvbspu.[hc] + for fixing a busy loop when moving editing marks Timo Helkio <timolavi@mbnet.fi> for reporting a hangup when replaying a TS recording with subtitles activated @@ -2481,6 +2502,7 @@ Derek Kelly (user.vdr@gmail.com) for fixing handling the 'new' indicator in the recordings menu for TS recordings for reporting a problem with HD NTSC broadcasts that split frames over several payload units + for updating sources.conf Marcel Unbehaun <frostworks@gmx.de> for adding cRecordingInfo::GetEvent() @@ -2514,3 +2536,10 @@ Milan Hrala <hrala.milan@gmail.com> Andreas Schaefers <andreas_schaefers@gmx.de> for adding the audio id to the call of PlayAudio() in cDevice::PlayTsAudio() + +Matthieu Castet <castet.matthieu@free.fr> + for improving SPU handling on devices with limited OSD capabilities + +Francesco Saverio Schiavarelli <fschiava@libero.it> + for reporting a problem with channels that have some encrypted components that + VDR doesn't use @@ -6196,3 +6196,82 @@ Video Disk Recorder Revision History cause nothing but trouble. Besides, the core VDR doesn't use this, anyway. - Fixed the default value for "Pause key handling" in the MANUAL (reported by Diego Pierotto). + +2010-01-06: Version 1.7.11 + +- Fixed resetting the file size when regenerating the index file. +- The new function cDevice::PatPmtParser() can be used in derived devices to access + the PAT/PMT of the currently replayed material. +- Updated the Italian OSD texts (thanks to Diego Pierotto). +- The PCR pid in generated PMTs is now set to 0x1FFF ("no PCR pid") in + cPatPmtGenerator::GeneratePmt(), because VDR doesn't record the PCR pid. +- Updated the Estonian OSD texts (thanks to Arthur Konovalov). +- The 'sky' plugin is no longer part of the VDR source. +- Improved SPU handling on devices with limited OSD capabilities (thanks to + Matthieu Castet). +- Several code modifications to avoid compiler warnings (thanks to Winfried Köhler). +- Added stream type 11172 AUDIO to cPatPmtParser::ParsePmt() (thanks to Johann + Friedrichs). +- Removed debug output of '-' from cTransfer::Receive(). +- Added defines for large files to the 'newplugin' script (reported by Udo Richter). +- Removed the workaround for short channel names of "Kabel Deutschland", because + apparently they now have their data according to the DVB standard (thanks to + Johann Friedrichs). +- Some fixes to dvbspu.[hc] (thanks to Johann Friedrichs). +- Fixed a busy loop when moving editing marks (thanks to Johann Friedrichs). +- Updated sources.conf (thanks to Derek Kelly). +- Modified cCharSetConv so that it can be used to convert from "whatever VDR uses" + to a given code (thanks to Joachim Wilke). +- Channel names containing commas are now handled correctly in channels.conf. + If a channel's short name contains a comma, it is replaced with a '.'. +- cDevice now logs the device number when a new device is created. +- Fixed handling STREAMTYPE_11172_AUDIO in cPatPmtParser::ParsePmt(). +- cParsePatPmt now has functions to retrieve the audio, dolby and subtitle pids. +- cPatFilter::Process() now only stores CA descriptors for video and audio pids + (thanks to Francesco Saverio Schiavarelli for reporting a problem with channels + that have some encrypted components that VDR doesn't use). +- cDevice::AddPid() now stores the stream type of the given pid (thanks to Andreas + Regel). +- Added cFont::FontName() and cFont::Size() (thanks to Andreas Regel). +- cPatPmtParser now also stores the audio stream types. +- The support for full featured DVB cards of the TT/FuSi design has been moved + into the new plugin 'dvbsddevice'. On systems that use such a card as their + primary device, this plugin now needs to be loaded when running VDR in order + to view live or recorded video. If the plugin is not loaded, the card will + be treated like a budget DVB card, and there will be no OSD or viewing + capability. +- Fixed handling the "CA PMT" generation (revised a change not mentioned in version + 1.7.9's changes, which caused a malfunction with Conax and Viaccess CAMs). +- Fixed stopping subtitle display when switching the primary device (thanks to + Anssi Hannula). + IMPORTANT NOTE TO PLUGIN AUTHORS: a plugin that implements a derived cDevice + class that can replay video must now call the MakePrimaryDevice() function of + its base class. +- Fixed compiler warnings "format not a string literal and no format arguments" + in some syslog calls (thanks to Rolf Ahrenberg). +- The new command line options --edit and --genindex can be used to edit a + recording or generate its index without actually starting the entire VDR + (based on a patch from Helmut Auer). +- Improved the description of the transponder parameters in vdr.5 (thanks to + Winfried Köhler). +- Avoiding setting the video stream type to 2 if the vpid is 0 (problem reported + by Arthur Konovalov). +- Implemented handling the "Content Descriptor" (based on a patch from Rolf + Ahrenberg). The 'classic', 'sttng' and 'curses' skins display the textual + representation of the content descriptors as "genre". The epg.data file stores + the genre using the tag character 'G'. +- Implemented handling the "Parental Rating Descriptor" (based on a patch from Rolf + Ahrenberg). The 'classic', 'sttng' and 'curses' skins display the parental + rating (if given) in their event displays. The epg.data file stores + the parental rating using the tag character 'R'. + IMPORTANT NOTE: if VDR doesn't display a parental rating, this does not + necessarily mean that the given programme is suitable for all audiences! +- Rearranged cEvent members to minimize memory waste. +- After a CLRE command, no further EPG processing is now done for 10 seconds, + so that data sent with subsequent PUTE commands doesn't interfere with data + from the broadcasters (suggested by Helmut Auer). +- Added support for DVB cards with multiple fontends. Note that this only + works for DVB cards where each frontend can be used independently of all + the others on the same adapter. +- Fixed plugin arguments corruption with glibc 2.11 on x86_64 (thanks to + Anssi Hannula). @@ -4,7 +4,7 @@ # See the main source file 'vdr.c' for copyright information and # how to reach the author. # -# $Id: Makefile 2.4 2009/10/18 13:59:25 kls Exp $ +# $Id: Makefile 2.5 2009/12/29 11:20:50 kls Exp $ .DELETE_ON_ERROR: @@ -36,7 +36,7 @@ DOXYFILE = Doxyfile SILIB = $(LSIDIR)/libsi.a -OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o dvbosd.o\ +OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\ dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\ lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\ receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\ diff --git a/PLUGINS/src/sky/COPYING b/PLUGINS/src/dvbsddevice/COPYING index f90922e..f90922e 100644 --- a/PLUGINS/src/sky/COPYING +++ b/PLUGINS/src/dvbsddevice/COPYING diff --git a/PLUGINS/src/dvbsddevice/HISTORY b/PLUGINS/src/dvbsddevice/HISTORY new file mode 100644 index 0000000..18cd625 --- /dev/null +++ b/PLUGINS/src/dvbsddevice/HISTORY @@ -0,0 +1,12 @@ +VDR Plugin 'dvbsddevice' Revision History +----------------------------------------- + +2009-12-28: Version 0.0.1 + +- Initial revision. + +2010-01-04: Version 0.0.2 + +- Calling the MakePrimaryDevice() function of the base class to allow + the cDevice to stop displaying subtitles. +- Added support for DVB cards with multiple fontends. diff --git a/PLUGINS/src/sky/Makefile b/PLUGINS/src/dvbsddevice/Makefile index 87fbcba..8ef273c 100644 --- a/PLUGINS/src/sky/Makefile +++ b/PLUGINS/src/dvbsddevice/Makefile @@ -1,13 +1,15 @@ # # Makefile for a Video Disk Recorder plugin # -# $Id: Makefile 2.0 2008/01/13 13:00:16 kls Exp $ +# $Id: Makefile 1.1 2009/12/29 11:53:18 kls Exp $ # The official name of this plugin. # This name will be used in the '-P...' option of VDR to load the plugin. # By default the main source file also carries this name. +# IMPORTANT: the presence of this macro is important for the Make.config +# file. So it must be defined, even if it is not used here! # -PLUGIN = sky +PLUGIN = dvbsddevice ### The version number of this plugin (taken from the main source file): @@ -43,28 +45,55 @@ INCLUDES += -I$(VDRDIR)/include DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' +DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE + ### The object files (add further files here): -OBJS = $(PLUGIN).o +OBJS = $(PLUGIN).o dvbsdffdevice.o dvbsdffosd.o ### The main target: -all: libvdr-$(PLUGIN).so +all: libvdr-$(PLUGIN).so i18n ### Implicit rules: %.o: %.c $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $< -# Dependencies: +### Dependencies: -MAKEDEP = g++ -MM -MG +MAKEDEP = $(CXX) -MM -MG DEPFILE = .dependencies $(DEPFILE): Makefile @$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ -include $(DEPFILE) +### Internationalization (I18N): + +PODIR = po +LOCALEDIR = $(VDRDIR)/locale +I18Npo = $(wildcard $(PODIR)/*.po) +I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file)))))) +I18Npot = $(PODIR)/$(PLUGIN).pot + +%.mo: %.po + msgfmt -c -o $@ $< + +$(I18Npot): $(wildcard *.c) + xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<see README>' -o $@ $^ + +%.po: $(I18Npot) + msgmerge -U --no-wrap --no-location --backup=none -q $@ $< + @touch $@ + +$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo + @mkdir -p $(dir $@) + cp $< $@ + +.PHONY: i18n +i18n: $(I18Nmsgs) $(I18Npot) + ### Targets: libvdr-$(PLUGIN).so: $(OBJS) @@ -80,4 +109,4 @@ dist: clean @echo Distribution package created as $(PACKAGE).tgz clean: - @-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ + @-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot diff --git a/PLUGINS/src/dvbsddevice/README b/PLUGINS/src/dvbsddevice/README new file mode 100644 index 0000000..9b1280f --- /dev/null +++ b/PLUGINS/src/dvbsddevice/README @@ -0,0 +1,20 @@ +This is a "plugin" for the Video Disk Recorder (VDR). + +Written by: Klaus Schmidinger <Klaus.Schmidinger@tvdr.de> + +Project's homepage: http://www.tvdr.de + +Latest version available at: ftp://ftp.tvdr.de/vdr + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. +See the file COPYING for more information. + +Description: + +The 'dvbsddevice' plugin implements the output device for the +"Full Featured" DVB cards based on the TechnoTrend/Fujitsu-Siemens +design. This code was originally part of the core VDR source, and +was moved into this plugin in VDR version 1.7.11. diff --git a/PLUGINS/src/dvbsddevice/dvbsddevice.c b/PLUGINS/src/dvbsddevice/dvbsddevice.c new file mode 100644 index 0000000..e2248e9 --- /dev/null +++ b/PLUGINS/src/dvbsddevice/dvbsddevice.c @@ -0,0 +1,35 @@ +/* + * dvbsddevice.c: A plugin for the Video Disk Recorder + * + * See the README file for copyright information and how to reach the author. + * + * $Id: dvbsddevice.c 1.2 2010/01/01 15:01:01 kls Exp $ + */ + +#include <vdr/plugin.h> +#include "dvbsdffdevice.h" + +static const char *VERSION = "0.0.2"; +static const char *DESCRIPTION = "SD Full Featured DVB device"; + +class cPluginDvbsddevice : public cPlugin { +private: + cDvbSdFfDeviceProbe *probe; +public: + cPluginDvbsddevice(void); + virtual ~cPluginDvbsddevice(); + virtual const char *Version(void) { return VERSION; } + virtual const char *Description(void) { return DESCRIPTION; } + }; + +cPluginDvbsddevice::cPluginDvbsddevice(void) +{ + probe = new cDvbSdFfDeviceProbe; +} + +cPluginDvbsddevice::~cPluginDvbsddevice() +{ + delete probe; +} + +VDRPLUGINCREATOR(cPluginDvbsddevice); // Don't touch this! diff --git a/PLUGINS/src/dvbsddevice/dvbsdffdevice.c b/PLUGINS/src/dvbsddevice/dvbsdffdevice.c new file mode 100644 index 0000000..21a60a5 --- /dev/null +++ b/PLUGINS/src/dvbsddevice/dvbsdffdevice.c @@ -0,0 +1,799 @@ +/* + * dvbsdffdevice.h: The DVB SD Full Featured device interface + * + * See the README file for copyright information and how to reach the author. + * + * $Id: dvbsdffdevice.c 2.25 2010/01/04 12:56:56 kls Exp $ + */ + +#include "dvbsdffdevice.h" +#include <errno.h> +#include <limits.h> +#include <linux/videodev2.h> +#include <linux/dvb/audio.h> +#include <linux/dvb/dmx.h> +#include <linux/dvb/video.h> +#include <sys/ioctl.h> +#include <sys/mman.h> +#include "dvbsdffosd.h" +#include "vdr/eitscan.h" +#include "vdr/transfer.h" + +// --- cDvbSdFfDevice -------------------------------------------------------- + +int cDvbSdFfDevice::devVideoOffset = -1; + +cDvbSdFfDevice::cDvbSdFfDevice(int Adapter, int Frontend) +:cDvbDevice(Adapter, Frontend) +{ + spuDecoder = NULL; + digitalAudio = false; + playMode = pmNone; + + // Devices that are only present on cards with decoders: + + fd_osd = DvbOpen(DEV_DVB_OSD, adapter, frontend, O_RDWR); + fd_video = DvbOpen(DEV_DVB_VIDEO, adapter, frontend, O_RDWR | O_NONBLOCK); + fd_audio = DvbOpen(DEV_DVB_AUDIO, adapter, frontend, O_RDWR | O_NONBLOCK); + fd_stc = DvbOpen(DEV_DVB_DEMUX, adapter, frontend, O_RDWR); + + // The offset of the /dev/video devices: + + if (devVideoOffset < 0) { // the first one checks this + FILE *f = NULL; + char buffer[PATH_MAX]; + for (int ofs = 0; ofs < 100; ofs++) { + snprintf(buffer, sizeof(buffer), "/proc/video/dev/video%d", ofs); + if ((f = fopen(buffer, "r")) != NULL) { + if (fgets(buffer, sizeof(buffer), f)) { + if (strstr(buffer, "DVB Board")) { // found the _first_ DVB card + devVideoOffset = ofs; + dsyslog("video device offset is %d", devVideoOffset); + break; + } + } + else + break; + fclose(f); + } + else + break; + } + if (devVideoOffset < 0) + devVideoOffset = 0; + if (f) + fclose(f); + } + devVideoIndex = devVideoOffset >= 0 ? devVideoOffset++ : -1; + + // Video format: + + SetVideoFormat(Setup.VideoFormat); +} + +cDvbSdFfDevice::~cDvbSdFfDevice() +{ + delete spuDecoder; + // We're not explicitly closing any device files here, since this sometimes + // caused segfaults. Besides, the program is about to terminate anyway... +} + +void cDvbSdFfDevice::MakePrimaryDevice(bool On) +{ + if (On) + new cDvbOsdProvider(fd_osd); + cDvbDevice::MakePrimaryDevice(On); +} + +bool cDvbSdFfDevice::HasDecoder(void) const +{ + return true; +} + +cSpuDecoder *cDvbSdFfDevice::GetSpuDecoder(void) +{ + if (!spuDecoder && IsPrimaryDevice()) + spuDecoder = new cDvbSpuDecoder(); + return spuDecoder; +} + +uchar *cDvbSdFfDevice::GrabImage(int &Size, bool Jpeg, int Quality, int SizeX, int SizeY) +{ + if (devVideoIndex < 0) + return NULL; + char buffer[PATH_MAX]; + snprintf(buffer, sizeof(buffer), "%s%d", DEV_VIDEO, devVideoIndex); + int videoDev = open(buffer, O_RDWR); + if (videoDev >= 0) { + uchar *result = NULL; + // set up the size and RGB + v4l2_format fmt; + memset(&fmt, 0, sizeof(fmt)); + fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + fmt.fmt.pix.width = SizeX; + fmt.fmt.pix.height = SizeY; + fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_BGR24; + fmt.fmt.pix.field = V4L2_FIELD_ANY; + if (ioctl(videoDev, VIDIOC_S_FMT, &fmt) == 0) { + v4l2_requestbuffers reqBuf; + memset(&reqBuf, 0, sizeof(reqBuf)); + reqBuf.count = 2; + reqBuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + reqBuf.memory = V4L2_MEMORY_MMAP; + if (ioctl(videoDev, VIDIOC_REQBUFS, &reqBuf) >= 0) { + v4l2_buffer mbuf; + memset(&mbuf, 0, sizeof(mbuf)); + mbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + mbuf.memory = V4L2_MEMORY_MMAP; + if (ioctl(videoDev, VIDIOC_QUERYBUF, &mbuf) == 0) { + int msize = mbuf.length; + unsigned char *mem = (unsigned char *)mmap(0, msize, PROT_READ | PROT_WRITE, MAP_SHARED, videoDev, 0); + if (mem && mem != (unsigned char *)-1) { + v4l2_buffer buf; + memset(&buf, 0, sizeof(buf)); + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + buf.memory = V4L2_MEMORY_MMAP; + buf.index = 0; + if (ioctl(videoDev, VIDIOC_QBUF, &buf) == 0) { + v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (ioctl (videoDev, VIDIOC_STREAMON, &type) == 0) { + memset(&buf, 0, sizeof(buf)); + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + buf.memory = V4L2_MEMORY_MMAP; + buf.index = 0; + if (ioctl(videoDev, VIDIOC_DQBUF, &buf) == 0) { + if (ioctl(videoDev, VIDIOC_STREAMOFF, &type) == 0) { + // make RGB out of BGR: + int memsize = fmt.fmt.pix.width * fmt.fmt.pix.height; + unsigned char *mem1 = mem; + for (int i = 0; i < memsize; i++) { + unsigned char tmp = mem1[2]; + mem1[2] = mem1[0]; + mem1[0] = tmp; + mem1 += 3; + } + + if (Quality < 0) + Quality = 100; + + dsyslog("grabbing to %s %d %d %d", Jpeg ? "JPEG" : "PNM", Quality, fmt.fmt.pix.width, fmt.fmt.pix.height); + if (Jpeg) { + // convert to JPEG: + result = RgbToJpeg(mem, fmt.fmt.pix.width, fmt.fmt.pix.height, Size, Quality); + if (!result) + esyslog("ERROR: failed to convert image to JPEG"); + } + else { + // convert to PNM: + char buf[32]; + snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", fmt.fmt.pix.width, fmt.fmt.pix.height); + int l = strlen(buf); + int bytes = memsize * 3; + Size = l + bytes; + result = MALLOC(uchar, Size); + if (result) { + memcpy(result, buf, l); + memcpy(result + l, mem, bytes); + } + else + esyslog("ERROR: failed to convert image to PNM"); + } + } + else + esyslog("ERROR: video device VIDIOC_STREAMOFF failed"); + } + else + esyslog("ERROR: video device VIDIOC_DQBUF failed"); + } + else + esyslog("ERROR: video device VIDIOC_STREAMON failed"); + } + else + esyslog("ERROR: video device VIDIOC_QBUF failed"); + munmap(mem, msize); + } + else + esyslog("ERROR: failed to memmap video device"); + } + else + esyslog("ERROR: video device VIDIOC_QUERYBUF failed"); + } + else + esyslog("ERROR: video device VIDIOC_REQBUFS failed"); + } + else + esyslog("ERROR: video device VIDIOC_S_FMT failed"); + close(videoDev); + return result; + } + else + LOG_ERROR_STR(buffer); + return NULL; +} + +void cDvbSdFfDevice::SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat) +{ + cDevice::SetVideoDisplayFormat(VideoDisplayFormat); + if (Setup.VideoFormat) { + CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_LETTER_BOX)); + } + else { + switch (VideoDisplayFormat) { + case vdfPanAndScan: + CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_PAN_SCAN)); + break; + case vdfLetterBox: + CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_LETTER_BOX)); + break; + case vdfCenterCutOut: + CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_CENTER_CUT_OUT)); + break; + default: esyslog("ERROR: unknown video display format %d", VideoDisplayFormat); + } + } +} + +void cDvbSdFfDevice::SetVideoFormat(bool VideoFormat16_9) +{ + CHECK(ioctl(fd_video, VIDEO_SET_FORMAT, VideoFormat16_9 ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3)); + SetVideoDisplayFormat(eVideoDisplayFormat(Setup.VideoDisplayFormat)); +} + +eVideoSystem cDvbSdFfDevice::GetVideoSystem(void) +{ + eVideoSystem VideoSystem = vsPAL; + if (fd_video >= 0) { + video_size_t vs; + if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) { + if (vs.h == 480 || vs.h == 240) + VideoSystem = vsNTSC; + } + else + LOG_ERROR; + } + return VideoSystem; +} + +void cDvbSdFfDevice::GetVideoSize(int &Width, int &Height, double &VideoAspect) +{ + if (fd_video >= 0) { + video_size_t vs; + if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) { + Width = vs.w; + Height = vs.h; + switch (vs.aspect_ratio) { + default: + case VIDEO_FORMAT_4_3: VideoAspect = 4.0 / 3.0; break; + case VIDEO_FORMAT_16_9: VideoAspect = 16.0 / 9.0; break; + case VIDEO_FORMAT_221_1: VideoAspect = 2.21; break; + } + return; + } + else + LOG_ERROR; + } + cDevice::GetVideoSize(Width, Height, VideoAspect); +} + +void cDvbSdFfDevice::GetOsdSize(int &Width, int &Height, double &PixelAspect) +{ + if (fd_video >= 0) { + video_size_t vs; + if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) { + Width = 720; + if (vs.h != 480 && vs.h != 240) + Height = 576; // PAL + else + Height = 480; // NTSC + switch (Setup.VideoFormat ? vs.aspect_ratio : VIDEO_FORMAT_4_3) { + default: + case VIDEO_FORMAT_4_3: PixelAspect = 4.0 / 3.0; break; + case VIDEO_FORMAT_221_1: // FF DVB cards only distinguish between 4:3 and 16:9 + case VIDEO_FORMAT_16_9: PixelAspect = 16.0 / 9.0; break; + } + PixelAspect /= double(Width) / Height; + return; + } + else + LOG_ERROR; + } + cDevice::GetOsdSize(Width, Height, PixelAspect); +} + +bool cDvbSdFfDevice::SetAudioBypass(bool On) +{ + if (setTransferModeForDolbyDigital != 1) + return false; + return ioctl(fd_audio, AUDIO_SET_BYPASS_MODE, On) == 0; +} + +// ptAudio ptVideo ptPcr ptTeletext ptDolby ptOther +static dmx_pes_type_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_PCR, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER }; + +bool cDvbSdFfDevice::SetPid(cPidHandle *Handle, int Type, bool On) +{ + if (Handle->pid) { + dmx_pes_filter_params pesFilterParams; + memset(&pesFilterParams, 0, sizeof(pesFilterParams)); + if (On) { + if (Handle->handle < 0) { + Handle->handle = DvbOpen(DEV_DVB_DEMUX, adapter, frontend, O_RDWR | O_NONBLOCK, true); + if (Handle->handle < 0) { + LOG_ERROR; + return false; + } + } + pesFilterParams.pid = Handle->pid; + pesFilterParams.input = DMX_IN_FRONTEND; + pesFilterParams.output = (Type <= ptTeletext && Handle->used <= 1) ? DMX_OUT_DECODER : DMX_OUT_TS_TAP; + pesFilterParams.pes_type= PesTypes[Type < ptOther ? Type : ptOther]; + pesFilterParams.flags = DMX_IMMEDIATE_START; + if (ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) { + LOG_ERROR; + return false; + } + } + else if (!Handle->used) { + CHECK(ioctl(Handle->handle, DMX_STOP)); + if (Type <= ptTeletext) { + pesFilterParams.pid = 0x1FFF; + pesFilterParams.input = DMX_IN_FRONTEND; + pesFilterParams.output = DMX_OUT_DECODER; + pesFilterParams.pes_type= PesTypes[Type]; + pesFilterParams.flags = DMX_IMMEDIATE_START; + CHECK(ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams)); + if (PesTypes[Type] == DMX_PES_VIDEO) // let's only do this once + SetPlayMode(pmNone); // necessary to switch a PID from DMX_PES_VIDEO/AUDIO to DMX_PES_OTHER + } + close(Handle->handle); + Handle->handle = -1; + } + } + return true; +} + +void cDvbSdFfDevice::TurnOffLiveMode(bool LiveView) +{ + if (LiveView) { + // Avoid noise while switching: + CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true)); + CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); + CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER)); + CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER)); + } + + // Turn off live PIDs: + + DetachAll(pidHandles[ptAudio].pid); + DetachAll(pidHandles[ptVideo].pid); + DetachAll(pidHandles[ptPcr].pid); + DetachAll(pidHandles[ptTeletext].pid); + DelPid(pidHandles[ptAudio].pid); + DelPid(pidHandles[ptVideo].pid); + DelPid(pidHandles[ptPcr].pid, ptPcr); + DelPid(pidHandles[ptTeletext].pid); + DelPid(pidHandles[ptDolby].pid); +} + +bool cDvbSdFfDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) +{ + int apid = Channel->Apid(0); + int vpid = Channel->Vpid(); + int dpid = Channel->Dpid(0); + + bool DoTune = !IsTunedToTransponder(Channel); + + bool pidHandlesVideo = pidHandles[ptVideo].pid == vpid; + bool pidHandlesAudio = pidHandles[ptAudio].pid == apid; + + bool TurnOffLivePIDs = DoTune + || !IsPrimaryDevice() + || LiveView // for a new live view the old PIDs need to be turned off + || pidHandlesVideo // for recording the PIDs must be shifted from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER + ; + + bool StartTransferMode = IsPrimaryDevice() && !DoTune + && (LiveView && HasPid(vpid ? vpid : apid) && (!pidHandlesVideo || (!pidHandlesAudio && (dpid ? pidHandles[ptAudio].pid != dpid : true)))// the PID is already set as DMX_PES_OTHER + || !LiveView && (pidHandlesVideo || pidHandlesAudio) // a recording is going to shift the PIDs from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER + ); + if (CamSlot() && !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), CamSlot()->SlotNumber())) + StartTransferMode |= LiveView && IsPrimaryDevice() && Channel->Ca() >= CA_ENCRYPTED_MIN; + + bool TurnOnLivePIDs = !StartTransferMode && LiveView; + + // Turn off live PIDs if necessary: + + if (TurnOffLivePIDs) + TurnOffLiveMode(LiveView); + + // Set the tuner: + + if (!cDvbDevice::SetChannelDevice(Channel, LiveView)) + return false; + + // If this channel switch was requested by the EITScanner we don't wait for + // a lock and don't set any live PIDs (the EITScanner will wait for the lock + // by itself before setting any filters): + + if (EITScanner.UsesDevice(this)) //XXX + return true; + + // PID settings: + + if (TurnOnLivePIDs) { + SetAudioBypass(false); + if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(vpid, ptVideo) && AddPid(apid, ptAudio))) { + esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->Number(), CardIndex() + 1); + return false; + } + if (IsPrimaryDevice()) + AddPid(Channel->Tpid(), ptTeletext); + CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true)); // actually one would expect 'false' here, but according to Marco Schlüßler <marco@lordzodiac.de> this works + // to avoid missing audio after replaying a DVD; with 'false' there is an audio disturbance when switching + // between two channels on the same transponder on DVB-S + CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true)); + } + else if (StartTransferMode) + cControl::Launch(new cTransferControl(this, Channel->GetChannelID(), vpid, Channel->Apids(), Channel->Dpids(), Channel->Spids())); + + return true; +} + +int cDvbSdFfDevice::GetAudioChannelDevice(void) +{ + audio_status_t as; + CHECK(ioctl(fd_audio, AUDIO_GET_STATUS, &as)); + return as.channel_select; +} + +void cDvbSdFfDevice::SetAudioChannelDevice(int AudioChannel) +{ + CHECK(ioctl(fd_audio, AUDIO_CHANNEL_SELECT, AudioChannel)); +} + +void cDvbSdFfDevice::SetVolumeDevice(int Volume) +{ + if (digitalAudio) + Volume = 0; + audio_mixer_t am; + // conversion for linear volume response: + am.volume_left = am.volume_right = 2 * Volume - Volume * Volume / 255; + CHECK(ioctl(fd_audio, AUDIO_SET_MIXER, &am)); +} + +void cDvbSdFfDevice::SetDigitalAudioDevice(bool On) +{ + if (digitalAudio != On) { + if (digitalAudio) + cCondWait::SleepMs(1000); // Wait until any leftover digital data has been flushed + digitalAudio = On; + SetVolumeDevice(On || IsMute() ? 0 : CurrentVolume()); + } +} + +void cDvbSdFfDevice::SetAudioTrackDevice(eTrackType Type) +{ + const tTrackId *TrackId = GetTrack(Type); + if (TrackId && TrackId->id) { + SetAudioBypass(false); + if (IS_AUDIO_TRACK(Type) || (IS_DOLBY_TRACK(Type) && SetAudioBypass(true))) { + if (pidHandles[ptAudio].pid && pidHandles[ptAudio].pid != TrackId->id) { + DetachAll(pidHandles[ptAudio].pid); + if (CamSlot()) + CamSlot()->SetPid(pidHandles[ptAudio].pid, false); + pidHandles[ptAudio].pid = TrackId->id; + SetPid(&pidHandles[ptAudio], ptAudio, true); + if (CamSlot()) { + CamSlot()->SetPid(pidHandles[ptAudio].pid, true); + CamSlot()->StartDecrypting(); + } + } + } + else if (IS_DOLBY_TRACK(Type)) { + if (setTransferModeForDolbyDigital == 0) + return; + // Currently this works only in Transfer Mode + ForceTransferMode(); + } + } +} + +bool cDvbSdFfDevice::CanReplay(void) const +{ + return cDevice::CanReplay(); +} + +bool cDvbSdFfDevice::SetPlayMode(ePlayMode PlayMode) +{ + if (PlayMode != pmExtern_THIS_SHOULD_BE_AVOIDED && fd_video < 0 && fd_audio < 0) { + // reopen the devices + fd_video = DvbOpen(DEV_DVB_VIDEO, adapter, frontend, O_RDWR | O_NONBLOCK); + fd_audio = DvbOpen(DEV_DVB_AUDIO, adapter, frontend, O_RDWR | O_NONBLOCK); + SetVideoFormat(Setup.VideoFormat); + } + + switch (PlayMode) { + case pmNone: + // special handling to return from PCM replay: + CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); + CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY)); + CHECK(ioctl(fd_video, VIDEO_PLAY)); + + CHECK(ioctl(fd_video, VIDEO_STOP, true)); + CHECK(ioctl(fd_audio, AUDIO_STOP, true)); + CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER)); + CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER)); + CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX)); + CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX)); + CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true)); + CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false)); + break; + case pmAudioVideo: + case pmAudioOnlyBlack: + if (playMode == pmNone) + TurnOffLiveMode(true); + CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); + CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY)); + CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, PlayMode == pmAudioVideo)); + CHECK(ioctl(fd_audio, AUDIO_PLAY)); + CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY)); + CHECK(ioctl(fd_video, VIDEO_PLAY)); + break; + case pmAudioOnly: + CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); + CHECK(ioctl(fd_audio, AUDIO_STOP, true)); + CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER)); + CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY)); + CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false)); + CHECK(ioctl(fd_audio, AUDIO_PLAY)); + CHECK(ioctl(fd_video, VIDEO_SET_BLANK, false)); + break; + case pmVideoOnly: + CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); + CHECK(ioctl(fd_video, VIDEO_STOP, true)); + CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX)); + CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false)); + CHECK(ioctl(fd_audio, AUDIO_PLAY)); + CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER)); + CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY)); + CHECK(ioctl(fd_video, VIDEO_PLAY)); + break; + case pmExtern_THIS_SHOULD_BE_AVOIDED: + close(fd_video); + close(fd_audio); + fd_video = fd_audio = -1; + break; + default: esyslog("ERROR: unknown playmode %d", PlayMode); + } + playMode = PlayMode; + return true; +} + +int64_t cDvbSdFfDevice::GetSTC(void) +{ + if (fd_stc >= 0) { + struct dmx_stc stc; + stc.num = 0; + if (ioctl(fd_stc, DMX_GET_STC, &stc) == -1) { + esyslog("ERROR: stc %d: %m", CardIndex() + 1); + return -1; + } + return stc.stc / stc.base; + } + return -1; +} + +void cDvbSdFfDevice::TrickSpeed(int Speed) +{ + if (fd_video >= 0) + CHECK(ioctl(fd_video, VIDEO_SLOWMOTION, Speed)); +} + +void cDvbSdFfDevice::Clear(void) +{ + if (fd_video >= 0) + CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER)); + if (fd_audio >= 0) + CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER)); + cDevice::Clear(); +} + +void cDvbSdFfDevice::Play(void) +{ + if (playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) { + if (fd_audio >= 0) + CHECK(ioctl(fd_audio, AUDIO_CONTINUE)); + } + else { + if (fd_audio >= 0) { + CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true)); + CHECK(ioctl(fd_audio, AUDIO_CONTINUE)); + } + if (fd_video >= 0) + CHECK(ioctl(fd_video, VIDEO_CONTINUE)); + } + cDevice::Play(); +} + +void cDvbSdFfDevice::Freeze(void) +{ + if (playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) { + if (fd_audio >= 0) + CHECK(ioctl(fd_audio, AUDIO_PAUSE)); + } + else { + if (fd_audio >= 0) { + CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false)); + CHECK(ioctl(fd_audio, AUDIO_PAUSE)); + } + if (fd_video >= 0) + CHECK(ioctl(fd_video, VIDEO_FREEZE)); + } + cDevice::Freeze(); +} + +void cDvbSdFfDevice::Mute(void) +{ + if (fd_audio >= 0) { + CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false)); + CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true)); + } + cDevice::Mute(); +} + +void cDvbSdFfDevice::StillPicture(const uchar *Data, int Length) +{ + if (!Data || Length < TS_SIZE) + return; + if (Data[0] == 0x47) { + // TS data + cDevice::StillPicture(Data, Length); + } + else if (Data[0] == 0x00 && Data[1] == 0x00 && Data[2] == 0x01 && (Data[3] & 0xF0) == 0xE0) { + // PES data + char *buf = MALLOC(char, Length); + if (!buf) + return; + int i = 0; + int blen = 0; + while (i < Length - 6) { + if (Data[i] == 0x00 && Data[i + 1] == 0x00 && Data[i + 2] == 0x01) { + int len = Data[i + 4] * 256 + Data[i + 5]; + if ((Data[i + 3] & 0xF0) == 0xE0) { // video packet + // skip PES header + int offs = i + 6; + // skip header extension + if ((Data[i + 6] & 0xC0) == 0x80) { + // MPEG-2 PES header + if (Data[i + 8] >= Length) + break; + offs += 3; + offs += Data[i + 8]; + len -= 3; + len -= Data[i + 8]; + if (len < 0 || offs + len > Length) + break; + } + else { + // MPEG-1 PES header + while (offs < Length && len > 0 && Data[offs] == 0xFF) { + offs++; + len--; + } + if (offs <= Length - 2 && len >= 2 && (Data[offs] & 0xC0) == 0x40) { + offs += 2; + len -= 2; + } + if (offs <= Length - 5 && len >= 5 && (Data[offs] & 0xF0) == 0x20) { + offs += 5; + len -= 5; + } + else if (offs <= Length - 10 && len >= 10 && (Data[offs] & 0xF0) == 0x30) { + offs += 10; + len -= 10; + } + else if (offs < Length && len > 0) { + offs++; + len--; + } + } + if (blen + len > Length) // invalid PES length field + break; + memcpy(&buf[blen], &Data[offs], len); + i = offs + len; + blen += len; + } + else if (Data[i + 3] >= 0xBD && Data[i + 3] <= 0xDF) // other PES packets + i += len + 6; + else + i++; + } + else + i++; + } + video_still_picture sp = { buf, blen }; + CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp)); + free(buf); + } + else { + // non-PES data + video_still_picture sp = { (char *)Data, Length }; + CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp)); + } +} + +bool cDvbSdFfDevice::Poll(cPoller &Poller, int TimeoutMs) +{ + Poller.Add((playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) ? fd_audio : fd_video, true); + return Poller.Poll(TimeoutMs); +} + +bool cDvbSdFfDevice::Flush(int TimeoutMs) +{ + //TODO actually this function should wait until all buffered data has been processed by the card, but how? + return true; +} + +int cDvbSdFfDevice::PlayVideo(const uchar *Data, int Length) +{ + return WriteAllOrNothing(fd_video, Data, Length, 1000, 10); +} + +int cDvbSdFfDevice::PlayAudio(const uchar *Data, int Length, uchar Id) +{ + return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10); +} + +int cDvbSdFfDevice::PlayTsVideo(const uchar *Data, int Length) +{ + return WriteAllOrNothing(fd_video, Data, Length, 1000, 10); +} + +int cDvbSdFfDevice::PlayTsAudio(const uchar *Data, int Length) +{ + return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10); +} + +// --- cDvbSdFfDeviceProbe --------------------------------------------------- + +bool cDvbSdFfDeviceProbe::Probe(int Adapter, int Frontend) +{ + static uint32_t SubsystemIds[] = { + 0x110A0000, // Fujitsu Siemens DVB-C + 0x13C20000, // Technotrend/Hauppauge WinTV DVB-S rev1.X or Fujitsu Siemens DVB-C + 0x13C20001, // Technotrend/Hauppauge WinTV DVB-T rev1.X + 0x13C20002, // Technotrend/Hauppauge WinTV DVB-C rev2.X + 0x13C20003, // Technotrend/Hauppauge WinTV Nexus-S rev2.X + 0x13C20004, // Galaxis DVB-S rev1.3 + 0x13C20006, // Fujitsu Siemens DVB-S rev1.6 + 0x13C20008, // Technotrend/Hauppauge DVB-T + 0x13C2000A, // Technotrend/Hauppauge WinTV Nexus-CA rev1.X + 0x13C2000E, // Technotrend/Hauppauge WinTV Nexus-S rev2.3 + 0x13C21002, // Technotrend/Hauppauge WinTV DVB-S rev1.3 SE + 0x00000000 + }; + cString FileName; + cReadLine ReadLine; + FILE *f = NULL; + uint32_t SubsystemId = 0; + FileName = cString::sprintf("/sys/class/dvb/dvb%d.frontend%d/device/subsystem_vendor", Adapter, Frontend); + if ((f = fopen(FileName, "r")) != NULL) { + if (char *s = ReadLine.Read(f)) + SubsystemId = strtoul(s, NULL, 0) << 16; + fclose(f); + } + FileName = cString::sprintf("/sys/class/dvb/dvb%d.frontend%d/device/subsystem_device", Adapter, Frontend); + if ((f = fopen(FileName, "r")) != NULL) { + if (char *s = ReadLine.Read(f)) + SubsystemId |= strtoul(s, NULL, 0); + fclose(f); + } + for (uint32_t *sid = SubsystemIds; *sid; sid++) { + if (*sid == SubsystemId) { + dsyslog("creating cDvbSdFfDevice"); + new cDvbSdFfDevice(Adapter, Frontend); + return true; + } + } + return false; +} diff --git a/PLUGINS/src/dvbsddevice/dvbsdffdevice.h b/PLUGINS/src/dvbsddevice/dvbsdffdevice.h new file mode 100644 index 0000000..b382bf6 --- /dev/null +++ b/PLUGINS/src/dvbsddevice/dvbsdffdevice.h @@ -0,0 +1,107 @@ +/* + * dvbsdffdevice.h: The DVB SD Full Featured device interface + * + * See the README file for copyright information and how to reach the author. + * + * $Id: dvbsdffdevice.h 2.11 2010/01/04 11:01:14 kls Exp $ + */ + +#ifndef __DVBSDFFDEVICE_H +#define __DVBSDFFDEVICE_H + +#include "vdr/dvbdevice.h" +#include "vdr/dvbspu.h" + +/// The cDvbSdFfDevice implements a DVB device which can be accessed through the Linux DVB driver API. + +class cDvbSdFfDevice : public cDvbDevice { +private: + int fd_osd, fd_audio, fd_video, fd_stc; +protected: + virtual void MakePrimaryDevice(bool On); +public: + cDvbSdFfDevice(int Adapter, int Frontend); + virtual ~cDvbSdFfDevice(); + virtual bool HasDecoder(void) const; + +// SPU facilities + +private: + cDvbSpuDecoder *spuDecoder; +public: + virtual cSpuDecoder *GetSpuDecoder(void); + +// Channel facilities + +private: + void TurnOffLiveMode(bool LiveView); +protected: + virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView); + +// PID handle facilities + +private: + bool SetAudioBypass(bool On); +protected: + virtual bool SetPid(cPidHandle *Handle, int Type, bool On); + +// Image Grab facilities + +private: + static int devVideoOffset; + int devVideoIndex; +public: + virtual uchar *GrabImage(int &Size, bool Jpeg = true, int Quality = -1, int SizeX = -1, int SizeY = -1); + +// Video format facilities + +public: + virtual void SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat); + virtual void SetVideoFormat(bool VideoFormat16_9); + virtual eVideoSystem GetVideoSystem(void); + virtual void GetVideoSize(int &Width, int &Height, double &VideoAspect); + virtual void GetOsdSize(int &Width, int &Height, double &PixelAspect); + +// Track facilities + +protected: + virtual void SetAudioTrackDevice(eTrackType Type); + +// Audio facilities + +private: + bool digitalAudio; +protected: + virtual int GetAudioChannelDevice(void); + virtual void SetAudioChannelDevice(int AudioChannel); + virtual void SetVolumeDevice(int Volume); + virtual void SetDigitalAudioDevice(bool On); + +// Player facilities + +protected: + ePlayMode playMode; + virtual bool CanReplay(void) const; + virtual bool SetPlayMode(ePlayMode PlayMode); + virtual int PlayVideo(const uchar *Data, int Length); + virtual int PlayAudio(const uchar *Data, int Length, uchar Id); + virtual int PlayTsVideo(const uchar *Data, int Length); + virtual int PlayTsAudio(const uchar *Data, int Length); +public: + virtual int64_t GetSTC(void); + virtual void TrickSpeed(int Speed); + virtual void Clear(void); + virtual void Play(void); + virtual void Freeze(void); + virtual void Mute(void); + virtual void StillPicture(const uchar *Data, int Length); + virtual bool Poll(cPoller &Poller, int TimeoutMs = 0); + virtual bool Flush(int TimeoutMs = 0); + }; + +class cDvbSdFfDeviceProbe : public cDvbDeviceProbe { +public: + virtual bool Probe(int Adapter, int Frontend); + }; + +#endif //__DVBSDFFDEVICE_H diff --git a/dvbosd.c b/PLUGINS/src/dvbsddevice/dvbsdffosd.c index ab34cbd..4ff8db9 100644 --- a/dvbosd.c +++ b/PLUGINS/src/dvbsddevice/dvbsdffosd.c @@ -1,26 +1,24 @@ /* - * dvbosd.c: Implementation of the DVB On Screen Display + * dvbsdffosd.c: Implementation of the DVB SD Full Featured On Screen Display * - * See the main source file 'vdr.c' for copyright information and - * how to reach the author. + * See the README file for copyright information and how to reach the author. * - * $Id: dvbosd.c 2.0 2007/09/16 08:55:54 kls Exp $ + * $Id: dvbsdffosd.c 2.1 2009/12/29 11:52:48 kls Exp $ */ -#include "dvbosd.h" +#include "dvbsdffosd.h" #include <linux/dvb/osd.h> #include <signal.h> #include <sys/ioctl.h> #include <sys/unistd.h> -#include "dvbdevice.h" -#include "tools.h" +#include "vdr/tools.h" -// --- cDvbOsd --------------------------------------------------------------- +// --- cDvbSdFfOsd ----------------------------------------------------------- #define MAXNUMWINDOWS 7 // OSD windows are counted 1...7 #define MAXOSDMEMORY 92000 // number of bytes available to the OSD (for unmodified DVB cards) -class cDvbOsd : public cOsd { +class cDvbSdFfOsd : public cOsd { private: int osdDev; int osdMem; @@ -29,14 +27,14 @@ private: protected: virtual void SetActive(bool On); public: - cDvbOsd(int Left, int Top, int OsdDev, uint Level); - virtual ~cDvbOsd(); + cDvbSdFfOsd(int Left, int Top, int OsdDev, uint Level); + virtual ~cDvbSdFfOsd(); virtual eOsdError CanHandleAreas(const tArea *Areas, int NumAreas); virtual eOsdError SetAreas(const tArea *Areas, int NumAreas); virtual void Flush(void); }; -cDvbOsd::cDvbOsd(int Left, int Top, int OsdDev, uint Level) +cDvbSdFfOsd::cDvbSdFfOsd(int Left, int Top, int OsdDev, uint Level) :cOsd(Left, Top, Level) { osdDev = OsdDev; @@ -55,12 +53,12 @@ cDvbOsd::cDvbOsd(int Left, int Top, int OsdDev, uint Level) } } -cDvbOsd::~cDvbOsd() +cDvbSdFfOsd::~cDvbSdFfOsd() { SetActive(false); } -void cDvbOsd::SetActive(bool On) +void cDvbSdFfOsd::SetActive(bool On) { if (On != Active()) { cOsd::SetActive(On); @@ -85,7 +83,7 @@ void cDvbOsd::SetActive(bool On) } } -eOsdError cDvbOsd::CanHandleAreas(const tArea *Areas, int NumAreas) +eOsdError cDvbSdFfOsd::CanHandleAreas(const tArea *Areas, int NumAreas) { eOsdError Result = cOsd::CanHandleAreas(Areas, NumAreas); if (Result == oeOk) { @@ -107,7 +105,7 @@ eOsdError cDvbOsd::CanHandleAreas(const tArea *Areas, int NumAreas) return Result; } -eOsdError cDvbOsd::SetAreas(const tArea *Areas, int NumAreas) +eOsdError cDvbSdFfOsd::SetAreas(const tArea *Areas, int NumAreas) { if (shown) { cBitmap *Bitmap; @@ -120,7 +118,7 @@ eOsdError cDvbOsd::SetAreas(const tArea *Areas, int NumAreas) return cOsd::SetAreas(Areas, NumAreas); } -void cDvbOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, const void *data) +void cDvbSdFfOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, const void *data) { if (osdDev >= 0) { osd_cmd_t dc; @@ -135,7 +133,7 @@ void cDvbOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, co } } -void cDvbOsd::Flush(void) +void cDvbSdFfOsd::Flush(void) { if (!Active()) return; @@ -211,5 +209,5 @@ cDvbOsdProvider::cDvbOsdProvider(int OsdDev) cOsd *cDvbOsdProvider::CreateOsd(int Left, int Top, uint Level) { - return new cDvbOsd(Left, Top, osdDev, Level); + return new cDvbSdFfOsd(Left, Top, osdDev, Level); } diff --git a/PLUGINS/src/dvbsddevice/dvbsdffosd.h b/PLUGINS/src/dvbsddevice/dvbsdffosd.h new file mode 100644 index 0000000..8a1bc62 --- /dev/null +++ b/PLUGINS/src/dvbsddevice/dvbsdffosd.h @@ -0,0 +1,22 @@ +/* + * dvbsdffosd.h: Implementation of the DVB SD Full Featured On Screen Display + * + * See the README file for copyright information and how to reach the author. + * + * $Id: dvbsdffosd.h 2.1 2009/12/29 11:52:05 kls Exp $ + */ + +#ifndef __DVBSDFFODF_H +#define __DVBSDFFODF_H + +#include "vdr/osd.h" + +class cDvbOsdProvider : public cOsdProvider { +private: + int osdDev; +public: + cDvbOsdProvider(int OsdDev); + virtual cOsd *CreateOsd(int Left, int Top, uint Level); + }; + +#endif //__DVBSDFFODF_H diff --git a/PLUGINS/src/hello/HISTORY b/PLUGINS/src/hello/HISTORY index 14e78f6..9adeab9 100644 --- a/PLUGINS/src/hello/HISTORY +++ b/PLUGINS/src/hello/HISTORY @@ -63,6 +63,10 @@ VDR Plugin 'hello' Revision History - Updated the Croatian language texts (thanks to Adrian Caval). -2008-009-06 Version 0.2.3 +2008-09-06: Version 0.2.3 - Updated the Turkish language texts (thanks to Oktay Yolgeçen). + +2009-12-06: Version 0.2.4 + +- Several code modifications to avoid compiler warnings (thanks to Winfried Köhler). diff --git a/PLUGINS/src/hello/hello.c b/PLUGINS/src/hello/hello.c index 86adee6..32a74e3 100644 --- a/PLUGINS/src/hello/hello.c +++ b/PLUGINS/src/hello/hello.c @@ -3,7 +3,7 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: hello.c 2.1 2008/09/06 15:07:12 kls Exp $ + * $Id: hello.c 2.2 2009/12/06 12:30:15 kls Exp $ */ #include <getopt.h> @@ -12,7 +12,7 @@ #include <vdr/interface.h> #include <vdr/plugin.h> -static const char *VERSION = "0.2.3"; +static const char *VERSION = "0.2.4"; static const char *DESCRIPTION = trNOOP("A friendly greeting"); static const char *MAINMENUENTRY = trNOOP("Hello"); @@ -96,7 +96,7 @@ bool cPluginHello::ProcessArgs(int argc, char *argv[]) static struct option long_options[] = { { "aaa", required_argument, NULL, 'a' }, { "bbb", no_argument, NULL, 'b' }, - { NULL } + { NULL, no_argument, NULL, 0 } }; int c; diff --git a/PLUGINS/src/pictures/HISTORY b/PLUGINS/src/pictures/HISTORY index 5f24a74..34da938 100644 --- a/PLUGINS/src/pictures/HISTORY +++ b/PLUGINS/src/pictures/HISTORY @@ -33,3 +33,7 @@ VDR Plugin 'pictures' Revision History 2008-03-14: Version 0.0.7 - Added Russian translations (thanks to Alexander Gross). + +2009-12-06: Version 0.0.8 + +- Several code modifications to avoid compiler warnings (thanks to Winfried Köhler). diff --git a/PLUGINS/src/pictures/pictures.c b/PLUGINS/src/pictures/pictures.c index 9c4e515..9de6889 100644 --- a/PLUGINS/src/pictures/pictures.c +++ b/PLUGINS/src/pictures/pictures.c @@ -3,7 +3,7 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: pictures.c 2.0 2008/03/14 12:57:19 kls Exp $ + * $Id: pictures.c 2.1 2009/12/06 12:30:21 kls Exp $ */ #include <getopt.h> @@ -11,7 +11,7 @@ #include "menu.h" #include "player.h" -static const char *VERSION = "0.0.7"; +static const char *VERSION = "0.0.8"; static const char *DESCRIPTION = trNOOP("A simple picture viewer"); static const char *MAINMENUENTRY = trNOOP("Pictures"); @@ -82,7 +82,7 @@ bool cPluginPictures::ProcessArgs(int argc, char *argv[]) // Implement command line argument processing here if applicable. static struct option long_options[] = { { "dir", required_argument, NULL, 'd' }, - { NULL } + { NULL, no_argument, NULL, 0 } }; int c; diff --git a/PLUGINS/src/skincurses/HISTORY b/PLUGINS/src/skincurses/HISTORY index cf793cd..ca820f9 100644 --- a/PLUGINS/src/skincurses/HISTORY +++ b/PLUGINS/src/skincurses/HISTORY @@ -79,3 +79,8 @@ VDR Plugin 'skincurses' Revision History 2008-03-14: Version 0.1.7 - Added Russian translations (thanks to Alexander Gross). + +2010-01-03: Version 0.1.8 + +- Displaying "genre" in event descriptions. +- Displaying "parental rating" in event descriptions. diff --git a/PLUGINS/src/skincurses/skincurses.c b/PLUGINS/src/skincurses/skincurses.c index 8a7a846..d8134f6 100644 --- a/PLUGINS/src/skincurses/skincurses.c +++ b/PLUGINS/src/skincurses/skincurses.c @@ -3,7 +3,7 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: skincurses.c 2.0 2008/03/14 12:57:14 kls Exp $ + * $Id: skincurses.c 2.3 2010/01/03 14:59:16 kls Exp $ */ #include <ncurses.h> @@ -11,7 +11,7 @@ #include <vdr/plugin.h> #include <vdr/skins.h> -static const char *VERSION = "0.1.7"; +static const char *VERSION = "0.1.8"; static const char *DESCRIPTION = trNOOP("A text only skin"); static const char *MAINMENUENTRY = NULL; @@ -402,6 +402,10 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event) osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font); } y += ts.Height(); + if (Event->ParentalRating()) { + cString buffer = cString::sprintf(" %s ", *Event->GetParentalRatingString()); + osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font); + } y += 1; ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->Title(), &Font, clrCyan, clrBackground); y += ts.Height(); @@ -409,6 +413,13 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event) ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->ShortText(), &Font, clrYellow, clrBackground); y += ts.Height(); } + for (int i = 0; Event->Contents(i); i++) { + const char *s = Event->ContentToString(Event->Contents(i)); + if (!isempty(s)) { + ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, s, &Font, clrYellow, clrBackground); + y += 1; + } + } y += 1; if (!isempty(Event->Description())) { textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Event->Description(), &Font, clrCyan, clrBackground); @@ -427,6 +438,10 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording) snprintf(t, sizeof(t), "%s %s", *DateString(Recording->start), *TimeString(Recording->start)); ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground); y += ts.Height(); + if (Info->GetEvent()->ParentalRating()) { + cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString()); + osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font); + } y += 1; const char *Title = Info->Title(); if (isempty(Title)) @@ -437,6 +452,13 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording) ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Info->ShortText(), &Font, clrYellow, clrBackground); y += ts.Height(); } + for (int i = 0; Info->GetEvent()->Contents(i); i++) { + const char *s = Info->GetEvent()->ContentToString(Info->GetEvent()->Contents(i)); + if (!isempty(s)) { + ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, s, &Font, clrYellow, clrBackground); + y += 1; + } + } y += 1; if (!isempty(Info->Description())) { textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Info->Description(), &Font, clrCyan, clrBackground); diff --git a/PLUGINS/src/sky/HISTORY b/PLUGINS/src/sky/HISTORY deleted file mode 100644 index 25b8fc8..0000000 --- a/PLUGINS/src/sky/HISTORY +++ /dev/null @@ -1,70 +0,0 @@ -VDR Plugin 'sky' Revision History ---------------------------------- - -2002-12-01: Version 0.0.1 - -- Initial revision. - -2002-12-13: Version 0.1.0 - -- Changed setting of CXX and CXXFLAGS variables in Makefile. - -2003-05-09: Version 0.1.1 - -- Changed Start() to Initialize(). - -2004-01-04: Version 0.2.0 - -- Implemented automatic PID switching and channel detection - -2004-02-15: Version 0.3.0 - -- Now using the actual channel IDs a derived from the data stream. -- Switched EPG data retrieval to http://www.bleb.org. -- Added automatic DST detection to getskyepg.pl. -- Fixed handling receivers, so that a recording on the same channel - won't interrupt an ongoing Transfer mode. - -2004-10-16: Version 0.3.1 - -- Improved buffer handling. - -2004-12-12: Version 0.3.2 - -- Changed Apid access in cChannel. - -2004-12-19: Version 0.3.3 - -- Made several functions threadsafe. -- Removed delay_ms(), using cCondWait::SleepMs() instead. - -2005-09-17: Version 0.3.4 - -- Added a missing include statement. - -2006-03-26: Version 0.3.5 - -- Fixed format string handling. - -2006-12-02: Version 0.3.5 (version number not increased) - -- Made the getskyepg.pl script send a user agent message to - the server, according to the rules at http://bleb.org/tv/data/listings. - If your version of 'wget' doesn't support the -U option to set the user agent, - use the new option -U of getskyepg.pl to have the information added to the URL - as a query string. -- The getskyepg.pl script now replaces "&" 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/&/&/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! @@ -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); @@ -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; } @@ -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; } @@ -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; @@ -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 @@ -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; +} @@ -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 @@ -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"); } @@ -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); @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: diseqc.c 2.0 2008/02/10 14:09:27 kls Exp $ + * $Id: diseqc.c 2.1 2009/12/05 15:57:02 kls Exp $ */ #include "diseqc.h" @@ -36,7 +36,7 @@ bool cDiseqc::Parse(const char *s) if (4 <= fields && fields <= 5) { source = cSource::FromString(sourcebuf); if (Sources.Get(source)) { - polarization = toupper(polarization); + polarization = char(toupper(polarization)); if (polarization == 'V' || polarization == 'H' || polarization == 'L' || polarization == 'R') { parsing = true; char *CurrentAction = NULL; @@ -81,7 +81,7 @@ char *cDiseqc::Codes(char *s) errno = 0; int n = strtol(t, &p, 16); if (!errno && p != t && 0 <= n && n <= 255) { - codes[numCodes++] = n; + codes[numCodes++] = uchar(n); t = skipspace(p); } else { diff --git a/dvbdevice.c b/dvbdevice.c index dd425c8..07e2dbb 100644 --- a/dvbdevice.c +++ b/dvbdevice.c @@ -1,44 +1,22 @@ /* - * dvbdevice.c: The DVB device interface + * dvbdevice.c: The DVB device tuner interface * * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbdevice.c 2.21 2009/06/06 11:17:20 kls Exp $ + * $Id: dvbdevice.c 2.24 2010/01/04 14:06:24 kls Exp $ */ #include "dvbdevice.h" #include <errno.h> #include <limits.h> -#include <linux/videodev2.h> -#include <linux/dvb/audio.h> #include <linux/dvb/dmx.h> #include <linux/dvb/frontend.h> -#include <linux/dvb/video.h> #include <sys/ioctl.h> #include <sys/mman.h> #include "channels.h" #include "diseqc.h" #include "dvbci.h" -#include "dvbosd.h" -#include "eitscan.h" -#include "player.h" -#include "receiver.h" -#include "status.h" -#include "transfer.h" - -#define DO_REC_AND_PLAY_ON_PRIMARY_DEVICE 1 -#define DO_MULTIPLE_RECORDINGS 1 - -#define DEV_VIDEO "/dev/video" -#define DEV_DVB_ADAPTER "/dev/dvb/adapter" -#define DEV_DVB_OSD "osd" -#define DEV_DVB_FRONTEND "frontend" -#define DEV_DVB_DVR "dvr" -#define DEV_DVB_DEMUX "demux" -#define DEV_DVB_VIDEO "video" -#define DEV_DVB_AUDIO "audio" -#define DEV_DVB_CA "ca" #define DVBS_TUNE_TIMEOUT 9000 //ms #define DVBS_LOCK_TIMEOUT 2000 //ms @@ -47,32 +25,13 @@ #define DVBT_TUNE_TIMEOUT 9000 //ms #define DVBT_LOCK_TIMEOUT 2000 //ms -class cDvbName { -private: - char buffer[PATH_MAX]; -public: - cDvbName(const char *Name, int n) { - snprintf(buffer, sizeof(buffer), "%s%d/%s%d", DEV_DVB_ADAPTER, n, Name, 0); - } - const char *operator*() { return buffer; } - }; - -static int DvbOpen(const char *Name, int n, int Mode, bool ReportError = false) -{ - const char *FileName = *cDvbName(Name, n); - int fd = open(FileName, Mode); - if (fd < 0 && ReportError) - LOG_ERROR_STR(FileName); - return fd; -} - // --- cDvbTuner ------------------------------------------------------------- class cDvbTuner : public cThread { private: enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked }; int fd_frontend; - int cardIndex; + int adapter, frontend; int tuneTimeout; int lockTimeout; time_t lastTimeoutReport; @@ -87,17 +46,18 @@ private: bool SetFrontend(void); virtual void Action(void); public: - cDvbTuner(int Fd_Frontend, int CardIndex, fe_delivery_system FrontendType); + cDvbTuner(int Fd_Frontend, int Adapter, int Frontend, fe_delivery_system FrontendType); virtual ~cDvbTuner(); bool IsTunedTo(const cChannel *Channel) const; - void Set(const cChannel *Channel, bool Tune); + void Set(const cChannel *Channel); bool Locked(int TimeoutMs = 0); }; -cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, fe_delivery_system FrontendType) +cDvbTuner::cDvbTuner(int Fd_Frontend, int Adapter, int Frontend, fe_delivery_system FrontendType) { fd_frontend = Fd_Frontend; - cardIndex = CardIndex; + adapter = Adapter; + frontend = Frontend; frontendType = FrontendType; tuneTimeout = 0; lockTimeout = 0; @@ -106,7 +66,7 @@ cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, fe_delivery_system Frontend tunerStatus = tsIdle; if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2) CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13)); // must explicitly turn on LNB power - SetDescription("tuner on device %d", cardIndex + 1); + SetDescription("tuner on frontend %d/%d", adapter, frontend); Start(); } @@ -141,10 +101,10 @@ bool cDvbTuner::IsTunedTo(const cChannel *Channel) const return true; } -void cDvbTuner::Set(const cChannel *Channel, bool Tune) +void cDvbTuner::Set(const cChannel *Channel) { cMutexLock MutexLock(&mutex); - if (Tune) + if (!IsTunedTo(Channel)) tunerStatus = tsSet; channel = *Channel; lastTimeoutReport = 0; @@ -195,7 +155,7 @@ bool cDvbTuner::SetFrontend(void) #define SETCMD(c, d) { Frontend[CmdSeq.num].cmd = (c);\ Frontend[CmdSeq.num].u.data = (d);\ if (CmdSeq.num++ > MAXFRONTENDCMDS) {\ - esyslog("ERROR: too many tuning commands on frontend %d", cardIndex);\ + esyslog("ERROR: too many tuning commands on frontend %d/%d", adapter, frontend);\ return false;\ }\ } @@ -206,7 +166,7 @@ bool cDvbTuner::SetFrontend(void) CmdSeq.props = Frontend; SETCMD(DTV_CLEAR, 0); if (ioctl(fd_frontend, FE_SET_PROPERTY, &CmdSeq) < 0) { - esyslog("ERROR: frontend %d: %m", cardIndex); + esyslog("ERROR: frontend %d/%d: %m", adapter, frontend); return false; } CmdSeq.num = 0; @@ -238,6 +198,7 @@ bool cDvbTuner::SetFrontend(void) } } break; + default: esyslog("ERROR: unknown diseqc command %d", da); } } diseqcCommands = diseqc->Commands(); @@ -279,7 +240,7 @@ bool cDvbTuner::SetFrontend(void) SETCMD(DTV_ROLLOFF, channel.RollOff()); } else { - esyslog("ERROR: frontend %d doesn't provide DVB-S2", cardIndex); + esyslog("ERROR: frontend %d/%d doesn't provide DVB-S2", adapter, frontend); return false; } } @@ -325,7 +286,7 @@ bool cDvbTuner::SetFrontend(void) } SETCMD(DTV_TUNE, 0); if (ioctl(fd_frontend, FE_SET_PROPERTY, &CmdSeq) < 0) { - esyslog("ERROR: frontend %d: %m", cardIndex); + esyslog("ERROR: frontend %d/%d: %m", adapter, frontend); return false; } return true; @@ -353,7 +314,7 @@ void cDvbTuner::Action(void) tunerStatus = tsSet; diseqcCommands = NULL; if (time(NULL) - lastTimeoutReport > 60) { // let's not get too many of these - isyslog("frontend %d timed out while tuning to channel %d, tp %d", cardIndex, channel.Number(), channel.Transponder()); + isyslog("frontend %d/%d timed out while tuning to channel %d, tp %d", adapter, frontend, channel.Number(), channel.Transponder()); lastTimeoutReport = time(NULL); } continue; @@ -362,13 +323,13 @@ void cDvbTuner::Action(void) if (Status & FE_REINIT) { tunerStatus = tsSet; diseqcCommands = NULL; - isyslog("frontend %d was reinitialized", cardIndex); + isyslog("frontend %d/%d was reinitialized", adapter, frontend); lastTimeoutReport = 0; continue; } else if (Status & FE_HAS_LOCK) { if (LostLock) { - isyslog("frontend %d regained lock on channel %d, tp %d", cardIndex, channel.Number(), channel.Transponder()); + isyslog("frontend %d/%d regained lock on channel %d, tp %d", adapter, frontend, channel.Number(), channel.Transponder()); LostLock = false; } tunerStatus = tsLocked; @@ -377,12 +338,14 @@ void cDvbTuner::Action(void) } else if (tunerStatus == tsLocked) { LostLock = true; - isyslog("frontend %d lost lock on channel %d, tp %d", cardIndex, channel.Number(), channel.Transponder()); + isyslog("frontend %d/%d lost lock on channel %d, tp %d", adapter, frontend, channel.Number(), channel.Transponder()); tunerStatus = tsTuned; Timer.Set(lockTimeout); lastTimeoutReport = 0; continue; } + break; + default: esyslog("ERROR: unknown tuner status %d", tunerStatus); } if (tunerStatus != tsTuned) @@ -392,7 +355,6 @@ void cDvbTuner::Action(void) // --- cDvbDevice ------------------------------------------------------------ -int cDvbDevice::devVideoOffset = -1; int cDvbDevice::setTransferModeForDolbyDigital = 1; const char *DeliverySystems[] = { @@ -415,30 +377,22 @@ const char *DeliverySystems[] = { NULL }; -cDvbDevice::cDvbDevice(int n) +cDvbDevice::cDvbDevice(int Adapter, int Frontend) { + adapter = Adapter; + frontend = Frontend; ciAdapter = NULL; dvbTuner = NULL; frontendType = SYS_UNDEFINED; numProvidedSystems = 0; - spuDecoder = NULL; - digitalAudio = false; - playMode = pmNone; // Devices that are present on all card types: - int fd_frontend = DvbOpen(DEV_DVB_FRONTEND, n, O_RDWR | O_NONBLOCK); - - // Devices that are only present on cards with decoders: - - fd_osd = DvbOpen(DEV_DVB_OSD, n, O_RDWR); - fd_video = DvbOpen(DEV_DVB_VIDEO, n, O_RDWR | O_NONBLOCK); - fd_audio = DvbOpen(DEV_DVB_AUDIO, n, O_RDWR | O_NONBLOCK); - fd_stc = DvbOpen(DEV_DVB_DEMUX, n, O_RDWR); + int fd_frontend = DvbOpen(DEV_DVB_FRONTEND, adapter, frontend, O_RDWR | O_NONBLOCK); // Common Interface: - fd_ca = DvbOpen(DEV_DVB_CA, n, O_RDWR); + fd_ca = DvbOpen(DEV_DVB_CA, adapter, frontend, O_RDWR); if (fd_ca >= 0) ciAdapter = cDvbCiAdapter::CreateCiAdapter(this, fd_ca); @@ -446,39 +400,6 @@ cDvbDevice::cDvbDevice(int n) fd_dvr = -1; - // The offset of the /dev/video devices: - - if (devVideoOffset < 0) { // the first one checks this - FILE *f = NULL; - char buffer[PATH_MAX]; - for (int ofs = 0; ofs < 100; ofs++) { - snprintf(buffer, sizeof(buffer), "/proc/video/dev/video%d", ofs); - if ((f = fopen(buffer, "r")) != NULL) { - if (fgets(buffer, sizeof(buffer), f)) { - if (strstr(buffer, "DVB Board")) { // found the _first_ DVB card - devVideoOffset = ofs; - dsyslog("video device offset is %d", devVideoOffset); - break; - } - } - else - break; - fclose(f); - } - else - break; - } - if (devVideoOffset < 0) - devVideoOffset = 0; - if (f) - fclose(f); - } - devVideoIndex = (devVideoOffset >= 0 && HasDecoder()) ? devVideoOffset++ : -1; - - // Video format: - - SetVideoFormat(Setup.VideoFormat); - // We only check the devices that must be present - the others will be checked before accessing them://XXX if (fd_frontend >= 0) { @@ -488,7 +409,7 @@ cDvbDevice::cDvbDevice(int n) case FE_OFDM: frontendType = SYS_DVBT; break; case FE_QAM: frontendType = SYS_DVBC_ANNEX_AC; break; case FE_ATSC: frontendType = SYS_ATSC; break; - default: esyslog("ERROR: unknown frontend type %d on device %d", frontendInfo.type, CardIndex() + 1); + default: esyslog("ERROR: unknown frontend type %d on frontend %d/%d", frontendInfo.type, adapter, frontend); } } else @@ -497,12 +418,12 @@ cDvbDevice::cDvbDevice(int n) numProvidedSystems++; if (frontendType == SYS_DVBS2) numProvidedSystems++; - isyslog("device %d provides %s (\"%s\")", CardIndex() + 1, DeliverySystems[frontendType], frontendInfo.name); - dvbTuner = new cDvbTuner(fd_frontend, CardIndex(), frontendType); + isyslog("frontend %d/%d provides %s (\"%s\")", adapter, frontend, DeliverySystems[frontendType], frontendInfo.name); + dvbTuner = new cDvbTuner(fd_frontend, adapter, frontend, frontendType); } } else - esyslog("ERROR: can't open DVB device %d", n); + esyslog("ERROR: can't open DVB device %d/%d", adapter, frontend); StartSectionHandler(); } @@ -510,63 +431,86 @@ cDvbDevice::cDvbDevice(int n) cDvbDevice::~cDvbDevice() { StopSectionHandler(); - delete spuDecoder; delete dvbTuner; delete ciAdapter; // We're not explicitly closing any device files here, since this sometimes // caused segfaults. Besides, the program is about to terminate anyway... } -bool cDvbDevice::Probe(const char *FileName) +cString cDvbDevice::DvbName(const char *Name, int Adapter, int Frontend) { + return cString::sprintf("%s%d/%s%d", DEV_DVB_ADAPTER, Adapter, Name, Frontend); +} + +int cDvbDevice::DvbOpen(const char *Name, int Adapter, int Frontend, int Mode, bool ReportError) +{ + cString FileName = DvbName(Name, Adapter, Frontend); + int fd = open(FileName, Mode); + if (fd < 0 && ReportError) + LOG_ERROR_STR(*FileName); + return fd; +} + +bool cDvbDevice::Exists(int Adapter, int Frontend) +{ + cString FileName = DvbName(DEV_DVB_FRONTEND, Adapter, Frontend); if (access(FileName, F_OK) == 0) { - dsyslog("probing %s", FileName); int f = open(FileName, O_RDONLY); if (f >= 0) { close(f); return true; } else if (errno != ENODEV && errno != EINVAL) - LOG_ERROR_STR(FileName); + LOG_ERROR_STR(*FileName); } else if (errno != ENOENT) - LOG_ERROR_STR(FileName); + LOG_ERROR_STR(*FileName); return false; } -bool cDvbDevice::Initialize(void) +bool cDvbDevice::Probe(int Adapter, int Frontend) { - int found = 0; - int i; - for (i = 0; i < MAXDVBDEVICES; i++) { - if (UseDevice(NextCardIndex())) { - if (Probe(*cDvbName(DEV_DVB_FRONTEND, i))) { - new cDvbDevice(i); - found++; - } - else - break; - } - else - NextCardIndex(1); // skips this one + cString FileName = DvbName(DEV_DVB_FRONTEND, Adapter, Frontend); + dsyslog("probing %s", *FileName); + for (cDvbDeviceProbe *dp = DvbDeviceProbes.First(); dp; dp = DvbDeviceProbes.Next(dp)) { + if (dp->Probe(Adapter, Frontend)) + return true; // a plugin has created the actual device } - NextCardIndex(MAXDVBDEVICES - i); // skips the rest - if (found > 0) - isyslog("found %d video device%s", found, found > 1 ? "s" : ""); - else - isyslog("no DVB device found"); - return found > 0; -} - -void cDvbDevice::MakePrimaryDevice(bool On) -{ - if (On && HasDecoder()) - new cDvbOsdProvider(fd_osd); + dsyslog("creating cDvbDevice"); + new cDvbDevice(Adapter, Frontend); // it's a "budget" device + return true; } -bool cDvbDevice::HasDecoder(void) const +bool cDvbDevice::Initialize(void) { - return fd_video >= 0 && fd_audio >= 0; + int Checked = 0; + int Found = 0; + for (int Adapter = 0; ; Adapter++) { + for (int Frontend = 0; ; Frontend++) { + if (Exists(Adapter, Frontend)) { + if (Checked++ < MAXDVBDEVICES) { + if (UseDevice(NextCardIndex())) { + if (Probe(Adapter, Frontend)) + Found++; + } + else + NextCardIndex(1); // skips this one + } + } + else if (Frontend == 0) + goto LastAdapter; + else + goto NextAdapter; + } + NextAdapter: ; + } +LastAdapter: + NextCardIndex(MAXDVBDEVICES - Checked); // skips the rest + if (Found > 0) + isyslog("found %d DVB device%s", Found, Found > 1 ? "s" : ""); + else + isyslog("no DVB device found"); + return Found > 0; } bool cDvbDevice::Ready(void) @@ -576,234 +520,11 @@ bool cDvbDevice::Ready(void) return true; } -cSpuDecoder *cDvbDevice::GetSpuDecoder(void) -{ - if (!spuDecoder && IsPrimaryDevice()) - spuDecoder = new cDvbSpuDecoder(); - return spuDecoder; -} - bool cDvbDevice::HasCi(void) { return ciAdapter; } -uchar *cDvbDevice::GrabImage(int &Size, bool Jpeg, int Quality, int SizeX, int SizeY) -{ - if (devVideoIndex < 0) - return NULL; - char buffer[PATH_MAX]; - snprintf(buffer, sizeof(buffer), "%s%d", DEV_VIDEO, devVideoIndex); - int videoDev = open(buffer, O_RDWR); - if (videoDev >= 0) { - uchar *result = NULL; - // set up the size and RGB - v4l2_format fmt; - memset(&fmt, 0, sizeof(fmt)); - fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - fmt.fmt.pix.width = SizeX; - fmt.fmt.pix.height = SizeY; - fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_BGR24; - fmt.fmt.pix.field = V4L2_FIELD_ANY; - if (ioctl(videoDev, VIDIOC_S_FMT, &fmt) == 0) { - v4l2_requestbuffers reqBuf; - memset(&reqBuf, 0, sizeof(reqBuf)); - reqBuf.count = 2; - reqBuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - reqBuf.memory = V4L2_MEMORY_MMAP; - if (ioctl(videoDev, VIDIOC_REQBUFS, &reqBuf) >= 0) { - v4l2_buffer mbuf; - memset(&mbuf, 0, sizeof(mbuf)); - mbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - mbuf.memory = V4L2_MEMORY_MMAP; - if (ioctl(videoDev, VIDIOC_QUERYBUF, &mbuf) == 0) { - int msize = mbuf.length; - unsigned char *mem = (unsigned char *)mmap(0, msize, PROT_READ | PROT_WRITE, MAP_SHARED, videoDev, 0); - if (mem && mem != (unsigned char *)-1) { - v4l2_buffer buf; - memset(&buf, 0, sizeof(buf)); - buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - buf.memory = V4L2_MEMORY_MMAP; - buf.index = 0; - if (ioctl(videoDev, VIDIOC_QBUF, &buf) == 0) { - v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - if (ioctl (videoDev, VIDIOC_STREAMON, &type) == 0) { - memset(&buf, 0, sizeof(buf)); - buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - buf.memory = V4L2_MEMORY_MMAP; - buf.index = 0; - if (ioctl(videoDev, VIDIOC_DQBUF, &buf) == 0) { - if (ioctl(videoDev, VIDIOC_STREAMOFF, &type) == 0) { - // make RGB out of BGR: - int memsize = fmt.fmt.pix.width * fmt.fmt.pix.height; - unsigned char *mem1 = mem; - for (int i = 0; i < memsize; i++) { - unsigned char tmp = mem1[2]; - mem1[2] = mem1[0]; - mem1[0] = tmp; - mem1 += 3; - } - - if (Quality < 0) - Quality = 100; - - dsyslog("grabbing to %s %d %d %d", Jpeg ? "JPEG" : "PNM", Quality, fmt.fmt.pix.width, fmt.fmt.pix.height); - if (Jpeg) { - // convert to JPEG: - result = RgbToJpeg(mem, fmt.fmt.pix.width, fmt.fmt.pix.height, Size, Quality); - if (!result) - esyslog("ERROR: failed to convert image to JPEG"); - } - else { - // convert to PNM: - char buf[32]; - snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", fmt.fmt.pix.width, fmt.fmt.pix.height); - int l = strlen(buf); - int bytes = memsize * 3; - Size = l + bytes; - result = MALLOC(uchar, Size); - if (result) { - memcpy(result, buf, l); - memcpy(result + l, mem, bytes); - } - else - esyslog("ERROR: failed to convert image to PNM"); - } - } - else - esyslog("ERROR: video device VIDIOC_STREAMOFF failed"); - } - else - esyslog("ERROR: video device VIDIOC_DQBUF failed"); - } - else - esyslog("ERROR: video device VIDIOC_STREAMON failed"); - } - else - esyslog("ERROR: video device VIDIOC_QBUF failed"); - munmap(mem, msize); - } - else - esyslog("ERROR: failed to memmap video device"); - } - else - esyslog("ERROR: video device VIDIOC_QUERYBUF failed"); - } - else - esyslog("ERROR: video device VIDIOC_REQBUFS failed"); - } - else - esyslog("ERROR: video device VIDIOC_S_FMT failed"); - close(videoDev); - return result; - } - else - LOG_ERROR_STR(buffer); - return NULL; -} - -void cDvbDevice::SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat) -{ - cDevice::SetVideoDisplayFormat(VideoDisplayFormat); - if (HasDecoder()) { - if (Setup.VideoFormat) { - CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_LETTER_BOX)); - } - else { - switch (VideoDisplayFormat) { - case vdfPanAndScan: - CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_PAN_SCAN)); - break; - case vdfLetterBox: - CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_LETTER_BOX)); - break; - case vdfCenterCutOut: - CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_CENTER_CUT_OUT)); - break; - } - } - } -} - -void cDvbDevice::SetVideoFormat(bool VideoFormat16_9) -{ - if (HasDecoder()) { - CHECK(ioctl(fd_video, VIDEO_SET_FORMAT, VideoFormat16_9 ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3)); - SetVideoDisplayFormat(eVideoDisplayFormat(Setup.VideoDisplayFormat)); - } -} - -eVideoSystem cDvbDevice::GetVideoSystem(void) -{ - eVideoSystem VideoSystem = vsPAL; - if (fd_video >= 0) { - video_size_t vs; - if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) { - if (vs.h == 480 || vs.h == 240) - VideoSystem = vsNTSC; - } - else - LOG_ERROR; - } - return VideoSystem; -} - -void cDvbDevice::GetVideoSize(int &Width, int &Height, double &VideoAspect) -{ - if (fd_video >= 0) { - video_size_t vs; - if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) { - Width = vs.w; - Height = vs.h; - switch (vs.aspect_ratio) { - default: - case VIDEO_FORMAT_4_3: VideoAspect = 4.0 / 3.0; break; - case VIDEO_FORMAT_16_9: VideoAspect = 16.0 / 9.0; break; - case VIDEO_FORMAT_221_1: VideoAspect = 2.21; break; - } - return; - } - else - LOG_ERROR; - } - cDevice::GetVideoSize(Width, Height, VideoAspect); -} - -void cDvbDevice::GetOsdSize(int &Width, int &Height, double &PixelAspect) -{ - if (fd_video >= 0) { - video_size_t vs; - if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) { - Width = 720; - if (vs.h != 480 && vs.h != 240) - Height = 576; // PAL - else - Height = 480; // NTSC - switch (Setup.VideoFormat ? vs.aspect_ratio : VIDEO_FORMAT_4_3) { - default: - case VIDEO_FORMAT_4_3: PixelAspect = 4.0 / 3.0; break; - case VIDEO_FORMAT_221_1: // FF DVB cards only distinguish between 4:3 and 16:9 - case VIDEO_FORMAT_16_9: PixelAspect = 16.0 / 9.0; break; - } - PixelAspect /= double(Width) / Height; - return; - } - else - LOG_ERROR; - } - cDevice::GetOsdSize(Width, Height, PixelAspect); -} - -bool cDvbDevice::SetAudioBypass(bool On) -{ - if (setTransferModeForDolbyDigital != 1) - return false; - return ioctl(fd_audio, AUDIO_SET_BYPASS_MODE, On) == 0; -} - -// ptAudio ptVideo ptPcr ptTeletext ptDolby ptOther -dmx_pes_type_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_PCR, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER }; - bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On) { if (Handle->pid) { @@ -811,7 +532,7 @@ bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On) memset(&pesFilterParams, 0, sizeof(pesFilterParams)); if (On) { if (Handle->handle < 0) { - Handle->handle = DvbOpen(DEV_DVB_DEMUX, CardIndex(), O_RDWR | O_NONBLOCK, true); + Handle->handle = DvbOpen(DEV_DVB_DEMUX, adapter, frontend, O_RDWR | O_NONBLOCK, true); if (Handle->handle < 0) { LOG_ERROR; return false; @@ -819,8 +540,8 @@ bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On) } pesFilterParams.pid = Handle->pid; pesFilterParams.input = DMX_IN_FRONTEND; - pesFilterParams.output = (Type <= ptTeletext && Handle->used <= 1) ? DMX_OUT_DECODER : DMX_OUT_TS_TAP; - pesFilterParams.pes_type= PesTypes[Type < ptOther ? Type : ptOther]; + pesFilterParams.output = DMX_OUT_TS_TAP; + pesFilterParams.pes_type= DMX_PES_OTHER; pesFilterParams.flags = DMX_IMMEDIATE_START; if (ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) { LOG_ERROR; @@ -833,11 +554,9 @@ bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On) pesFilterParams.pid = 0x1FFF; pesFilterParams.input = DMX_IN_FRONTEND; pesFilterParams.output = DMX_OUT_DECODER; - pesFilterParams.pes_type= PesTypes[Type]; + pesFilterParams.pes_type= DMX_PES_OTHER; pesFilterParams.flags = DMX_IMMEDIATE_START; CHECK(ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams)); - if (PesTypes[Type] == DMX_PES_VIDEO) // let's only do this once - SetPlayMode(pmNone); // necessary to switch a PID from DMX_PES_VIDEO/AUDIO to DMX_PES_OTHER } close(Handle->handle); Handle->handle = -1; @@ -848,7 +567,7 @@ bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On) int cDvbDevice::OpenFilter(u_short Pid, u_char Tid, u_char Mask) { - const char *FileName = *cDvbName(DEV_DVB_DEMUX, CardIndex()); + cString FileName = DvbName(DEV_DVB_DEMUX, adapter, frontend); int f = open(FileName, O_RDWR | O_NONBLOCK); if (f >= 0) { dmx_sct_filter_params sctFilterParams; @@ -866,7 +585,7 @@ int cDvbDevice::OpenFilter(u_short Pid, u_char Tid, u_char Mask) } } else - esyslog("ERROR: can't open filter handle on '%s'", FileName); + esyslog("ERROR: can't open filter handle on '%s'", *FileName); return -1; } @@ -875,29 +594,6 @@ void cDvbDevice::CloseFilter(int Handle) close(Handle); } -void cDvbDevice::TurnOffLiveMode(bool LiveView) -{ - if (LiveView) { - // Avoid noise while switching: - CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true)); - CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); - CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER)); - CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER)); - } - - // Turn off live PIDs: - - DetachAll(pidHandles[ptAudio].pid); - DetachAll(pidHandles[ptVideo].pid); - DetachAll(pidHandles[ptPcr].pid); - DetachAll(pidHandles[ptTeletext].pid); - DelPid(pidHandles[ptAudio].pid); - DelPid(pidHandles[ptVideo].pid); - DelPid(pidHandles[ptPcr].pid, ptPcr); - DelPid(pidHandles[ptTeletext].pid); - DelPid(pidHandles[ptDolby].pid); -} - bool cDvbDevice::ProvidesSource(int Source) const { int type = Source & cSource::st_Mask; @@ -929,7 +625,6 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne if (Priority >= 0 && Receiving(true)) { if (dvbTuner->IsTunedTo(Channel)) { if (Channel->Vpid() && !HasPid(Channel->Vpid()) || Channel->Apid(0) && !HasPid(Channel->Apid(0))) { -#ifdef DO_MULTIPLE_RECORDINGS if (CamSlot() && Channel->Ca() >= CA_ENCRYPTED_MIN) { if (CamSlot()->CanDecrypt(Channel)) result = true; @@ -938,11 +633,8 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne } else if (!IsPrimaryDevice()) result = true; -#ifdef DO_REC_AND_PLAY_ON_PRIMARY_DEVICE else result = Priority >= Setup.PrimaryLimit; -#endif -#endif } else result = !IsPrimaryDevice() || Priority >= Setup.PrimaryLimit; @@ -968,70 +660,7 @@ bool cDvbDevice::IsTunedToTransponder(const cChannel *Channel) bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) { - int apid = Channel->Apid(0); - int vpid = Channel->Vpid(); - int dpid = Channel->Dpid(0); - - bool DoTune = !dvbTuner->IsTunedTo(Channel); - - bool pidHandlesVideo = pidHandles[ptVideo].pid == vpid; - bool pidHandlesAudio = pidHandles[ptAudio].pid == apid; - - bool TurnOffLivePIDs = HasDecoder() - && (DoTune - || !IsPrimaryDevice() - || LiveView // for a new live view the old PIDs need to be turned off - || pidHandlesVideo // for recording the PIDs must be shifted from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER - ); - - bool StartTransferMode = IsPrimaryDevice() && !DoTune - && (LiveView && HasPid(vpid ? vpid : apid) && (!pidHandlesVideo || (!pidHandlesAudio && (dpid ? pidHandles[ptAudio].pid != dpid : true)))// the PID is already set as DMX_PES_OTHER - || !LiveView && (pidHandlesVideo || pidHandlesAudio) // a recording is going to shift the PIDs from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER - ); - if (CamSlot() && !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), CamSlot()->SlotNumber())) - StartTransferMode |= LiveView && IsPrimaryDevice() && Channel->Ca() >= CA_ENCRYPTED_MIN; - - bool TurnOnLivePIDs = HasDecoder() && !StartTransferMode && LiveView; - -#ifndef DO_MULTIPLE_RECORDINGS - TurnOffLivePIDs = TurnOnLivePIDs = true; - StartTransferMode = false; -#endif - - // Turn off live PIDs if necessary: - - if (TurnOffLivePIDs) - TurnOffLiveMode(LiveView); - - // Set the tuner: - - dvbTuner->Set(Channel, DoTune); - - // If this channel switch was requested by the EITScanner we don't wait for - // a lock and don't set any live PIDs (the EITScanner will wait for the lock - // by itself before setting any filters): - - if (EITScanner.UsesDevice(this)) //XXX - return true; - - // PID settings: - - if (TurnOnLivePIDs) { - SetAudioBypass(false); - if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(vpid, ptVideo) && AddPid(apid, ptAudio))) { - esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->Number(), CardIndex() + 1); - return false; - } - if (IsPrimaryDevice()) - AddPid(Channel->Tpid(), ptTeletext); - CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true)); // actually one would expect 'false' here, but according to Marco Schlüßler <marco@lordzodiac.de> this works - // to avoid missing audio after replaying a DVD; with 'false' there is an audio disturbance when switching - // between two channels on the same transponder on DVB-S - CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true)); - } - else if (StartTransferMode) - cControl::Launch(new cTransferControl(this, Channel->GetChannelID(), vpid, Channel->Apids(), Channel->Dpids(), Channel->Spids())); - + dvbTuner->Set(Channel); return true; } @@ -1040,339 +669,15 @@ bool cDvbDevice::HasLock(int TimeoutMs) return dvbTuner ? dvbTuner->Locked(TimeoutMs) : false; } -int cDvbDevice::GetAudioChannelDevice(void) -{ - if (HasDecoder()) { - audio_status_t as; - CHECK(ioctl(fd_audio, AUDIO_GET_STATUS, &as)); - return as.channel_select; - } - return 0; -} - -void cDvbDevice::SetAudioChannelDevice(int AudioChannel) -{ - if (HasDecoder()) - CHECK(ioctl(fd_audio, AUDIO_CHANNEL_SELECT, AudioChannel)); -} - -void cDvbDevice::SetVolumeDevice(int Volume) -{ - if (HasDecoder()) { - if (digitalAudio) - Volume = 0; - audio_mixer_t am; - // conversion for linear volume response: - am.volume_left = am.volume_right = 2 * Volume - Volume * Volume / 255; - CHECK(ioctl(fd_audio, AUDIO_SET_MIXER, &am)); - } -} - -void cDvbDevice::SetDigitalAudioDevice(bool On) -{ - if (digitalAudio != On) { - if (digitalAudio) - cCondWait::SleepMs(1000); // Wait until any leftover digital data has been flushed - digitalAudio = On; - SetVolumeDevice(On || IsMute() ? 0 : CurrentVolume()); - } -} - void cDvbDevice::SetTransferModeForDolbyDigital(int Mode) { setTransferModeForDolbyDigital = Mode; } -void cDvbDevice::SetAudioTrackDevice(eTrackType Type) -{ - const tTrackId *TrackId = GetTrack(Type); - if (TrackId && TrackId->id) { - SetAudioBypass(false); - if (IS_AUDIO_TRACK(Type) || (IS_DOLBY_TRACK(Type) && SetAudioBypass(true))) { - if (pidHandles[ptAudio].pid && pidHandles[ptAudio].pid != TrackId->id) { - DetachAll(pidHandles[ptAudio].pid); - if (CamSlot()) - CamSlot()->SetPid(pidHandles[ptAudio].pid, false); - pidHandles[ptAudio].pid = TrackId->id; - SetPid(&pidHandles[ptAudio], ptAudio, true); - if (CamSlot()) { - CamSlot()->SetPid(pidHandles[ptAudio].pid, true); - CamSlot()->StartDecrypting(); - } - } - } - else if (IS_DOLBY_TRACK(Type)) { - if (setTransferModeForDolbyDigital == 0) - return; - // Currently this works only in Transfer Mode - ForceTransferMode(); - } - } -} - -bool cDvbDevice::CanReplay(void) const -{ -#ifndef DO_REC_AND_PLAY_ON_PRIMARY_DEVICE - if (Receiving()) - return false; -#endif - return cDevice::CanReplay(); -} - -bool cDvbDevice::SetPlayMode(ePlayMode PlayMode) -{ - if (PlayMode != pmExtern_THIS_SHOULD_BE_AVOIDED && fd_video < 0 && fd_audio < 0) { - // reopen the devices - fd_video = DvbOpen(DEV_DVB_VIDEO, CardIndex(), O_RDWR | O_NONBLOCK); - fd_audio = DvbOpen(DEV_DVB_AUDIO, CardIndex(), O_RDWR | O_NONBLOCK); - SetVideoFormat(Setup.VideoFormat); - } - - switch (PlayMode) { - case pmNone: - // special handling to return from PCM replay: - CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); - CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY)); - CHECK(ioctl(fd_video, VIDEO_PLAY)); - - CHECK(ioctl(fd_video, VIDEO_STOP, true)); - CHECK(ioctl(fd_audio, AUDIO_STOP, true)); - CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER)); - CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER)); - CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX)); - CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX)); - CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true)); - CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false)); - break; - case pmAudioVideo: - case pmAudioOnlyBlack: - if (playMode == pmNone) - TurnOffLiveMode(true); - CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); - CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY)); - CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, PlayMode == pmAudioVideo)); - CHECK(ioctl(fd_audio, AUDIO_PLAY)); - CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY)); - CHECK(ioctl(fd_video, VIDEO_PLAY)); - break; - case pmAudioOnly: - CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); - CHECK(ioctl(fd_audio, AUDIO_STOP, true)); - CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER)); - CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY)); - CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false)); - CHECK(ioctl(fd_audio, AUDIO_PLAY)); - CHECK(ioctl(fd_video, VIDEO_SET_BLANK, false)); - break; - case pmVideoOnly: - CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); - CHECK(ioctl(fd_video, VIDEO_STOP, true)); - CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX)); - CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false)); - CHECK(ioctl(fd_audio, AUDIO_PLAY)); - CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER)); - CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY)); - CHECK(ioctl(fd_video, VIDEO_PLAY)); - break; - case pmExtern_THIS_SHOULD_BE_AVOIDED: - close(fd_video); - close(fd_audio); - fd_video = fd_audio = -1; - break; - } - playMode = PlayMode; - return true; -} - -int64_t cDvbDevice::GetSTC(void) -{ - if (fd_stc >= 0) { - struct dmx_stc stc; - stc.num = 0; - if (ioctl(fd_stc, DMX_GET_STC, &stc) == -1) { - esyslog("ERROR: stc %d: %m", CardIndex() + 1); - return -1; - } - return stc.stc / stc.base; - } - return -1; -} - -void cDvbDevice::TrickSpeed(int Speed) -{ - if (fd_video >= 0) - CHECK(ioctl(fd_video, VIDEO_SLOWMOTION, Speed)); -} - -void cDvbDevice::Clear(void) -{ - if (fd_video >= 0) - CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER)); - if (fd_audio >= 0) - CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER)); - cDevice::Clear(); -} - -void cDvbDevice::Play(void) -{ - if (playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) { - if (fd_audio >= 0) - CHECK(ioctl(fd_audio, AUDIO_CONTINUE)); - } - else { - if (fd_audio >= 0) { - CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true)); - CHECK(ioctl(fd_audio, AUDIO_CONTINUE)); - } - if (fd_video >= 0) - CHECK(ioctl(fd_video, VIDEO_CONTINUE)); - } - cDevice::Play(); -} - -void cDvbDevice::Freeze(void) -{ - if (playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) { - if (fd_audio >= 0) - CHECK(ioctl(fd_audio, AUDIO_PAUSE)); - } - else { - if (fd_audio >= 0) { - CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false)); - CHECK(ioctl(fd_audio, AUDIO_PAUSE)); - } - if (fd_video >= 0) - CHECK(ioctl(fd_video, VIDEO_FREEZE)); - } - cDevice::Freeze(); -} - -void cDvbDevice::Mute(void) -{ - if (fd_audio >= 0) { - CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false)); - CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true)); - } - cDevice::Mute(); -} - -void cDvbDevice::StillPicture(const uchar *Data, int Length) -{ - if (!Data || Length < TS_SIZE) - return; - if (Data[0] == 0x47) { - // TS data - cDevice::StillPicture(Data, Length); - } - else if (Data[0] == 0x00 && Data[1] == 0x00 && Data[2] == 0x01 && (Data[3] & 0xF0) == 0xE0) { - // PES data - char *buf = MALLOC(char, Length); - if (!buf) - return; - int i = 0; - int blen = 0; - while (i < Length - 6) { - if (Data[i] == 0x00 && Data[i + 1] == 0x00 && Data[i + 2] == 0x01) { - int len = Data[i + 4] * 256 + Data[i + 5]; - if ((Data[i + 3] & 0xF0) == 0xE0) { // video packet - // skip PES header - int offs = i + 6; - // skip header extension - if ((Data[i + 6] & 0xC0) == 0x80) { - // MPEG-2 PES header - if (Data[i + 8] >= Length) - break; - offs += 3; - offs += Data[i + 8]; - len -= 3; - len -= Data[i + 8]; - if (len < 0 || offs + len > Length) - break; - } - else { - // MPEG-1 PES header - while (offs < Length && len > 0 && Data[offs] == 0xFF) { - offs++; - len--; - } - if (offs <= Length - 2 && len >= 2 && (Data[offs] & 0xC0) == 0x40) { - offs += 2; - len -= 2; - } - if (offs <= Length - 5 && len >= 5 && (Data[offs] & 0xF0) == 0x20) { - offs += 5; - len -= 5; - } - else if (offs <= Length - 10 && len >= 10 && (Data[offs] & 0xF0) == 0x30) { - offs += 10; - len -= 10; - } - else if (offs < Length && len > 0) { - offs++; - len--; - } - } - if (blen + len > Length) // invalid PES length field - break; - memcpy(&buf[blen], &Data[offs], len); - i = offs + len; - blen += len; - } - else if (Data[i + 3] >= 0xBD && Data[i + 3] <= 0xDF) // other PES packets - i += len + 6; - else - i++; - } - else - i++; - } - video_still_picture sp = { buf, blen }; - CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp)); - free(buf); - } - else { - // non-PES data - video_still_picture sp = { (char *)Data, Length }; - CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp)); - } -} - -bool cDvbDevice::Poll(cPoller &Poller, int TimeoutMs) -{ - Poller.Add((playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) ? fd_audio : fd_video, true); - return Poller.Poll(TimeoutMs); -} - -bool cDvbDevice::Flush(int TimeoutMs) -{ - //TODO actually this function should wait until all buffered data has been processed by the card, but how? - return true; -} - -int cDvbDevice::PlayVideo(const uchar *Data, int Length) -{ - return WriteAllOrNothing(fd_video, Data, Length, 1000, 10); -} - -int cDvbDevice::PlayAudio(const uchar *Data, int Length, uchar Id) -{ - return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10); -} - -int cDvbDevice::PlayTsVideo(const uchar *Data, int Length) -{ - return WriteAllOrNothing(fd_video, Data, Length, 1000, 10); -} - -int cDvbDevice::PlayTsAudio(const uchar *Data, int Length) -{ - return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10); -} - bool cDvbDevice::OpenDvr(void) { CloseDvr(); - fd_dvr = DvbOpen(DEV_DVB_DVR, CardIndex(), O_RDONLY | O_NONBLOCK, true); + fd_dvr = DvbOpen(DEV_DVB_DVR, adapter, frontend, O_RDONLY | O_NONBLOCK, true); if (fd_dvr >= 0) tsBuffer = new cTSBuffer(fd_dvr, MEGABYTE(2), CardIndex() + 1); return fd_dvr >= 0; @@ -1396,3 +701,17 @@ bool cDvbDevice::GetTSPacket(uchar *&Data) } return false; } + +// --- cDvbDeviceProbe ------------------------------------------------------- + +cList<cDvbDeviceProbe> DvbDeviceProbes; + +cDvbDeviceProbe::cDvbDeviceProbe(void) +{ + DvbDeviceProbes.Add(this); +} + +cDvbDeviceProbe::~cDvbDeviceProbe() +{ + DvbDeviceProbes.Del(this, false); +} diff --git a/dvbdevice.h b/dvbdevice.h index 3e35d91..b6cc950 100644 --- a/dvbdevice.h +++ b/dvbdevice.h @@ -1,10 +1,10 @@ /* - * dvbdevice.h: The DVB device interface + * dvbdevice.h: The DVB device tuner interface * * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbdevice.h 2.9 2009/10/25 13:58:20 kls Exp $ + * $Id: dvbdevice.h 2.11 2010/01/04 14:07:12 kls Exp $ */ #ifndef __DVBDEVICE_H @@ -14,7 +14,6 @@ #include <linux/dvb/frontend.h> #include <linux/dvb/version.h> #include "device.h" -#include "dvbspu.h" #if DVB_API_VERSION < 5 #error VDR requires Linux DVB driver API version 5.0 or higher! @@ -22,49 +21,55 @@ #define MAXDVBDEVICES 8 +#define DEV_VIDEO "/dev/video" +#define DEV_DVB_ADAPTER "/dev/dvb/adapter" +#define DEV_DVB_OSD "osd" +#define DEV_DVB_FRONTEND "frontend" +#define DEV_DVB_DVR "dvr" +#define DEV_DVB_DEMUX "demux" +#define DEV_DVB_VIDEO "video" +#define DEV_DVB_AUDIO "audio" +#define DEV_DVB_CA "ca" + class cDvbTuner; /// The cDvbDevice implements a DVB device which can be accessed through the Linux DVB driver API. class cDvbDevice : public cDevice { +protected: + static cString DvbName(const char *Name, int Adapter, int Frontend); + static int DvbOpen(const char *Name, int Adapter, int Frontend, int Mode, bool ReportError = false); private: - static bool Probe(const char *FileName); + static bool Exists(int Adapter, int Frontend); + ///< Checks whether the given adapter/frontend exists. + static bool Probe(int Adapter, int Frontend); ///< Probes for existing DVB devices. public: static bool Initialize(void); ///< Initializes the DVB devices. ///< Must be called before accessing any DVB functions. ///< \return True if any devices are available. +protected: + int adapter, frontend; private: dvb_frontend_info frontendInfo; int numProvidedSystems; fe_delivery_system frontendType; - int fd_osd, fd_audio, fd_video, fd_dvr, fd_stc, fd_ca; -protected: - virtual void MakePrimaryDevice(bool On); + int fd_dvr, fd_ca; public: - cDvbDevice(int n); + cDvbDevice(int Adapter, int Frontend); virtual ~cDvbDevice(); virtual bool Ready(void); - virtual bool HasDecoder(void) const; // Common Interface facilities: private: cCiAdapter *ciAdapter; -// SPU facilities - -private: - cDvbSpuDecoder *spuDecoder; -public: - virtual cSpuDecoder *GetSpuDecoder(void); - // Channel facilities private: cDvbTuner *dvbTuner; - void TurnOffLiveMode(bool LiveView); public: virtual bool ProvidesSource(int Source) const; virtual bool ProvidesTransponder(const cChannel *Channel) const; @@ -78,8 +83,6 @@ public: // PID handle facilities -private: - bool SetAudioBypass(bool On); protected: virtual bool SetPid(cPidHandle *Handle, int Type, bool On); @@ -94,67 +97,18 @@ protected: public: virtual bool HasCi(void); -// Image Grab facilities - -private: - static int devVideoOffset; - int devVideoIndex; -public: - virtual uchar *GrabImage(int &Size, bool Jpeg = true, int Quality = -1, int SizeX = -1, int SizeY = -1); - -// Video format facilities - -public: - virtual void SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat); - virtual void SetVideoFormat(bool VideoFormat16_9); - virtual eVideoSystem GetVideoSystem(void); - virtual void GetVideoSize(int &Width, int &Height, double &VideoAspect); - virtual void GetOsdSize(int &Width, int &Height, double &PixelAspect); - -// Track facilities - -protected: - virtual void SetAudioTrackDevice(eTrackType Type); - // Audio facilities -private: - bool digitalAudio; - static int setTransferModeForDolbyDigital; protected: - virtual int GetAudioChannelDevice(void); - virtual void SetAudioChannelDevice(int AudioChannel); - virtual void SetVolumeDevice(int Volume); - virtual void SetDigitalAudioDevice(bool On); + static int setTransferModeForDolbyDigital; public: - static void SetTransferModeForDolbyDigital(int Mode); + static void SetTransferModeForDolbyDigital(int Mode); // needs to be here for backwards compatibilty ///< Controls how the DVB device handles Transfer Mode when replaying ///< Dolby Digital audio. ///< 0 = don't set "audio bypass" in driver/firmware, don't force Transfer Mode ///< 1 = set "audio bypass" in driver/firmware, force Transfer Mode (default) ///< 2 = don't set "audio bypass" in driver/firmware, force Transfer Mode -// Player facilities - -protected: - ePlayMode playMode; - virtual bool CanReplay(void) const; - virtual bool SetPlayMode(ePlayMode PlayMode); - virtual int PlayVideo(const uchar *Data, int Length); - virtual int PlayAudio(const uchar *Data, int Length, uchar Id); - virtual int PlayTsVideo(const uchar *Data, int Length); - virtual int PlayTsAudio(const uchar *Data, int Length); -public: - virtual int64_t GetSTC(void); - virtual void TrickSpeed(int Speed); - virtual void Clear(void); - virtual void Play(void); - virtual void Freeze(void); - virtual void Mute(void); - virtual void StillPicture(const uchar *Data, int Length); - virtual bool Poll(cPoller &Poller, int TimeoutMs = 0); - virtual bool Flush(int TimeoutMs = 0); - // Receiver facilities private: @@ -165,4 +119,22 @@ protected: virtual bool GetTSPacket(uchar *&Data); }; +// A plugin that implements a DVB device derived from cDvbDevice needs to create +// a cDvbDeviceProbe derived object on the heap in order to have its Probe() +// function called, where it can actually create the appropriate device. +// The cDvbDeviceProbe object must be created in the plugin's constructor, +// and deleted in its destructor. + +class cDvbDeviceProbe : public cListObject { +public: + cDvbDeviceProbe(void); + virtual ~cDvbDeviceProbe(); + virtual bool Probe(int Adapter, int Frontend) = 0; + ///< Probes for a DVB device at the given Adapter and creates the appropriate + ///< object derived from cDvbDevice if applicable. + ///< Returns true if a device has been created. + }; + +extern cList<cDvbDeviceProbe> DvbDeviceProbes; + #endif //__DVBDEVICE_H diff --git a/dvbosd.h b/dvbosd.h deleted file mode 100644 index 3eb56f0..0000000 --- a/dvbosd.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * dvbosd.h: Implementation of the DVB On Screen Display - * - * See the main source file 'vdr.c' for copyright information and - * how to reach the author. - * - * $Id: dvbosd.h 2.0 2007/08/25 13:49:34 kls Exp $ - */ - -#ifndef __DVBOSD_H -#define __DVBOSD_H - -#include "osd.h" - -class cDvbOsdProvider : public cOsdProvider { -private: - int osdDev; -public: - cDvbOsdProvider(int OsdDev); - virtual cOsd *CreateOsd(int Left, int Top, uint Level); - }; - -#endif //__DVBOSD_H diff --git a/dvbplayer.c b/dvbplayer.c index 9f96462..d02884b 100644 --- a/dvbplayer.c +++ b/dvbplayer.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbplayer.c 2.17 2009/05/31 14:12:42 kls Exp $ + * $Id: dvbplayer.c 2.19 2009/12/13 13:49:56 kls Exp $ */ #include "dvbplayer.h" @@ -404,6 +404,8 @@ void cDvbPlayer::Action(void) cPoller Poller; DevicePoll(Poller, 10); Sleep = false; + if (playMode == pmStill || playMode==pmPause) + cCondWait::SleepMs(3); } { LOCK_THREAD; @@ -666,6 +668,7 @@ void cDvbPlayer::Forward(void) trickSpeed = NORMAL_SPEED; TrickSpeed(Setup.MultiSpeedMode ? -1 : -MAX_SPEEDS); break; + default: esyslog("ERROR: unknown playMode %d (%s)", playMode, __FUNCTION__); } } } @@ -717,6 +720,7 @@ void cDvbPlayer::Backward(void) TrickSpeed(Setup.MultiSpeedMode ? -1 : -MAX_SPEEDS); } break; + default: esyslog("ERROR: unknown playMode %d (%s)", playMode, __FUNCTION__); } } } @@ -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()); @@ -8,7 +8,7 @@ * * parts of this file are derived from the OMS program. * - * $Id: dvbspu.h 2.1 2009/05/09 16:26:45 kls Exp $ + * $Id: dvbspu.h 2.4 2009/12/13 12:07:00 kls Exp $ */ #ifndef __DVBSPU_H @@ -80,6 +80,7 @@ class cDvbSpuBitmap { bool getMinSize(const aDvbSpuPalDescr paldescr, sDvbSpuRect & size) const; + int getMinBpp(const aDvbSpuPalDescr paldescr); cBitmap *getBitmap(const aDvbSpuPalDescr paldescr, const cDvbSpuPalette & pal, sDvbSpuRect & size) const; @@ -97,6 +98,7 @@ class cDvbSpuDecoder:public cSpuDecoder { uint32_t spupts; bool clean; bool ready; + bool restricted_osd; enum spFlag { spNONE, spHIDE, spSHOW, spMENU }; spFlag state; @@ -129,6 +131,7 @@ class cDvbSpuDecoder:public cSpuDecoder { }; sDvbSpuRect CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDvbSpuRect bgsize, cBitmap *bgbmp); + int CalcAreaBpp(cBitmap *fgbmp, cBitmap *bgbmp); public: cDvbSpuDecoder(); @@ -194,8 +197,7 @@ inline uint32_t cDvbSpuPalette::yuv2rgb(uint32_t yuv_color) inline uint32_t cDvbSpuPalette::getColor(uint8_t idx, uint8_t trans) const { - uint8_t t = trans == 0x0f ? 0xff : trans << 4; - return palette[idx] | (t << 24); + return palette[idx] | ((trans == 0x0f) ? 0xff000000 : (trans << 28)); } #endif // __DVBSPU_H diff --git a/dvbsubtitle.c b/dvbsubtitle.c index cd77fde..221523f 100644 --- a/dvbsubtitle.c +++ b/dvbsubtitle.c @@ -7,7 +7,7 @@ * Original author: Marco Schlüßler <marco@lordzodiac.de> * With some input from the "subtitle plugin" by Pekka Virtanen <pekka.virtanen@sci.fi> * - * $Id: dvbsubtitle.c 2.2 2009/11/22 12:28:53 kls Exp $ + * $Id: dvbsubtitle.c 2.3 2009/12/05 16:11:54 kls Exp $ */ #include "dvbsubtitle.h" @@ -160,21 +160,22 @@ void cSubtitleObject::DecodeSubBlock(const uchar *Data, int Length, bool Even) ; break; case 0x20: //TODO - dbgobjects("sub block 2 to 4 map"); + dbgobjects("sub block 2 to 4 map\n"); index += 4; break; case 0x21: //TODO - dbgobjects("sub block 2 to 8 map"); + dbgobjects("sub block 2 to 8 map\n"); index += 4; break; case 0x22: //TODO - dbgobjects("sub block 4 to 8 map"); + dbgobjects("sub block 4 to 8 map\n"); index += 16; break; case 0xF0: x = 0; y += 2; break; + default: dbgobjects("unknown sub block %s %d\n", __FUNCTION__, __LINE__); } } } @@ -233,7 +234,7 @@ bool cSubtitleObject::Decode2BppCodeString(const uchar *Data, int &Index, int &x rl = 1; //color 0 else { code = Get2Bits(Data, Index); - switch (code & 0x3) { //switch_3 + switch (code & 3) { //switch_3 case 0: return false; case 1: @@ -247,6 +248,7 @@ bool cSubtitleObject::Decode2BppCodeString(const uchar *Data, int &Index, int &x rl = (Get2Bits(Data, Index) << 6) + (Get2Bits(Data, Index) << 4) + (Get2Bits(Data, Index) << 2) + Get2Bits(Data, Index) + 29; color = Get2Bits(Data, Index); break; + default: ; } } } @@ -283,6 +285,7 @@ bool cSubtitleObject::Decode4BppCodeString(const uchar *Data, int &Index, int &x rl = (Get4Bits(Data, Index) << 4) + Get4Bits(Data, Index) + 25; color = Get4Bits(Data, Index); break; + default: ; } } else { @@ -516,6 +519,7 @@ void cDvbSubtitlePage::SetState(int State) break; case 3: // reserved break; + default: dbgpages("unknown page state (%s %d)\n", __FUNCTION__, __LINE__); } } @@ -900,6 +904,7 @@ int cDvbSubtitleConverter::ExtractSegment(const uchar *Data, int Length, int64_t case 2: region->FillRegion((Data[6 + 9] & 0x0C) >> 2); break; case 4: region->FillRegion((Data[6 + 9] & 0xF0) >> 4); break; case 8: region->FillRegion(Data[6 + 8]); break; + default: dbgregions("unknown bpp %d (%s %d)\n", region->Bpp(), __FUNCTION__, __LINE__); } } for (int i = 6 + 10; i < segmentLength; i += 6) { @@ -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: ; } } @@ -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 @@ -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); } @@ -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); @@ -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]; @@ -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; @@ -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; @@ -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 } @@ -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? @@ -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 @@ -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; } @@ -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 @@ -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); @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: plugin.c 2.1 2009/04/05 10:16:48 kls Exp $ + * $Id: plugin.c 2.2 2010/01/06 11:36:46 kls Exp $ */ #include "plugin.h" @@ -172,15 +172,15 @@ cDll::~cDll() static char *SkipQuote(char *s) { char c = *s; - strcpy(s, s + 1); + memmove(s, s + 1, strlen(s)); while (*s && *s != c) { if (*s == '\\') - strcpy(s, s + 1); + memmove(s, s + 1, strlen(s)); if (*s) s++; } if (*s) { - strcpy(s, s + 1); + memmove(s, s + 1, strlen(s)); return s; } esyslog("ERROR: missing closing %c", c); @@ -215,7 +215,7 @@ bool cDll::Load(bool Log) if (!q) q = p; switch (*p) { - case '\\': strcpy(p, p + 1); + case '\\': memmove(p, p + 1, strlen(p)); if (*p) p++; else { diff --git a/po/ca_ES.po b/po/ca_ES.po index 8915752..14f3c21 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-03-02 19:02+0100\n" "Last-Translator: Luca Olivetti <luca@ventoso.org>\n" "Language-Team: Catalanian\n" @@ -42,6 +42,247 @@ msgstr "No puc iniciar el mode de transferència!" msgid "Starting EPG scan" msgstr "Iniciant exploració EPG" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Sense títol" diff --git a/po/cs_CZ.po b/po/cs_CZ.po index b32c293..6394008 100644 --- a/po/cs_CZ.po +++ b/po/cs_CZ.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-02-28 15:00+0200\n" "Last-Translator: Vladimír Bárta <vladimir.barta@k2atmitec.cz>, Jiøí Dobrý <jdobry@centrum.cz>\n" "Language-Team: Czech\n" @@ -40,6 +40,247 @@ msgstr "Nelze zaèít s pøenosem" msgid "Starting EPG scan" msgstr "Zaèíná prohledávání EPG" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Bez názvu" diff --git a/po/da_DK.po b/po/da_DK.po index 5bcf776..faa3632 100644 --- a/po/da_DK.po +++ b/po/da_DK.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2007-08-12 14:17+0200\n" "Last-Translator: Mogens Elneff <mogens@elneff.dk>\n" "Language-Team: Danish\n" @@ -39,6 +39,247 @@ msgstr "Kan ikke starte Transfer Mode!" msgid "Starting EPG scan" msgstr "Starter EPG skanning" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Ingen titel" diff --git a/po/de_DE.po b/po/de_DE.po index c6c875d..ff25a33 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2007-11-25 15:19+0200\n" "Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n" "Language-Team: German\n" @@ -39,6 +39,247 @@ msgstr "Transfer-Mode kann nicht gestartet werden!" msgid "Starting EPG scan" msgstr "Aktualisiere EPG-Daten" +msgid "Content$Movie/Drama" +msgstr "Film/Drama" + +msgid "Content$Detective/Thriller" +msgstr "Detektiv/Thriller" + +msgid "Content$Adventure/Western/War" +msgstr "Abenteuer/Western/Krieg" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "Science-Fiction/Fantasy/Horror" + +msgid "Content$Comedy" +msgstr "Komödie" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "Seife/Melodram/Folklore" + +msgid "Content$Romance" +msgstr "Romanze" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "Ernst/Klassik/Religion/Historischer Film/Drama" + +msgid "Content$Adult Movie/Drama" +msgstr "Erwachsenen-Film/Drama" + +msgid "Content$News/Current Affairs" +msgstr "Aktuelle Angelegenheiten" + +msgid "Content$News/Weather Report" +msgstr "Wetterbericht" + +msgid "Content$News Magazine" +msgstr "Nachrichtenmagazin" + +msgid "Content$Documentary" +msgstr "Dokumentation" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "Diskussion/Interview/Debatte" + +msgid "Content$Show/Game Show" +msgstr "Show/Spielshow" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "Spielshow/Quiz/Wettbewerb" + +msgid "Content$Variety Show" +msgstr "Variete-Show" + +msgid "Content$Talk Show" +msgstr "Talkshow" + +msgid "Content$Sports" +msgstr "Sport" + +msgid "Content$Special Event" +msgstr "Besonderes Ereignis" + +msgid "Content$Sport Magazine" +msgstr "Sportmagazin" + +msgid "Content$Football/Soccer" +msgstr "Football/Fußball" + +msgid "Content$Tennis/Squash" +msgstr "Tennis/Squash" + +msgid "Content$Team Sports" +msgstr "Mannschaftssport" + +msgid "Content$Athletics" +msgstr "Athletik" + +msgid "Content$Motor Sport" +msgstr "Motorsport" + +msgid "Content$Water Sport" +msgstr "Wassersport" + +msgid "Content$Winter Sports" +msgstr "Wintersport" + +msgid "Content$Equestrian" +msgstr "Reitsport" + +msgid "Content$Martial Sports" +msgstr "Kampfsport" + +msgid "Content$Children's/Youth Programme" +msgstr "Kinder/Jugendprogramm" + +msgid "Content$Pre-school Children's Programme" +msgstr "Programm für Vorschulkinder" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "Unterhaltungsprogramm für 6 bis 14" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "Unterhaltungsprogramm für 10 bis 16" + +msgid "Content$Informational/Educational/School Programme" +msgstr "Informations/Lehr/Schul-Programm" + +msgid "Content$Cartoons/Puppets" +msgstr "Zeichentrick/Puppen" + +msgid "Content$Music/Ballet/Dance" +msgstr "Musik/Ballett/Tanz" + +msgid "Content$Rock/Pop" +msgstr "Rock/Pop" + +msgid "Content$Serious/Classical Music" +msgstr "Ernste/Klassische Musik" + +msgid "Content$Folk/Tradional Music" +msgstr "Volks/Traditionelle Musik" + +msgid "Content$Jazz" +msgstr "Jazz" + +msgid "Content$Musical/Opera" +msgstr "Musical/Oper" + +msgid "Content$Ballet" +msgstr "Ballett" + +msgid "Content$Arts/Culture" +msgstr "Kunst/Kultur" + +msgid "Content$Performing Arts" +msgstr "Darstellende Künste" + +msgid "Content$Fine Arts" +msgstr "Bildende Künste" + +msgid "Content$Religion" +msgstr "Religion" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "Pop-Kultur/Traditionelle Künste" + +msgid "Content$Literature" +msgstr "Literatur" + +msgid "Content$Film/Cinema" +msgstr "Film/Kino" + +msgid "Content$Experimental Film/Video" +msgstr "Experimentalfilm/Video" + +msgid "Content$Broadcasting/Press" +msgstr "Rundfunk/Presse" + +msgid "Content$New Media" +msgstr "Neue Medien" + +msgid "Content$Arts/Culture Magazine" +msgstr "Kunst/Kulturmagazin" + +msgid "Content$Fashion" +msgstr "Mode" + +msgid "Content$Social/Political/Economics" +msgstr "Gesellschaft/Politik/Wirtschaft" + +msgid "Content$Magazine/Report/Documentary" +msgstr "Magazin/Bericht/Dokumentation" + +msgid "Content$Economics/Social Advisory" +msgstr "Wirtschafts/Gesellschaftsberatung" + +msgid "Content$Remarkable People" +msgstr "Bemerkenswerte Leute" + +msgid "Content$Education/Science/Factual" +msgstr "Ausbildung/Wissenschaft/Sachlich" + +msgid "Content$Nature/Animals/Environment" +msgstr "Natur/Tiere/Umwelt" + +msgid "Content$Technology/Natural Sciences" +msgstr "Technik/Naturwissenschaften" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "Medizin/Physiologie/Psychologie" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "Ausland/Expeditionen" + +msgid "Content$Social/Spiritual Sciences" +msgstr "Sozial/Geisteswissenschaften" + +msgid "Content$Further Education" +msgstr "Weiterbildung" + +msgid "Content$Languages" +msgstr "Sprachen" + +msgid "Content$Leisure/Hobbies" +msgstr "Freizeit/Hobbies" + +msgid "Content$Tourism/Travel" +msgstr "Tourismus/Reisen" + +msgid "Content$Handicraft" +msgstr "Handwerk" + +msgid "Content$Motoring" +msgstr "Autofahren" + +msgid "Content$Fitness & Health" +msgstr "Fitness & Gesundheit" + +msgid "Content$Cooking" +msgstr "Kochen" + +msgid "Content$Advertisement/Shopping" +msgstr "Werbung/Einkaufen" + +msgid "Content$Gardening" +msgstr "Gartenbau" + +msgid "Content$Original Language" +msgstr "Originalsprache" + +msgid "Content$Black & White" +msgstr "Schwarz-weiß" + +msgid "Content$Unpublished" +msgstr "Unveröffentlicht" + +msgid "Content$Live Broadcast" +msgstr "Live-Sendung" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "ab %d" + msgid "No title" msgstr "Kein Titel" diff --git a/po/el_GR.po b/po/el_GR.po index c89b689..2c310ab 100644 --- a/po/el_GR.po +++ b/po/el_GR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2007-08-12 14:17+0200\n" "Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n" "Language-Team: Greek\n" @@ -39,6 +39,247 @@ msgstr "Áäõíáìßá åêêßíçóçò êáôÜóôáóçò ìåôáöïñÜò!" msgid "Starting EPG scan" msgstr "Áñ÷Þ óÜñùóç EPG" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "×ùñßò Ôßôëï" diff --git a/po/es_ES.po b/po/es_ES.po index 6cc9cee..6cb029c 100644 --- a/po/es_ES.po +++ b/po/es_ES.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-03-02 19:02+0100\n" "Last-Translator: Luca Olivetti <luca@ventoso.org>\n" "Language-Team: Spanish\n" @@ -40,6 +40,247 @@ msgstr "¡No se puede iniciar el modo de transferencia!" msgid "Starting EPG scan" msgstr "Iniciando la exploración de EPG" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Sin título" diff --git a/po/et_EE.po b/po/et_EE.po index 2823c74..f8a0f60 100644 --- a/po/et_EE.po +++ b/po/et_EE.po @@ -1,15 +1,15 @@ # VDR language source file. # Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de> # This file is distributed under the same license as the VDR package. -# Arthur Konovalov <kasjas@hot.ee>, 2004, 2005, 2006, 2007 +# Arthur Konovalov <artlov@gmail.com>, 2004-2009 # msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2007-08-12 14:17+0200\n" -"Last-Translator: Arthur Konovalov <kasjas@hot.ee>\n" +"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n" "Language-Team: Estonian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-13\n" @@ -19,7 +19,7 @@ msgid "off" msgstr "väljas" msgid "on" -msgstr "" +msgstr "sees" msgid "auto" msgstr "automaatne" @@ -34,11 +34,252 @@ msgid "Channel not available!" msgstr "Kanal ei ole kättesaadav!" msgid "Can't start Transfer Mode!" -msgstr "Siirdemooduse start ebaõnnestus!" +msgstr "Siirdemooduse start nurjus!" msgid "Starting EPG scan" msgstr "EPG skaneerimine käivitatud" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Pealkiri puudub" @@ -286,7 +527,7 @@ msgid "Polarization" msgstr "Polarisatsioon" msgid "System" -msgstr "" +msgstr "Süsteem" msgid "Srate" msgstr "Srate" @@ -316,7 +557,7 @@ msgid "Hierarchy" msgstr "Hierarhia" msgid "Rolloff" -msgstr "" +msgstr "Rolloff" msgid "Channel settings are not unique!" msgstr "Kanaliseaded ei ole unikaalsed!" @@ -325,16 +566,16 @@ msgid "Channels" msgstr "Kanalid" msgid "Button$Edit" -msgstr "Muuda" +msgstr "Muutmine" msgid "Button$New" msgstr "Uus" msgid "Button$Delete" -msgstr "Kustuta" +msgstr "Kustutada" msgid "Button$Mark" -msgstr "Siirda" +msgstr "Märkimine" msgid "Channel is being used by a timer!" msgstr "Kanal on taimeri kasutuses!" @@ -343,7 +584,7 @@ msgid "Delete channel?" msgstr "Kustutada kanal?" msgid "Edit timer" -msgstr "Taimeri muutmine" +msgstr "Taimeri redigeerimine" msgid "Active" msgstr "Aktiivne" @@ -397,10 +638,10 @@ msgid "Button$Timer" msgstr "Taimer" msgid "Button$Record" -msgstr "Salvesta" +msgstr "Salvestada" msgid "Button$Switch" -msgstr "Vali" +msgstr "Valida" msgid "What's on now?" msgstr "Hetkel eetris" @@ -436,7 +677,7 @@ msgstr "Kõik saated - kõik kanalid" #, c-format msgid "Please enter %d digits!" -msgstr "Palun sisesta %d numbrit!" +msgstr "Palun sisestada %d numbrit!" msgid "CAM not responding!" msgstr "CAM ei vasta" @@ -454,19 +695,19 @@ msgid "Recordings" msgstr "Salvestused" msgid "Button$Open" -msgstr "Ava" +msgstr "Avada" msgid "Commands" msgstr "Käsud" msgid "Error while accessing recording!" -msgstr "Salvestuse taasesitus ebaõnnestus!" +msgstr "Salvestuse taasesitus nurjus!" msgid "Delete recording?" msgstr "Kustutada salvestus?" msgid "Error while deleting recording!" -msgstr "Salvestuse kustutamine ebaõnnestus!" +msgstr "Salvestuse kustutamine nurjus!" msgid "Recording commands" msgstr "Salvestuse käsud" @@ -505,10 +746,10 @@ msgid "Setup.OSD$Height (%)" msgstr "Kõrgus (%)" msgid "Setup.OSD$Message time (s)" -msgstr "Teate esitusaeg (s)" +msgstr "Teate kuvamisaeg (s)" msgid "Setup.OSD$Use small font" -msgstr "Väikese fondi kasutamine" +msgstr "Väikese fondi kasutus" msgid "Setup.OSD$Anti-alias" msgstr "Fondi silumine" @@ -541,7 +782,7 @@ msgid "top" msgstr "üleval" msgid "Setup.OSD$Channel info time (s)" -msgstr "Kanaliinfo esitusaeg (s)" +msgstr "Kanaliinfo kuvamisaeg (s)" msgid "Setup.OSD$Info on channel switch" msgstr "Kanaliinfo kuvamine" @@ -565,7 +806,7 @@ msgid "EPG" msgstr "EPG" msgid "Button$Scan" -msgstr "Uuenda" +msgstr "Uuendada" msgid "Setup.EPG$EPG scan timeout (h)" msgstr "EPG skaneerimise viide (h)" @@ -609,13 +850,13 @@ msgid "PIDs only" msgstr "PID-id" msgid "names and PIDs" -msgstr "nimed ja PID-id" +msgstr "nimed,PID-id" msgid "add new channels" -msgstr "kanalite lisamine" +msgstr "uued kanalid" msgid "add new transponders" -msgstr "transponderite lisamine" +msgstr "uued transponderid" msgid "DVB" msgstr "DVB" @@ -690,7 +931,7 @@ msgid "Button$Menu" msgstr "Menüü" msgid "Button$Reset" -msgstr "Nullimine" +msgstr "Reset" msgid "Opening CAM menu..." msgstr "CAM-menüü avamine..." @@ -702,16 +943,16 @@ msgid "CAM is in use - really reset?" msgstr "CAM on kasutuses - taaskäivitada?" msgid "Can't reset CAM!" -msgstr "CAM mooduli taaskäivitus ebaõnnestus!" +msgstr "CAM mooduli taaskäivitus nurjus!" msgid "do not pause live video" -msgstr "" +msgstr "mitte peatada" msgid "confirm pause live video" -msgstr "" +msgstr "peatam. kinnitus" msgid "pause live video" -msgstr "" +msgstr "peatada" msgid "Recording" msgstr "Salvestamine" @@ -732,7 +973,7 @@ msgid "Setup.Recording$Default lifetime (d)" msgstr "Salvestuse eluiga (päevi)" msgid "Setup.Recording$Pause key handling" -msgstr "" +msgstr "Pausi klahvi käsitsemine" msgid "Setup.Recording$Pause priority" msgstr "Pausi prioriteet" @@ -741,7 +982,7 @@ msgid "Setup.Recording$Pause lifetime (d)" msgstr "Pausi eluiga (päevi)" msgid "Setup.Recording$Use episode name" -msgstr "Episoodi nime kasutamine" +msgstr "Episoodinime kasutamine" msgid "Setup.Recording$Use VPS" msgstr "VPS-i kasutamine" @@ -750,19 +991,19 @@ msgid "Setup.Recording$VPS margin (s)" msgstr "VPS-i algusvaru (s)" msgid "Setup.Recording$Mark instant recording" -msgstr "Otsesalvestuse märgistamine" +msgstr "Kiirsalvestuse märgistamine" msgid "Setup.Recording$Name instant recording" -msgstr "Otsesalvestuse nimi" +msgstr "Kiirsalvestuse nimi" msgid "Setup.Recording$Instant rec. time (min)" -msgstr "Otsesalvestuse kestus (min)" +msgstr "Kiirsalvestuse kestus (min)" msgid "Setup.Recording$Max. video file size (MB)" -msgstr "Maksimaalne failisuurus (MB)" +msgstr "Maks. failisuurus (MB)" msgid "Setup.Recording$Split edited files" -msgstr "Failide tükeldamine" +msgstr "Failide jupitamine" msgid "Replay" msgstr "Taasesitus" @@ -780,7 +1021,7 @@ msgid "Miscellaneous" msgstr "Muud sätted" msgid "Setup.Miscellaneous$Min. event timeout (min)" -msgstr "Min. sündmuse kestus (min)" +msgstr "Min. saate taimaut (min)" msgid "Setup.Miscellaneous$Min. user inactivity (min)" msgstr "Min. kasutaja tegevusetus (min)" @@ -798,7 +1039,7 @@ msgid "Setup.Miscellaneous$Initial channel" msgstr "Kanal käivitamisel" msgid "Setup.Miscellaneous$as before" -msgstr "nagu enne" +msgstr "endine" msgid "Setup.Miscellaneous$Initial volume" msgstr "Helitugevus käivitamisel" @@ -845,7 +1086,7 @@ msgid "Button$Stop" msgstr "Stopp" msgid "Button$Resume" -msgstr "Jätka" +msgstr "Jätkata" #. TRANSLATORS: note the leading blank! msgid " Cancel editing" @@ -855,7 +1096,7 @@ msgid "Stop recording?" msgstr "Lõpetada salvestamine?" msgid "Cancel editing?" -msgstr "Tühistada muudatus?" +msgstr "Tühistada redigeermine?" msgid "No audio available!" msgstr "Audio kättesaamatu!" @@ -876,7 +1117,7 @@ msgid "No free DVB device to record!" msgstr "Puudub vaba DVB seade salvestamiseks!" msgid "Pausing live video..." -msgstr "Saate edastamise peatamine..." +msgstr "Otseülekande peatamine..." #. TRANSLATORS: note the trailing blank! msgid "Jump: " @@ -886,10 +1127,10 @@ msgid "No editing marks defined!" msgstr "Redigeerimise markerid puuduvad!" msgid "Can't start editing process!" -msgstr "Redigeerimise start ebaõnnestus!" +msgstr "Redigeerimise start nurjus!" msgid "Editing process started" -msgstr "Redigeerimine algas" +msgstr "Redigeerimine käivitatud" msgid "Editing process already active!" msgstr "Redigeerimine juba aktiivne!" @@ -925,13 +1166,13 @@ msgid "Low disk space!" msgstr "Kõvaketas täis!" msgid "Regenerating index file" -msgstr "" +msgstr "Indeksfaili regenereerimine" msgid "Index file regeneration complete" -msgstr "" +msgstr "Indeksfaili regenereerimine lõpetatud" msgid "Can't shutdown - option '-s' not given!" -msgstr "Väljalülitamine ebaõnnestus - '-s' parameeter puudub!" +msgstr "Väljalülitamine nurjus - '-s' parameeter puudub!" msgid "Editing - shut down anyway?" msgstr "Redigeerimine aktiive - lülitada välja?" @@ -964,10 +1205,10 @@ msgid "Volume " msgstr "Helitugevus " msgid "Classic VDR" -msgstr "Klassikaline VDR" +msgstr "Classic VDR" msgid "ST:TNG Panels" -msgstr "ST:TNG konsool" +msgstr "ST:TNG Panels" #. TRANSLATORS: the first character of each weekday, beginning with monday msgid "MTWTFSS" @@ -1002,10 +1243,10 @@ msgid "Upcoming recording!" msgstr "Salvestamine tulekul!" msgid "Pause live video?" -msgstr "" +msgstr "Peatada otseülekanne?" msgid "Recording started" -msgstr "Salvestamine algas" +msgstr "Salvestamine käivitatud" msgid "VDR will shut down later - press Power to force" msgstr "VDR lülitub välja hiljem - vajuta Power kiirendamiseks" @@ -1017,7 +1258,7 @@ msgid "Switching primary DVB..." msgstr "Esmase DVB seadme ümberlülitus..." msgid "Editing process failed!" -msgstr "Redigeerimine ebaõnnestus" +msgstr "Redigeerimine nurjus" msgid "Editing process finished" msgstr "Redigeerimine lõpetatud" diff --git a/po/fi_FI.po b/po/fi_FI.po index 9718e53..410bd67 100644 --- a/po/fi_FI.po +++ b/po/fi_FI.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2007-08-15 15:52+0200\n" "Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n" "Language-Team: Finnish\n" @@ -42,6 +42,247 @@ msgstr "Siirtotilan aloitus epäonnistui!" msgid "Starting EPG scan" msgstr "Ohjelmaoppaan päivitys aloitettu" +msgid "Content$Movie/Drama" +msgstr "Elokuva/draama" + +msgid "Content$Detective/Thriller" +msgstr "Etsivä/trilleri" + +msgid "Content$Adventure/Western/War" +msgstr "Seikkailu/western/sota" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "Scifi/fantasia/kauhu" + +msgid "Content$Comedy" +msgstr "Komedia" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "Saippua/melodraama/kansanperinne" + +msgid "Content$Romance" +msgstr "Romanssi" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "Vakava/klassinen/uskonnollinen/historiallinen elokuva/draama" + +msgid "Content$Adult Movie/Drama" +msgstr "Aikuiselokuva/draama" + +msgid "Content$News/Current Affairs" +msgstr "Uutiset/ajankohtaisohjelma" + +msgid "Content$News/Weather Report" +msgstr "Uutiset/säätiedot" + +msgid "Content$News Magazine" +msgstr "Uutismakasiini" + +msgid "Content$Documentary" +msgstr "Dokumentti" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "Keskustelu/haastattelu/väittely" + +msgid "Content$Show/Game Show" +msgstr "Show/visailu" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "Visailu/kilpailu" + +msgid "Content$Variety Show" +msgstr "Varietee" + +msgid "Content$Talk Show" +msgstr "Keskusteluohjelma" + +msgid "Content$Sports" +msgstr "Urheilua" + +msgid "Content$Special Event" +msgstr "Erikoistapahtuma" + +msgid "Content$Sport Magazine" +msgstr "Urheilumakasiini" + +msgid "Content$Football/Soccer" +msgstr "Jalkapallo" + +msgid "Content$Tennis/Squash" +msgstr "Tennis/Squash" + +msgid "Content$Team Sports" +msgstr "Joukkueurheilua" + +msgid "Content$Athletics" +msgstr "Yleisurheilua" + +msgid "Content$Motor Sport" +msgstr "Moottoriurheilua" + +msgid "Content$Water Sport" +msgstr "Vesiurheilua" + +msgid "Content$Winter Sports" +msgstr "Talviurheilua" + +msgid "Content$Equestrian" +msgstr "Ratsastusta" + +msgid "Content$Martial Sports" +msgstr "Kamppailu-urheilua" + +msgid "Content$Children's/Youth Programme" +msgstr "Lasten ja nuorten ohjelma" + +msgid "Content$Pre-school Children's Programme" +msgstr "Alle kouluikäisten ohjelma" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "Viihdeohjelma 6-14 vuotiaille" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "Viihdeohjelma 10-16 vuotiaille" + +msgid "Content$Informational/Educational/School Programme" +msgstr "Opetus/kouluohjelma" + +msgid "Content$Cartoons/Puppets" +msgstr "Piirretty/nukke-esitys" + +msgid "Content$Music/Ballet/Dance" +msgstr "Musiikki/baletti/tanssi" + +msgid "Content$Rock/Pop" +msgstr "Rock/pop" + +msgid "Content$Serious/Classical Music" +msgstr "Vakava/klassinen musiikki" + +msgid "Content$Folk/Tradional Music" +msgstr "Folk/kansanmusiikki" + +msgid "Content$Jazz" +msgstr "Jazz" + +msgid "Content$Musical/Opera" +msgstr "Musikaali/ooppera" + +msgid "Content$Ballet" +msgstr "Baletti" + +msgid "Content$Arts/Culture" +msgstr "Taide/kulttuuri" + +msgid "Content$Performing Arts" +msgstr "Performanssitaide" + +msgid "Content$Fine Arts" +msgstr "Kuvataide" + +msgid "Content$Religion" +msgstr "Uskonto" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "Populaarikulttuuri/perinnetaiteet" + +msgid "Content$Literature" +msgstr "Kirjallisuus" + +msgid "Content$Film/Cinema" +msgstr "Elokuvataide" + +msgid "Content$Experimental Film/Video" +msgstr "Kokeellinen elokuva/video" + +msgid "Content$Broadcasting/Press" +msgstr "Televisio/radio/lehdistö" + +msgid "Content$New Media" +msgstr "Uusmedia" + +msgid "Content$Arts/Culture Magazine" +msgstr "Taide/kulttuurimakasiini" + +msgid "Content$Fashion" +msgstr "Muoti" + +msgid "Content$Social/Political/Economics" +msgstr "Yhteiskunta/politiikka/talous" + +msgid "Content$Magazine/Report/Documentary" +msgstr "Makasiini/reportaasi/dokumentti" + +msgid "Content$Economics/Social Advisory" +msgstr "Talous/yhteiskunnallinen neuvonta" + +msgid "Content$Remarkable People" +msgstr "Merkittävät henkilöt" + +msgid "Content$Education/Science/Factual" +msgstr "Koulutus/tiede" + +msgid "Content$Nature/Animals/Environment" +msgstr "Luonto/eläimet/ympäristö" + +msgid "Content$Technology/Natural Sciences" +msgstr "Teknologia/luonnontiede" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "Lääketiede/fysiologia/psykologia" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "Vieraat maat/tutkimusretket" + +msgid "Content$Social/Spiritual Sciences" +msgstr "Yhteiskunta/hengelliset tieteet" + +msgid "Content$Further Education" +msgstr "Jatkokoulutus" + +msgid "Content$Languages" +msgstr "Kielet" + +msgid "Content$Leisure/Hobbies" +msgstr "Vapaa-aika ja harrastukset" + +msgid "Content$Tourism/Travel" +msgstr "Turismi/matkustaminen" + +msgid "Content$Handicraft" +msgstr "Käsityöt" + +msgid "Content$Motoring" +msgstr "Autoilu" + +msgid "Content$Fitness & Health" +msgstr "Kuntoilu & terveys" + +msgid "Content$Cooking" +msgstr "Ruuanlaitto" + +msgid "Content$Advertisement/Shopping" +msgstr "Mainostaminen/ostaminen" + +msgid "Content$Gardening" +msgstr "Puutarhanhoito" + +msgid "Content$Original Language" +msgstr "Alkuperäiskieli" + +msgid "Content$Black & White" +msgstr "Mustavalkoinen" + +msgid "Content$Unpublished" +msgstr "Julkaisematon" + +msgid "Content$Live Broadcast" +msgstr "Suoralähetys" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Ei esitystä" diff --git a/po/fr_FR.po b/po/fr_FR.po index 8f6778a..9f2768a 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-02-27 18:14+0100\n" "Last-Translator: Jean-Claude Repetto <jc@repetto.org>\n" "Language-Team: French\n" @@ -45,6 +45,247 @@ msgstr "Impossible d'utiliser le mode transfert !" msgid "Starting EPG scan" msgstr "Mise à jour du guide des programmes" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Sans titre" diff --git a/po/hr_HR.po b/po/hr_HR.po index 32976b8..7d923af 100644 --- a/po/hr_HR.po +++ b/po/hr_HR.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-03-17 19:00+0100\n" "Last-Translator: Adrian Caval <anrxc@sysphere.org>\n" "Language-Team: Croatian\n" @@ -41,6 +41,247 @@ msgstr "Nemoguæe zapoèeti Prijenos!!" msgid "Starting EPG scan" msgstr "Poèinjem EPG pretragu" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Bez naziva" diff --git a/po/hu_HU.po b/po/hu_HU.po index e3d2b70..1517920 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2007-12-01 21:42+0200\n" "Last-Translator: István Füley <ifuley@tigercomp.ro>\n" "Language-Team: Hungarian\n" @@ -42,6 +42,247 @@ msgstr "Transfer-Mode nem indítható!" msgid "Starting EPG scan" msgstr "EPG adatok aktualizálása" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "név nélkül" diff --git a/po/it_IT.po b/po/it_IT.po index 9032a7c..1a403ad 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" -"PO-Revision-Date: 2009-08-29 11:16+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" +"PO-Revision-Date: 2009-11-28 22:50+0100\n" "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" "Language-Team: Italian\n" "MIME-Version: 1.0\n" @@ -46,6 +46,247 @@ msgstr "Impossibile avviare mod. trasferimento!" msgid "Starting EPG scan" msgstr "Inizio scansione EPG" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Senza titolo" @@ -932,10 +1173,10 @@ msgid "Low disk space!" msgstr "Poco spazio su disco!" msgid "Regenerating index file" -msgstr "" +msgstr "Rigenerazione file indice" msgid "Index file regeneration complete" -msgstr "" +msgstr "Rigenerazione file indice completata" msgid "Can't shutdown - option '-s' not given!" msgstr "Impossibile spegnere - parametro '-s' non assegnato!" diff --git a/po/lt_LT.po b/po/lt_LT.po index c50a74b..dd36754 100644 --- a/po/lt_LT.po +++ b/po/lt_LT.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.7.9\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2009-10-17 14:19+0200\n" "Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n" "Language-Team: Lithuanian\n" @@ -39,6 +39,247 @@ msgstr "Negali pradÄ—ti perdavimo" msgid "Starting EPG scan" msgstr "Pradedamas EPG skanavimas" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Be pavadinimo" diff --git a/po/nl_NL.po b/po/nl_NL.po index 99a8f45..3634438 100644 --- a/po/nl_NL.po +++ b/po/nl_NL.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-02-26 17:20+0100\n" "Last-Translator: Johan Schuring <johan.schuring@vetteblei.nl>\n" "Language-Team: Dutch\n" @@ -43,6 +43,247 @@ msgstr "Kan Transfer-Mode niet starten" msgid "Starting EPG scan" msgstr "Bezig met starten EPG scan" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Geen titel" diff --git a/po/nn_NO.po b/po/nn_NO.po index 070e974..56975a5 100644 --- a/po/nn_NO.po +++ b/po/nn_NO.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2007-08-12 14:17+0200\n" "Last-Translator: Truls Slevigen <truls@slevigen.no>\n" "Language-Team: Norwegian\n" @@ -40,6 +40,247 @@ msgstr "Kan ikke starte transfer modus!" msgid "Starting EPG scan" msgstr "" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "" diff --git a/po/pl_PL.po b/po/pl_PL.po index daca48f..0143db8 100644 --- a/po/pl_PL.po +++ b/po/pl_PL.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-03-09 12:59+0100\n" "Last-Translator: Michael Rakowski <mrak@gmx.de>\n" "Language-Team: Polish\n" @@ -40,6 +40,247 @@ msgstr "Nie mo¿na uruchomiæ trybu transferu!" msgid "Starting EPG scan" msgstr "Rozpoczynam skanowanie EPG" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Bez tytu³u" diff --git a/po/pt_PT.po b/po/pt_PT.po index cee93d7..e863f8c 100644 --- a/po/pt_PT.po +++ b/po/pt_PT.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-03-18 17:04+0100\n" "Last-Translator: anonymous\n" "Language-Team: Portuguese\n" @@ -39,6 +39,247 @@ msgstr "Impossível iniciar modo de transferência!" msgid "Starting EPG scan" msgstr "Iniciar a procura de EPG" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Sem título" diff --git a/po/ro_RO.po b/po/ro_RO.po index 6059aa5..79a2690 100644 --- a/po/ro_RO.po +++ b/po/ro_RO.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-02-25 00:39+0100\n" "Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n" "Language-Team: Romanian\n" @@ -42,6 +42,247 @@ msgstr "Nu pot porni modul de transfer!" msgid "Starting EPG scan" msgstr "Pornesc achiziþia EPG" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Fãrã titlu" diff --git a/po/ru_RU.po b/po/ru_RU.po index 3de7043..eb71a20 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-12-15 14:37+0100\n" "Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n" "Language-Team: Russian\n" @@ -40,6 +40,247 @@ msgstr "½ÕÒÞ×ÜÞÖÝÞ ÒÚÛîçØâì àÕÖØÜ ßàÞßãáÚÐ!" msgid "Starting EPG scan" msgstr "½ÐçØÝÐî EPG-áÚÐÝØàÞÒÐÝØÕ" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "±Õ× ÝÐ×ÒÐÝØï" diff --git a/po/sk_SK.po b/po/sk_SK.po index 8471140..5068882 100644 --- a/po/sk_SK.po +++ b/po/sk_SK.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2009-09-30 12:50+0100\n" "Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n" "Language-Team: Slovak\n" @@ -40,6 +40,247 @@ msgstr "Nemô¾e spusti» prenos!" msgid "Starting EPG scan" msgstr "Zaèína prehµadáva» EPG" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Bez názvu" diff --git a/po/sl_SI.po b/po/sl_SI.po index 4f89ff7..7b3b05f 100644 --- a/po/sl_SI.po +++ b/po/sl_SI.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-02-28 19:44+0100\n" "Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n" "Language-Team: Slovenian\n" @@ -40,6 +40,247 @@ msgstr "Ne morem zaèeti s prenosnim naèinom!" msgid "Starting EPG scan" msgstr "Prièenjam EPG-scan" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Brez naziva" diff --git a/po/sv_SE.po b/po/sv_SE.po index d368bb6..17a1da6 100644 --- a/po/sv_SE.po +++ b/po/sv_SE.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-03-12 18:25+0100\n" "Last-Translator: Magnus Andersson <svankan@bahnhof.se>\n" "Language-Team: Swedish\n" @@ -42,6 +42,247 @@ msgstr "Kan inte starta Transfer Mode!" msgid "Starting EPG scan" msgstr "Påbörjar EPG skanning" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "ingen titel" diff --git a/po/tr_TR.po b/po/tr_TR.po index 39138d5..e921986 100644 --- a/po/tr_TR.po +++ b/po/tr_TR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2008-02-28 00:33+0100\n" "Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n" "Language-Team: Turkish\n" @@ -39,6 +39,247 @@ msgstr "Transfer modu baþlatýlamýyor!" msgid "Starting EPG scan" msgstr "EPG tarama baþlýyor" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Ýsim yok" diff --git a/po/uk_UA.po b/po/uk_UA.po index 6c2f58a..17c8371 100644 --- a/po/uk_UA.po +++ b/po/uk_UA.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.7.7\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2009-05-31 13:17+0200\n" "Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n" "Language-Team: Ukrainian\n" @@ -39,6 +39,247 @@ msgstr "Ðеможливо включити режим пропуÑку!" msgid "Starting EPG scan" msgstr "Починаю EPG-ÑкануваннÑ" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "Без назви" diff --git a/po/zh_CN.po b/po/zh_CN.po index 03bddab..1f6eaac 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 2009-11-22 12:28+0100\n" +"POT-Creation-Date: 2010-01-03 15:10+0100\n" "PO-Revision-Date: 2009-09-23 23:50+0800\n" "Last-Translator: Nan Feng <nfgx@21cn.com>\n" "Language-Team: Chinese\n" @@ -42,6 +42,247 @@ msgstr "ä¸èƒ½å¯åŠ¨ä¼ é€æ¨¡å¼" msgid "Starting EPG scan" msgstr "开始节目å•æ‰«æ" +msgid "Content$Movie/Drama" +msgstr "" + +msgid "Content$Detective/Thriller" +msgstr "" + +msgid "Content$Adventure/Western/War" +msgstr "" + +msgid "Content$Science Fiction/Fantasy/Horror" +msgstr "" + +msgid "Content$Comedy" +msgstr "" + +msgid "Content$Soap/Melodrama/Folkloric" +msgstr "" + +msgid "Content$Romance" +msgstr "" + +msgid "Content$Serious/Classical/Religious/Historical Movie/Drama" +msgstr "" + +msgid "Content$Adult Movie/Drama" +msgstr "" + +msgid "Content$News/Current Affairs" +msgstr "" + +msgid "Content$News/Weather Report" +msgstr "" + +msgid "Content$News Magazine" +msgstr "" + +msgid "Content$Documentary" +msgstr "" + +msgid "Content$Discussion/Inverview/Debate" +msgstr "" + +msgid "Content$Show/Game Show" +msgstr "" + +msgid "Content$Game Show/Quiz/Contest" +msgstr "" + +msgid "Content$Variety Show" +msgstr "" + +msgid "Content$Talk Show" +msgstr "" + +msgid "Content$Sports" +msgstr "" + +msgid "Content$Special Event" +msgstr "" + +msgid "Content$Sport Magazine" +msgstr "" + +msgid "Content$Football/Soccer" +msgstr "" + +msgid "Content$Tennis/Squash" +msgstr "" + +msgid "Content$Team Sports" +msgstr "" + +msgid "Content$Athletics" +msgstr "" + +msgid "Content$Motor Sport" +msgstr "" + +msgid "Content$Water Sport" +msgstr "" + +msgid "Content$Winter Sports" +msgstr "" + +msgid "Content$Equestrian" +msgstr "" + +msgid "Content$Martial Sports" +msgstr "" + +msgid "Content$Children's/Youth Programme" +msgstr "" + +msgid "Content$Pre-school Children's Programme" +msgstr "" + +msgid "Content$Entertainment Programme for 6 to 14" +msgstr "" + +msgid "Content$Entertainment Programme for 10 to 16" +msgstr "" + +msgid "Content$Informational/Educational/School Programme" +msgstr "" + +msgid "Content$Cartoons/Puppets" +msgstr "" + +msgid "Content$Music/Ballet/Dance" +msgstr "" + +msgid "Content$Rock/Pop" +msgstr "" + +msgid "Content$Serious/Classical Music" +msgstr "" + +msgid "Content$Folk/Tradional Music" +msgstr "" + +msgid "Content$Jazz" +msgstr "" + +msgid "Content$Musical/Opera" +msgstr "" + +msgid "Content$Ballet" +msgstr "" + +msgid "Content$Arts/Culture" +msgstr "" + +msgid "Content$Performing Arts" +msgstr "" + +msgid "Content$Fine Arts" +msgstr "" + +msgid "Content$Religion" +msgstr "" + +msgid "Content$Popular Culture/Traditional Arts" +msgstr "" + +msgid "Content$Literature" +msgstr "" + +msgid "Content$Film/Cinema" +msgstr "" + +msgid "Content$Experimental Film/Video" +msgstr "" + +msgid "Content$Broadcasting/Press" +msgstr "" + +msgid "Content$New Media" +msgstr "" + +msgid "Content$Arts/Culture Magazine" +msgstr "" + +msgid "Content$Fashion" +msgstr "" + +msgid "Content$Social/Political/Economics" +msgstr "" + +msgid "Content$Magazine/Report/Documentary" +msgstr "" + +msgid "Content$Economics/Social Advisory" +msgstr "" + +msgid "Content$Remarkable People" +msgstr "" + +msgid "Content$Education/Science/Factual" +msgstr "" + +msgid "Content$Nature/Animals/Environment" +msgstr "" + +msgid "Content$Technology/Natural Sciences" +msgstr "" + +msgid "Content$Medicine/Physiology/Psychology" +msgstr "" + +msgid "Content$Foreign Countries/Expeditions" +msgstr "" + +msgid "Content$Social/Spiritual Sciences" +msgstr "" + +msgid "Content$Further Education" +msgstr "" + +msgid "Content$Languages" +msgstr "" + +msgid "Content$Leisure/Hobbies" +msgstr "" + +msgid "Content$Tourism/Travel" +msgstr "" + +msgid "Content$Handicraft" +msgstr "" + +msgid "Content$Motoring" +msgstr "" + +msgid "Content$Fitness & Health" +msgstr "" + +msgid "Content$Cooking" +msgstr "" + +msgid "Content$Advertisement/Shopping" +msgstr "" + +msgid "Content$Gardening" +msgstr "" + +msgid "Content$Original Language" +msgstr "" + +msgid "Content$Black & White" +msgstr "" + +msgid "Content$Unpublished" +msgstr "" + +msgid "Content$Live Broadcast" +msgstr "" + +#, c-format +msgid "ParentalRating$from %d" +msgstr "" + msgid "No title" msgstr "æ²¡æœ‰æ ‡é¢˜" @@ -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 } @@ -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 @@ -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: ; } } } @@ -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; @@ -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: @@ -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 @@ -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"); } } @@ -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) @@ -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); @@ -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"); @@ -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 @@ -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 '+') @@ -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" |