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).
This commit is contained in:
Klaus Schmidinger 2010-01-06 13:34:00 +01:00
parent ea01358b3b
commit 939081e274
100 changed files with 8342 additions and 2200 deletions

View File

@ -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

79
HISTORY
View File

@ -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).

View File

@ -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\

View File

@ -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.

View File

@ -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

View File

@ -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.

View File

@ -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!

View File

@ -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;
}

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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).

View File

@ -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;

View File

@ -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).

View File

@ -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;

View File

@ -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.

View File

@ -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);

View File

@ -1,70 +0,0 @@
VDR Plugin 'sky' Revision History
---------------------------------
2002-12-01: Version 0.0.1
- Initial revision.
2002-12-13: Version 0.1.0
- Changed setting of CXX and CXXFLAGS variables in Makefile.
2003-05-09: Version 0.1.1
- Changed Start() to Initialize().
2004-01-04: Version 0.2.0
- Implemented automatic PID switching and channel detection
2004-02-15: Version 0.3.0
- Now using the actual channel IDs a derived from the data stream.
- Switched EPG data retrieval to http://www.bleb.org.
- Added automatic DST detection to getskyepg.pl.
- Fixed handling receivers, so that a recording on the same channel
won't interrupt an ongoing Transfer mode.
2004-10-16: Version 0.3.1
- Improved buffer handling.
2004-12-12: Version 0.3.2
- Changed Apid access in cChannel.
2004-12-19: Version 0.3.3
- Made several functions threadsafe.
- Removed delay_ms(), using cCondWait::SleepMs() instead.
2005-09-17: Version 0.3.4
- Added a missing include statement.
2006-03-26: Version 0.3.5
- Fixed format string handling.
2006-12-02: Version 0.3.5 (version number not increased)
- Made the getskyepg.pl script send a user agent message to
the server, according to the rules at http://bleb.org/tv/data/listings.
If your version of 'wget' doesn't support the -U option to set the user agent,
use the new option -U of getskyepg.pl to have the information added to the URL
as a query string.
- The getskyepg.pl script now replaces "&amp;" with "&".
2007-08-15: Version 0.3.6
- Moved the "all" target in the Makefile before the "Implicit rules",
so that a plain "make" will compile everything.
2008-03-22: Version 0.3.7
- Removed the full path from the 'logger' call in the getskyepg.pl script (this
program is apparently "on the move" through the file system...).
2008-09-07: Version 0.3.8
- Fixed renamed constants (thanks to Udo Richter).

View File

@ -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.

View File

@ -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

View File

@ -1,260 +0,0 @@
#!/usr/bin/perl
# getskyepg.pl: Get EPG data for Sky channels from the Internet
#
# Connects to a running VDR instance via SVDRP, gets the channel data
# for the Sky channels and connects to Internet web pages to extract the
# EPG data for these channels. The result is sent to VDR via SVDRP.
#
# See the README file for copyright information and how to reach the author.
#
# $Id: getskyepg.pl 2.1 2009/10/18 14:05:47 kls Exp $
use Getopt::Std;
use Time::Local;
$Usage = qq{
Usage: $0 [options]
Options: -c filename channel config file name (default: channels.conf.sky)
-d hostname destination hostname (default: localhost)
-p port SVDRP port number (default: 2001)
-S source channel source (default: S28.2E)
-D days days to get EPG for (1..7, default: 2)
-U use this if your version of 'wget' doesn't support -U
};
die $Usage if (!getopts("c:d:D:hp:S:U") || $opt_h);
$Conf = $opt_c || "channels.conf.sky";
$Dest = $opt_d || "localhost";
$Port = $opt_p || 2001;
$Source = $opt_S || "S28.2E";
$Days = $opt_D || 2;
$User = $opt_U;
# See "Rules for using this data" on http://bleb.org/tv/data/listings.
# In case you modify this script in a way that changes its behavior
# towards the www.bleb.org website, please replace 'vdr-bugs@tvdr.de'
# with your own email address! That way Andrew Flegg <andrew@bleb.org>,
# who runs that web site, can contact you in case of problems.
$IDENT = "VDR::getskyepg.pl, http://www.tvdr.de - vdr-bugs\@tvdr.de";
$GAP = 2;
$SkyWebPage = "www.bleb.org/tv/data/listings";
$WGET = "/usr/bin/wget -q -O-";
$WGET .= " -U '$IDENT'" unless $User;
$LOGGER = "logger -t SKYEPG";
$DST = -3600; # Daylight Saving Time offset
$SecsInDay = 86400;
@Channels = ();
$idxSource = 0;
$idxNumber = 1;
$idxName = 2;
Error("days out of range: $Days") unless (1 <= $Days && $Days <= 7);
sub Log
{
system("$LOGGER '@_'");
}
sub Error
{
Log(@_);
die "$0: @_\n";
}
sub GetChannels
{
open(CHANNELS, $Conf) || Error("$Conf: $!");
while (<CHANNELS>) {
chomp;
next if (/^#/);
my @a = split(":");
push(@Channels, [@a]) unless ($a[$idxName] eq "x");
}
close(CHANNELS);
}
GetChannels();
sub GetPage
{
my $channel = shift;
my $day = shift;
$day--;
my $url = "http://$SkyWebPage/$day/$channel.xml";
$url .= "?$IDENT" if $User;
Log("reading $url");
my @page = split("\n", `$WGET '$url'`);
Log("received " . ($#page + 1) . " lines");
return @page;
}
sub ReplaceTags
{
my $s = shift;
$s =~ s/&amp;/&/g;
return $s;
}
sub StripWhitespace
{
my $s = shift;
$s =~ s/\s*(.*)\s*/$1/;
$s =~ s/\s+/ /g;
return $s;
}
sub Extract
{
my $s = shift;
my $t = shift;
$s =~ /<$t>([^<]*)<\/$t>/;
return ReplaceTags(StripWhitespace($1));
}
# In order to get the duration we need to buffer the last event:
$Id = "";
$Time = 0;
$Title = "";
$Subtitle = "";
$Desc = "";
sub GetEpgData
{
my ($channel, $channelID) = @_;
my $numEvents = 0;
SVDRPsend("C $channelID");
$Time = 0;
for $day (1 .. $Days) {
my $dt = 0;
my @page = GetPage($channel, $day);
my $data = "";
for $line (@page) {
chomp($line);
if ($line =~ /<programme>/) {
$data = "";
}
elsif ($line =~ /<\/programme>/) {
my $title = Extract($data, "title");
my $subtitle = Extract($data, "subtitle");
my $desc = Extract($data, "desc");
my $start = Extract($data, "start");
# 'end' is useless, because it is sometimes missing :-(
# my $end = Extract($data, "end");
if (!$subtitle) {
# They sometimes write all info into the description, as in
# Episode: some description.
# Why don't they just fill in the data correctly?
my ($s, $d) = ($desc =~ /([^:]*)[:](.*)/);
if ($s && $d) {
$subtitle = $s;
$desc = $d;
}
}
# 'start' and 'end' as time of day isn't of much use here, since
# the page for one day contains data that actually belongs to the
# next day (after midnight). Oh well, lets reconstruct the missing
# information:
$start = "0" . $start if (length($start) < 4);
my ($h, $m) = ($start =~ /(..)(..)/);
$dt = $SecsInDay if ($h > 12);
# convert to time_t:
my @gmt = gmtime;
$gmt[0] = 0; # seconds
$gmt[1] = $m; # minutes
$gmt[2] = $h; # hours
$time = timegm(@gmt) + ($day - 1) * $SecsInDay + ($h < 12 ? $dt : 0);
# compensate for DST:
$time += $DST if (localtime($time))[8];
# create EPG data:
if ($Time) {
$duration = $time - $Time;
SVDRPsend("E $Id $Time $duration");
SVDRPsend("T $Title");
SVDRPsend("S $Subtitle");
SVDRPsend("D $Desc");
SVDRPsend("e");
$numEvents++;
}
# buffer the last event:
$Id = $time / 60 % 0xFFFF; # this gives us unique ids for every minute of over 6 weeks
$Time = $time;
$Title = $title;
$Subtitle = $subtitle;
$Desc = $desc;
}
else {
$data .= $line;
}
}
sleep($GAP);
}
SVDRPsend("c");
Log("generated $numEvents EPG events");
}
sub ProcessEpg
{
for (@Channels) {
my $channel = @$_[$idxName];
my $channelID = @$_[$idxSource];
Log("processing channel $channel - $channelID");
SVDRPsend("PUTE");
SVDRPreceive(354);
GetEpgData($channel, $channelID);
SVDRPsend(".");
SVDRPreceive(250);
}
Log("done");
}
#---------------------------------------------------------------------------
# TODO: make this a Perl module??? What about Error()???
use Socket;
$Timeout = 300; # max. seconds to wait for response
$SIG{ALRM} = sub { Error("timeout"); };
alarm($Timeout);
$iaddr = inet_aton($Dest) || Error("no host: $Dest");
$paddr = sockaddr_in($Port, $iaddr);
$proto = getprotobyname('tcp');
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || Error("socket: $!");
connect(SOCK, $paddr) || Error("connect: $!");
select(SOCK); $| = 1;
SVDRPreceive(220);
ProcessEpg();
SVDRPsend("QUIT");
sub SVDRPsend
{
my $s = shift;
print SOCK "$s\r\n";
}
sub SVDRPreceive
{
my $expect = shift | 0;
my @a = ();
while (<SOCK>) {
s/\s*$//; # 'chomp' wouldn't work with "\r\n"
push(@a, $_);
if (substr($_, 3, 1) ne "-") {
my $code = substr($_, 0, 3);
Error("expected SVDRP code $expect, but received $code") if ($code != $expect);
last;
}
}
return @a;
}
#---------------------------------------------------------------------------

View File

@ -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

View File

@ -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!

0
Syd Normal file
View File

View File

@ -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);

View File

@ -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; }

28
ci.c
View File

@ -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,9 +610,7 @@ 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)
capmt[length++] = 0x00; // program_info_length L
AddCaDescriptors(caDescriptorsLength, caDescriptors);
}
@ -632,9 +630,7 @@ 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)
capmt[length++] = 0x00; // ES_info_length L
AddCaDescriptors(caDescriptorsLength, caDescriptors);
}
}
@ -642,13 +638,16 @@ void cCiCaPmt::AddPid(int Pid, uint8_t StreamType)
void cCiCaPmt::AddCaDescriptors(int Length, const uint8_t *Data)
{
if (esInfoLengthPos) {
if (length + Length <= int(sizeof(capmt))) {
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");
esInfoLengthPos = 0;
@ -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;
}

View File

@ -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;

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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");
}

View File

@ -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);

View File

@ -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 {

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

View File

@ -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__);
}
}
}

120
dvbspu.c
View File

@ -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:
@ -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) {
if (!fg || !bg || !osd)
Hide();
}
if (bg || fg) {
if (osd == NULL) {
restricted_osd = false;
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());

View File

@ -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

View File

@ -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) {

51
eit.c
View File

@ -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: ;
}
}

5
eit.h
View File

@ -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

193
epg.c
View File

@ -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);
}

27
epg.h
View File

@ -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);

9
font.c
View File

@ -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];

7
font.h
View File

@ -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;

View File

@ -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;

View File

@ -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
}

13
menu.c
View File

@ -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: ;
}
}
}

View File

@ -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?

View File

@ -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

3
nit.c
View File

@ -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;
}

8
osd.c
View File

@ -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

12
pat.c
View File

@ -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,13 +447,15 @@ 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());
}
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);
Channel->SetCaIds(CaDescriptors->CaIds());

View File

@ -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 {

View File

@ -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
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"

View File

@ -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
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"

View File

@ -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"

View File

@ -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"

View File

@ -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 "×ùñßò Ôßôëï"

View File

@ -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 "
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"

View File

@ -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
#, 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"

View File

@ -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
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ä"

View File

@ -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"

View File

@ -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
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"

View File

@ -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
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"

View File

@ -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!"

View File

@ -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"

View File

@ -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"

View File

@ -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 ""

View File

@ -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
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"

View File

@ -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
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"

View File

@ -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"

View File

@ -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 "±Õ× ÝÐ×ÒÐÝØï"

View File

@ -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
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"

View File

@ -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
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"

View File

@ -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"

View File

@ -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
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"

View File

@ -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 "Без назви"

View File

@ -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 "没有标题"

View File

@ -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
}

View File

@ -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();
}

View File

@ -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)

View File

@ -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

View File

@ -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: ;
}
}
}

40
remux.c
View File

@ -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;

35
remux.h
View File

@ -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:

13
sdt.c
View File

@ -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;

View File

@ -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));

View File

@ -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);

View File

@ -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

11
svdrp.c
View File

@ -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");
}
}

View File

@ -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)

17
tools.h
View File

@ -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);

View File

@ -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");

18
vdr.1
View File

@ -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

65
vdr.5
View File

@ -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 '+')

14
vdr.c
View File

@ -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"