Version 1.7.21

Original announce message:
VDR developer version 1.7.21 is now available at

       ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.21.tar.bz2

A 'diff' against the previous version is available at

       ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.20-1.7.21.diff

MD5 checksums:

7300bfd997db1a848bd774fefe4aec80  vdr-1.7.21.tar.bz2
c4e745939f31543dd607b97d58fc86be  vdr-1.7.20-1.7.21.diff

WARNING:
========

This is a developer version. Even though I use it in my productive
environment. I strongly recommend that you only use it under controlled
conditions and for testing and debugging.

This version contains functions to determine the "signal strength"
and "signal quality" through cDevice. If you are using a DVB card that
contains an stb0899 frontend chip (like the TT-budget S2-3200) you may
want to apply the patches from

   ftp://ftp.tvdr.de/vdr/Developer/Driver-Patches

to the LinuxDVB driver source in order to receive useful results from
that frontend.

From the HISTORY file:
- Fixed detecting frames for channels that split frames into several payloads
  (reported by Derek Kelly).
- Now initializing Setup.InitialChannel to an empty string to avoid problems in
  case there is no setup.conf.
- The start time of an edited recording is now set to the time of the first
  editing mark (thanks to Udo Richter).
  This obsoletes the CUTTIME patch.
- Direct access to the members start, priority, lifetime, and deleted of cRecording
  as well as to position and comment of cMark is now deprecated. Plugin authors
  should switch to the new access functions for these members. For now the macro
  __RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS is defined in recording.h, which
  exposes these members, so that existing plugins will still compile. Comment out
  this #define to check whether a particular plugin needs to be modified.
  This #define may be removed in a future version.
- The new functions cRecording::NumFrames() and cRecording::LengthInSeconds() return
  the number of frames and length (in seconds) of a recording (suggested by Steffen
  Barszus).
- The subtitle PIDs are now stored in the channels.conf file as an extension to the
  TPID field (thanks to Rolf Ahrenberg).
- The new function cDevice::ProvidesEIT() is used to determine whether a device can
  provide EIT data and will thus be used in cEITScanner::Process() to receive EIT
  data from the channels it can receive (suggested by Rolf Ahrenberg). Note that by
  default it is assumed that a device can't provide EIT data, and only the builtin
  cDvbDevice returns true from this function.
- The Audio and Subtitles options are now available through the Green and Yellow
  keys in the Setup/DVB menu (thanks to Rolf Ahrenberg). This is mainly for remote
  controls that don't have dedicated keys for these functions.
- The SVDRP command HITK now accepts multiple keys (up to 31).
- The Recordings menu now displays the length (in hours:minutes) of each recording
  (thanks to Rolf Ahrenberg). Note that the "new" indicator has been moved from the
  recording time to the length column. This new format is also used by the SVDRP
  command LSTR, so in case you have an application that parses the LSTR output,
  you will need to adjust it to the new format.
- The dvbsddevice plugin now supports the new option --outputonly, which disables
  receiving on SD FF devices and uses the device only for output (thanks to Udo
  Richter).
- Fixed detecting frames on radio channels (reported by Chris Mayo).
- Revoked the changes to cFrameDetector that have been introduced in version 1.7.19.
  Detecting frames in case the Picture Start Code or Access Unit Delimiter
  extends over TS packet boundaries is now done by locally skipping TS packets
  in cFrameDetector.
This commit is contained in:
Klaus Schmidinger 2011-09-04 15:42:00 +02:00 committed by Dieter Hametner
parent 7df66b0587
commit 0c96d6b626
65 changed files with 842 additions and 451 deletions

View File

@ -743,6 +743,7 @@ Steffen Barszus <st_barszus@gmx.de>
for helping to debug a crash when using the --terminal option without having access for helping to debug a crash when using the --terminal option without having access
to the given terminal to the given terminal
for fixing following symbolic links in RemoveFileOrDir() for fixing following symbolic links in RemoveFileOrDir()
for suggesting to cache the length of a recording's index
Peter Seyringer <e9425234@student.tuwien.ac.at> Peter Seyringer <e9425234@student.tuwien.ac.at>
for reporting a bug in saving the polarization parameter of channels that have a for reporting a bug in saving the polarization parameter of channels that have a
@ -1111,6 +1112,11 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi>
for fixing some crashes in subtitle display for fixing some crashes in subtitle display
for reporting that DELETENULL() was not thread safe for reporting that DELETENULL() was not thread safe
for reporting a crash in subtitle display, related to cOsd::Osds for reporting a crash in subtitle display, related to cOsd::Osds
for a patch that stores the subtitle PIDs in the channels.conf file
for suggesting to implement a way for devices to tell whether they can provide EIT data
for making the Audio and Subtitles options available through the Green and Yellow
keys in the Setup/DVB menu
for making the Recordings menu display the length (in hours:minutes) of each recording
Ralf Klueber <ralf.klueber@vodafone.com> Ralf Klueber <ralf.klueber@vodafone.com>
for reporting a bug in cutting a recording if there is only a single editing mark for reporting a bug in cutting a recording if there is only a single editing mark
@ -1708,6 +1714,9 @@ Udo Richter <udo_richter@gmx.de>
the marks file has just been written" the marks file has just been written"
for suggesting a fix for a bug in handling DiSEqC codes for suggesting a fix for a bug in handling DiSEqC codes
for fixing handling the channelID in cMenuEditChanItem for fixing handling the channelID in cMenuEditChanItem
for a patch that sets the start time of an edited recording to the time of the first
editing mark
for adding the option --outputonly to the dvbsddevice plugin
Sven Kreiensen <svenk@kammer.uni-hannover.de> Sven Kreiensen <svenk@kammer.uni-hannover.de>
for his help in keeping 'channels.conf.terr' up to date for his help in keeping 'channels.conf.terr' up to date
@ -2593,6 +2602,8 @@ Derek Kelly (user.vdr@gmail.com)
for reporting a problem with the fps value in the info file of a recording being for reporting a problem with the fps value in the info file of a recording being
overwritten in case a recording was interrupted and resumed, and the fps value overwritten in case a recording was interrupted and resumed, and the fps value
could not be determined after resuming recording could not be determined after resuming recording
for reporting a problem with detecting frames for channels that split frames into
several payloads
Marcel Unbehaun <frostworks@gmx.de> Marcel Unbehaun <frostworks@gmx.de>
for adding cRecordingInfo::GetEvent() for adding cRecordingInfo::GetEvent()
@ -2760,3 +2771,6 @@ Mark Hawes <MARK.HAWES@au.fujitsu.com>
Frank Niederwipper <f.niederwipper@gmail.com> Frank Niederwipper <f.niederwipper@gmail.com>
for reporting a problem in timer handling in case a recording directory can't for reporting a problem in timer handling in case a recording directory can't
be created be created
Chris Mayo <aklhfex@gmail.com>
for reporting a problem with detecting frames on radio channels

44
HISTORY
View File

@ -6698,3 +6698,47 @@ Video Disk Recorder Revision History
- cTimeMs is no longer initialized to the current time if the value given to the - cTimeMs is no longer initialized to the current time if the value given to the
constructor is negative (avoids the "cTimeMs: using monotonic clock..." log message constructor is negative (avoids the "cTimeMs: using monotonic clock..." log message
before VDR's starting log message). before VDR's starting log message).
2011-09-04: Version 1.7.21
- Fixed detecting frames for channels that split frames into several payloads
(reported by Derek Kelly).
- Now initializing Setup.InitialChannel to an empty string to avoid problems in
case there is no setup.conf.
- The start time of an edited recording is now set to the time of the first
editing mark (thanks to Udo Richter).
This obsoletes the CUTTIME patch.
- Direct access to the members start, priority, lifetime, and deleted of cRecording
as well as to position and comment of cMark is now deprecated. Plugin authors
should switch to the new access functions for these members. For now the macro
__RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS is defined in recording.h, which
exposes these members, so that existing plugins will still compile. Comment out
this #define to check whether a particular plugin needs to be modified.
This #define may be removed in a future version.
- The new functions cRecording::NumFrames() and cRecording::LengthInSeconds() return
the number of frames and length (in seconds) of a recording (suggested by Steffen
Barszus).
- The subtitle PIDs are now stored in the channels.conf file as an extension to the
TPID field (thanks to Rolf Ahrenberg).
- The new function cDevice::ProvidesEIT() is used to determine whether a device can
provide EIT data and will thus be used in cEITScanner::Process() to receive EIT
data from the channels it can receive (suggested by Rolf Ahrenberg). Note that by
default it is assumed that a device can't provide EIT data, and only the builtin
cDvbDevice returns true from this function.
- The Audio and Subtitles options are now available through the Green and Yellow
keys in the Setup/DVB menu (thanks to Rolf Ahrenberg). This is mainly for remote
controls that don't have dedicated keys for these functions.
- The SVDRP command HITK now accepts multiple keys (up to 31).
- The Recordings menu now displays the length (in hours:minutes) of each recording
(thanks to Rolf Ahrenberg). Note that the "new" indicator has been moved from the
recording time to the length column. This new format is also used by the SVDRP
command LSTR, so in case you have an application that parses the LSTR output,
you will need to adjust it to the new format.
- The dvbsddevice plugin now supports the new option --outputonly, which disables
receiving on SD FF devices and uses the device only for output (thanks to Udo
Richter).
- Fixed detecting frames on radio channels (reported by Chris Mayo).
- Revoked the changes to cFrameDetector that have been introduced in version 1.7.19.
Detecting frames in case the Picture Start Code or Access Unit Delimiter
extends over TS packet boundaries is now done by locally skipping TS packets
in cFrameDetector.

View File

@ -3,7 +3,7 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: dvbhddevice.c 1.13 2011/04/24 09:31:21 kls Exp $ * $Id: dvbhddevice.c 1.14 2011/08/27 09:31:45 kls Exp $
*/ */
#include <vdr/plugin.h> #include <vdr/plugin.h>
@ -11,7 +11,7 @@
#include "setup.h" #include "setup.h"
static const char *VERSION = "0.0.4"; static const char *VERSION = "0.0.4";
static const char *DESCRIPTION = "HD Full Featured DVB device"; static const char *DESCRIPTION = trNOOP("HD Full Featured DVB device");
class cPluginDvbhddevice : public cPlugin { class cPluginDvbhddevice : public cPlugin {
private: private:
@ -20,7 +20,7 @@ public:
cPluginDvbhddevice(void); cPluginDvbhddevice(void);
virtual ~cPluginDvbhddevice(); virtual ~cPluginDvbhddevice();
virtual const char *Version(void) { return VERSION; } virtual const char *Version(void) { return VERSION; }
virtual const char *Description(void) { return DESCRIPTION; } virtual const char *Description(void) { return tr(DESCRIPTION); }
virtual cMenuSetupPage *SetupMenu(void); virtual cMenuSetupPage *SetupMenu(void);
virtual bool SetupParse(const char *Name, const char *Value); virtual bool SetupParse(const char *Name, const char *Value);
}; };

View File

@ -3,7 +3,7 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: dvbhdffdevice.c 1.32 2011/05/22 15:19:59 kls Exp $ * $Id: dvbhdffdevice.c 1.33 2011/08/27 09:32:18 kls Exp $
*/ */
#include "dvbhdffdevice.h" #include "dvbhdffdevice.h"
@ -54,6 +54,7 @@ cDvbHdFfDevice::cDvbHdFfDevice(int Adapter, int Frontend)
hdmiConfig.TransmitAudio = true; hdmiConfig.TransmitAudio = true;
hdmiConfig.ForceDviMode = false; hdmiConfig.ForceDviMode = false;
hdmiConfig.CecEnabled = gHdffSetup.CecEnabled; hdmiConfig.CecEnabled = gHdffSetup.CecEnabled;
hdmiConfig.VideoModeAdaption = (HDFF::eVideoModeAdaption) gHdffSetup.VideoModeAdaption;
mHdffCmdIf->CmdHdmiConfigure(&hdmiConfig); mHdffCmdIf->CmdHdmiConfigure(&hdmiConfig);
if (gHdffSetup.CecEnabled) if (gHdffSetup.CecEnabled)
mHdffCmdIf->CmdHdmiSendCecCommand(HDFF::cecCommandTvOn); mHdffCmdIf->CmdHdmiSendCecCommand(HDFF::cecCommandTvOn);
@ -110,7 +111,7 @@ void cDvbHdFfDevice::SetVideoFormat(bool VideoFormat16_9)
{ {
HDFF::tVideoFormat videoFormat; HDFF::tVideoFormat videoFormat;
videoFormat.AutomaticEnabled = true; videoFormat.AutomaticEnabled = true;
videoFormat.AfdEnabled = false; videoFormat.AfdEnabled = true;
videoFormat.TvFormat = (HDFF::eTvFormat) gHdffSetup.TvFormat; videoFormat.TvFormat = (HDFF::eTvFormat) gHdffSetup.TvFormat;
videoFormat.VideoConversion = (HDFF::eVideoConversion) gHdffSetup.VideoConversion; videoFormat.VideoConversion = (HDFF::eVideoConversion) gHdffSetup.VideoConversion;
mHdffCmdIf->CmdAvSetVideoFormat(0, &videoFormat); mHdffCmdIf->CmdAvSetVideoFormat(0, &videoFormat);
@ -729,10 +730,25 @@ bool cDvbHdFfDeviceProbe::Probe(int Adapter, int Frontend)
0x13C2300A, // Technotrend S2-6400 HDFF production version 0x13C2300A, // Technotrend S2-6400 HDFF production version
0x00000000 0x00000000
}; };
uint32_t SubsystemId = GetSubsystemId(Adapter, Frontend); 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++) { for (uint32_t *sid = SubsystemIds; *sid; sid++) {
if (*sid == SubsystemId) { if (*sid == SubsystemId) {
cString FileName = cString::sprintf("/dev/dvb/adapter%d/osd0", Adapter); FileName = cString::sprintf("/dev/dvb/adapter%d/osd0", Adapter);
int fd = open(FileName, O_RDWR); int fd = open(FileName, O_RDWR);
if (fd != -1) { //TODO treat the second path of the S2-6400 as a budget device if (fd != -1) { //TODO treat the second path of the S2-6400 as a budget device
close(fd); close(fd);

View File

@ -3,7 +3,7 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: hdffcmd.c 1.20 2011/04/24 09:31:59 kls Exp $ * $Id: hdffcmd.c 1.21 2011/08/27 09:34:18 kls Exp $
*/ */
#include "hdffcmd.h" #include "hdffcmd.h"
@ -1089,6 +1089,7 @@ void cHdffCmdIf::CmdHdmiConfigure(const tHdmiConfig * pConfig)
{ {
cmdBuf.SetBits(1, 0); cmdBuf.SetBits(1, 0);
} }
cmdBuf.SetBits(3, (uint32_t) pConfig->VideoModeAdaption);
osd_cmd.cmd_len = CmdSetLength(cmdBuf); osd_cmd.cmd_len = CmdSetLength(cmdBuf);
ioctl(mOsdDev, OSD_RAW_CMD, &osd_cmd); ioctl(mOsdDev, OSD_RAW_CMD, &osd_cmd);
} }

View File

@ -3,7 +3,7 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: hdffmsgdef.h 1.12 2011/04/17 11:20:22 kls Exp $ * $Id: hdffmsgdef.h 1.13 2011/08/27 09:34:43 kls Exp $
*/ */
#ifndef _HDFF_MSGDEF_H_ #ifndef _HDFF_MSGDEF_H_
@ -274,6 +274,14 @@ typedef enum _eHdmiVideoMode
videoModeMaxValue videoModeMaxValue
} eHdmiVideoMode; } eHdmiVideoMode;
typedef enum _eVideoModeAdaption
{
videoModeAdaptOff,
videoModeAdaptFrameRate,
videoModeAdaptOnlyForHd,
videoModeAdaptAlways
} eVideoModeAdaption;
typedef enum _eCecCommand typedef enum _eCecCommand
{ {
cecCommandTvOn, cecCommandTvOn,
@ -287,6 +295,7 @@ typedef struct _tHdmiConfig
bool TransmitAudio; bool TransmitAudio;
bool ForceDviMode; bool ForceDviMode;
bool CecEnabled; bool CecEnabled;
eVideoModeAdaption VideoModeAdaption;
} tHdmiConfig; } tHdmiConfig;
// Remote control definitions // Remote control definitions

View File

@ -7,15 +7,30 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR \n" "Project-Id-Version: VDR \n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2011-05-05 20:34+0200\n" "POT-Creation-Date: 2011-08-21 14:02+0200\n"
"PO-Revision-Date: 2011-04-25 21:44+0200\n" "PO-Revision-Date: 2011-04-25 21:44+0200\n"
"Last-Translator: Christoph Haubrich\n" "Last-Translator: Christoph Haubrich\n"
"Language-Team: <see README>\n" "Language-Team: <see README>\n"
"Language: \n" "Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
msgid "HD Full Featured DVB device"
msgstr "HD Full Featured DVB device"
msgid "Off"
msgstr "aus"
msgid "Frame rate"
msgstr "passende Framerate"
msgid "HD Only"
msgstr "nur bei HD"
msgid "Always"
msgstr "immer"
msgid "Automatic" msgid "Automatic"
msgstr "automatisch" msgstr "automatisch"
@ -40,9 +55,6 @@ msgstr "abgeschaltet"
msgid "Analogue only" msgid "Analogue only"
msgstr "nur Analoge Ausgänge" msgstr "nur Analoge Ausgänge"
msgid "Always"
msgstr "immer"
msgid "HDMI only" msgid "HDMI only"
msgstr "nur HDMI" msgstr "nur HDMI"
@ -55,6 +67,9 @@ msgstr "keins"
msgid "Resolution" msgid "Resolution"
msgstr "Auflösung" msgstr "Auflösung"
msgid "Video Mode Adaption"
msgstr "Auflösungsanpassung"
msgid "TV format" msgid "TV format"
msgstr "TV-Format" msgstr "TV-Format"

View File

@ -0,0 +1,104 @@
# VDR plugin language source file
# Copyright (C) 2011 Andreas Regel
# This file is distributed under the same license as the dvbhddevice package.
# Christoph Haubrich, 2011
#
msgid ""
msgstr ""
"Project-Id-Version: VDR \n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2011-08-21 14:02+0200\n"
"PO-Revision-Date: 2011-04-25 21:44+0200\n"
"Last-Translator: Rolf Ahrenberg\n"
"Language-Team: Finnish <vdr@linuxtv.org>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "HD Full Featured DVB device"
msgstr "DVB-laite HD-ulostulolla"
msgid "Off"
msgstr ""
msgid "Frame rate"
msgstr ""
msgid "HD Only"
msgstr ""
msgid "Always"
msgstr "aina"
msgid "Automatic"
msgstr "automaattinen"
msgid "Letterbox 16/9"
msgstr "letterbox 16:9"
msgid "Letterbox 14/9"
msgstr "letterbox 14:9"
msgid "Pillarbox"
msgstr "pillarbox"
msgid "CentreCutOut"
msgstr "center cut out"
msgid "Always 16/9"
msgstr "aina 16:9"
msgid "Disabled"
msgstr "ei käytössä"
msgid "Analogue only"
msgstr "vain analoginen"
msgid "HDMI only"
msgstr "vain HDMI"
msgid "Follow resolution"
msgstr "resoluution mukaan"
msgid "none"
msgstr "ei"
msgid "Resolution"
msgstr "Kuvaresoluutio"
msgid "Video Mode Adaption"
msgstr ""
msgid "TV format"
msgstr "Näytön kuvasuhde"
msgid "Video Conversion"
msgstr "Näyttömuoto"
msgid "Analogue Video"
msgstr "Analoginen kuvalähtö"
msgid "Audio Delay (ms)"
msgstr "Äänen viive (ms)"
msgid "Audio Downmix"
msgstr "Äänen alasmiksaus"
msgid "OSD Size"
msgstr "Kuvaruutunäytön koko"
msgid "HDMI CEC"
msgstr "Käytä HDMI CEC-toimintoa"
msgid "Remote Control Protocol"
msgstr "Kaukosäätimen protokolla"
msgid "Remote Control Address"
msgstr "Kaukosäätimen osoite"
msgid "High Level OSD"
msgstr "Käytä korkean tason kuvaruutunäyttöä"
msgid "Allow True Color OSD"
msgstr "Salli tosivärit kuvaruutunäytölle"

View File

@ -7,11 +7,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR\n" "Project-Id-Version: VDR\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2011-05-05 20:34+0200\n" "POT-Creation-Date: 2011-08-21 14:02+0200\n"
"PO-Revision-Date: 2011-07-10 00:23+0100\n" "PO-Revision-Date: 2011-07-10 00:23+0100\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: <see README>\n" "Language-Team: <see README>\n"
"Language: \n" "Language: it\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@ -19,6 +19,21 @@ msgstr ""
"X-Poedit-Country: ITALY\n" "X-Poedit-Country: ITALY\n"
"X-Poedit-SourceCharset: utf-8\n" "X-Poedit-SourceCharset: utf-8\n"
msgid "HD Full Featured DVB device"
msgstr ""
msgid "Off"
msgstr ""
msgid "Frame rate"
msgstr ""
msgid "HD Only"
msgstr ""
msgid "Always"
msgstr "Sempre"
msgid "Automatic" msgid "Automatic"
msgstr "Automatica" msgstr "Automatica"
@ -43,9 +58,6 @@ msgstr "Disabilitata"
msgid "Analogue only" msgid "Analogue only"
msgstr "Solo analogica" msgstr "Solo analogica"
msgid "Always"
msgstr "Sempre"
msgid "HDMI only" msgid "HDMI only"
msgstr "Solo HDMI" msgstr "Solo HDMI"
@ -58,6 +70,9 @@ msgstr "nessuna"
msgid "Resolution" msgid "Resolution"
msgstr "Risoluzione" msgstr "Risoluzione"
msgid "Video Mode Adaption"
msgstr ""
msgid "TV format" msgid "TV format"
msgstr "Formato TV" msgstr "Formato TV"
@ -90,4 +105,3 @@ msgstr "OSD alto livello"
msgid "Allow True Color OSD" msgid "Allow True Color OSD"
msgstr "Permetti OSD True Color" msgstr "Permetti OSD True Color"

View File

@ -3,7 +3,7 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: setup.c 1.12 2011/05/15 14:47:45 kls Exp $ * $Id: setup.c 1.13 2011/08/27 09:35:35 kls Exp $
*/ */
#include "setup.h" #include "setup.h"
@ -20,6 +20,7 @@ cHdffSetup gHdffSetup;
cHdffSetup::cHdffSetup(void) cHdffSetup::cHdffSetup(void)
{ {
Resolution = kResolution1080i; Resolution = kResolution1080i;
VideoModeAdaption = HDFF::videoModeAdaptOff;
TvFormat = HDFF::tvFormat16by9; TvFormat = HDFF::tvFormat16by9;
VideoConversion = HDFF::videoConversionPillarbox; VideoConversion = HDFF::videoConversionPillarbox;
AnalogueVideo = HDFF::videoOutCvbsYuv; AnalogueVideo = HDFF::videoOutCvbsYuv;
@ -36,6 +37,7 @@ cHdffSetup::cHdffSetup(void)
bool cHdffSetup::SetupParse(const char *Name, const char *Value) bool cHdffSetup::SetupParse(const char *Name, const char *Value)
{ {
if (strcmp(Name, "Resolution") == 0) Resolution = atoi(Value); if (strcmp(Name, "Resolution") == 0) Resolution = atoi(Value);
else if (strcmp(Name, "VideoModeAdaption") == 0) VideoModeAdaption = atoi(Value);
else if (strcmp(Name, "TvFormat") == 0) TvFormat = atoi(Value); else if (strcmp(Name, "TvFormat") == 0) TvFormat = atoi(Value);
else if (strcmp(Name, "VideoConversion") == 0) VideoConversion = atoi(Value); else if (strcmp(Name, "VideoConversion") == 0) VideoConversion = atoi(Value);
else if (strcmp(Name, "AnalogueVideo") == 0) AnalogueVideo = atoi(Value); else if (strcmp(Name, "AnalogueVideo") == 0) AnalogueVideo = atoi(Value);
@ -113,6 +115,7 @@ HDFF::eHdmiVideoMode cHdffSetup::GetVideoMode(void)
cHdffSetupPage::cHdffSetupPage(HDFF::cHdffCmdIf * pHdffCmdIf) cHdffSetupPage::cHdffSetupPage(HDFF::cHdffCmdIf * pHdffCmdIf)
{ {
const int kResolutions = 4; const int kResolutions = 4;
const int kVideoModeAdaptions = 4;
const int kTvFormats = 2; const int kTvFormats = 2;
const int kVideoConversions = 6; const int kVideoConversions = 6;
const int kAnalogueVideos = 4; const int kAnalogueVideos = 4;
@ -128,6 +131,14 @@ cHdffSetupPage::cHdffSetupPage(HDFF::cHdffCmdIf * pHdffCmdIf)
"576i", "576i",
}; };
static const char * VideoModeAdaptionItems[kVideoModeAdaptions] =
{
tr("Off"),
tr("Frame rate"),
tr("HD Only"),
tr("Always")
};
static const char * TvFormatItems[kTvFormats] = static const char * TvFormatItems[kTvFormats] =
{ {
"4/3", "4/3",
@ -182,6 +193,7 @@ cHdffSetupPage::cHdffSetupPage(HDFF::cHdffCmdIf * pHdffCmdIf)
mNewHdffSetup = gHdffSetup; mNewHdffSetup = gHdffSetup;
Add(new cMenuEditStraItem(tr("Resolution"), &mNewHdffSetup.Resolution, kResolutions, ResolutionItems)); Add(new cMenuEditStraItem(tr("Resolution"), &mNewHdffSetup.Resolution, kResolutions, ResolutionItems));
Add(new cMenuEditStraItem(tr("Video Mode Adaption"), &mNewHdffSetup.VideoModeAdaption, kVideoModeAdaptions, VideoModeAdaptionItems));
Add(new cMenuEditStraItem(tr("TV format"), &mNewHdffSetup.TvFormat, kTvFormats, TvFormatItems)); Add(new cMenuEditStraItem(tr("TV format"), &mNewHdffSetup.TvFormat, kTvFormats, TvFormatItems));
Add(new cMenuEditStraItem(tr("Video Conversion"), &mNewHdffSetup.VideoConversion, kVideoConversions, VideoConversionItems)); Add(new cMenuEditStraItem(tr("Video Conversion"), &mNewHdffSetup.VideoConversion, kVideoConversions, VideoConversionItems));
Add(new cMenuEditStraItem(tr("Analogue Video"), &mNewHdffSetup.AnalogueVideo, kAnalogueVideos, AnalogueVideoItems)); Add(new cMenuEditStraItem(tr("Analogue Video"), &mNewHdffSetup.AnalogueVideo, kAnalogueVideos, AnalogueVideoItems));
@ -202,6 +214,7 @@ cHdffSetupPage::~cHdffSetupPage(void)
void cHdffSetupPage::Store(void) void cHdffSetupPage::Store(void)
{ {
SetupStore("Resolution", mNewHdffSetup.Resolution); SetupStore("Resolution", mNewHdffSetup.Resolution);
SetupStore("VideoModeAdaption", mNewHdffSetup.VideoModeAdaption);
SetupStore("TvFormat", mNewHdffSetup.TvFormat); SetupStore("TvFormat", mNewHdffSetup.TvFormat);
SetupStore("VideoConversion", mNewHdffSetup.VideoConversion); SetupStore("VideoConversion", mNewHdffSetup.VideoConversion);
SetupStore("AnalogueVideo", mNewHdffSetup.AnalogueVideo); SetupStore("AnalogueVideo", mNewHdffSetup.AnalogueVideo);
@ -237,6 +250,7 @@ void cHdffSetupPage::Store(void)
hdmiConfig.TransmitAudio = true; hdmiConfig.TransmitAudio = true;
hdmiConfig.ForceDviMode = false; hdmiConfig.ForceDviMode = false;
hdmiConfig.CecEnabled = mNewHdffSetup.CecEnabled; hdmiConfig.CecEnabled = mNewHdffSetup.CecEnabled;
hdmiConfig.VideoModeAdaption = (HDFF::eVideoModeAdaption) mNewHdffSetup.VideoModeAdaption;
mHdffCmdIf->CmdHdmiConfigure(&hdmiConfig); mHdffCmdIf->CmdHdmiConfigure(&hdmiConfig);
mHdffCmdIf->CmdRemoteSetProtocol((HDFF::eRemoteProtocol) mNewHdffSetup.RemoteProtocol); mHdffCmdIf->CmdRemoteSetProtocol((HDFF::eRemoteProtocol) mNewHdffSetup.RemoteProtocol);

View File

@ -3,7 +3,7 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: setup.h 1.8 2011/04/17 11:20:22 kls Exp $ * $Id: setup.h 1.9 2011/08/27 09:36:02 kls Exp $
*/ */
#ifndef _HDFF_SETUP_H_ #ifndef _HDFF_SETUP_H_
@ -20,6 +20,7 @@ struct cHdffSetup
HDFF::eHdmiVideoMode GetVideoMode(void); HDFF::eHdmiVideoMode GetVideoMode(void);
int Resolution; int Resolution;
int VideoModeAdaption;
int TvFormat; int TvFormat;
int VideoConversion; int VideoConversion;
int AnalogueVideo; int AnalogueVideo;

View File

@ -19,3 +19,7 @@ VDR Plugin 'dvbsddevice' Revision History
2011-04-17: Version 0.0.4 2011-04-17: Version 0.0.4
- Removed an obsolete local variable in dvbsdffosd.c (thanks to Paul Menzel). - Removed an obsolete local variable in dvbsdffosd.c (thanks to Paul Menzel).
2011-08-27: Version 0.0.5
- Added option --outputonly to use the device only for output (thanks to Udo Richter).

View File

@ -3,13 +3,14 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: dvbsddevice.c 1.4 2011/04/17 12:55:43 kls Exp $ * $Id: dvbsddevice.c 1.5 2011/08/27 11:34:58 kls Exp $
*/ */
#include <getopt.h>
#include <vdr/plugin.h> #include <vdr/plugin.h>
#include "dvbsdffdevice.h" #include "dvbsdffdevice.h"
static const char *VERSION = "0.0.4"; static const char *VERSION = "0.0.5";
static const char *DESCRIPTION = "SD Full Featured DVB device"; static const char *DESCRIPTION = "SD Full Featured DVB device";
class cPluginDvbsddevice : public cPlugin { class cPluginDvbsddevice : public cPlugin {
@ -20,6 +21,8 @@ public:
virtual ~cPluginDvbsddevice(); virtual ~cPluginDvbsddevice();
virtual const char *Version(void) { return VERSION; } virtual const char *Version(void) { return VERSION; }
virtual const char *Description(void) { return DESCRIPTION; } virtual const char *Description(void) { return DESCRIPTION; }
virtual const char *CommandLineHelp(void);
virtual bool ProcessArgs(int argc, char *argv[]);
}; };
cPluginDvbsddevice::cPluginDvbsddevice(void) cPluginDvbsddevice::cPluginDvbsddevice(void)
@ -32,4 +35,27 @@ cPluginDvbsddevice::~cPluginDvbsddevice()
delete probe; delete probe;
} }
const char *cPluginDvbsddevice::CommandLineHelp(void)
{
return " -o --outputonly do not receive, just use as output device\n";
}
bool cPluginDvbsddevice::ProcessArgs(int argc, char *argv[])
{
static struct option long_options[] = {
{ "outputonly", no_argument, NULL, 'o' },
{ NULL, no_argument, NULL, 0 }
};
int c;
while ((c = getopt_long(argc, argv, "", long_options, NULL)) != -1) {
switch (c) {
case 'o': probe->SetOutputOnly(true);
break;
default: return false;
}
}
return true;
}
VDRPLUGINCREATOR(cPluginDvbsddevice); // Don't touch this! VDRPLUGINCREATOR(cPluginDvbsddevice); // Don't touch this!

View File

@ -3,7 +3,7 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: dvbsdffdevice.c 2.29 2011/05/22 15:22:14 kls Exp $ * $Id: dvbsdffdevice.c 2.30 2011/08/27 11:33:57 kls Exp $
*/ */
#include "dvbsdffdevice.h" #include "dvbsdffdevice.h"
@ -23,12 +23,13 @@
int cDvbSdFfDevice::devVideoOffset = -1; int cDvbSdFfDevice::devVideoOffset = -1;
cDvbSdFfDevice::cDvbSdFfDevice(int Adapter, int Frontend) cDvbSdFfDevice::cDvbSdFfDevice(int Adapter, int Frontend, bool OutputOnly)
:cDvbDevice(Adapter, Frontend) :cDvbDevice(Adapter, Frontend)
{ {
spuDecoder = NULL; spuDecoder = NULL;
digitalAudio = false; digitalAudio = false;
playMode = pmNone; playMode = pmNone;
outputOnly = OutputOnly;
// Devices that are only present on cards with decoders: // Devices that are only present on cards with decoders:
@ -357,6 +358,14 @@ bool cDvbSdFfDevice::SetPid(cPidHandle *Handle, int Type, bool On)
return true; return true;
} }
bool cDvbSdFfDevice::ProvidesSource(int Source) const
{
if (outputOnly)
return false;
else
return cDvbDevice::ProvidesSource(Source);
}
void cDvbSdFfDevice::TurnOffLiveMode(bool LiveView) void cDvbSdFfDevice::TurnOffLiveMode(bool LiveView)
{ {
if (LiveView) { if (LiveView) {
@ -761,6 +770,11 @@ int cDvbSdFfDevice::PlayTsAudio(const uchar *Data, int Length)
// --- cDvbSdFfDeviceProbe --------------------------------------------------- // --- cDvbSdFfDeviceProbe ---------------------------------------------------
cDvbSdFfDeviceProbe::cDvbSdFfDeviceProbe(void)
{
outputOnly = false;
}
bool cDvbSdFfDeviceProbe::Probe(int Adapter, int Frontend) bool cDvbSdFfDeviceProbe::Probe(int Adapter, int Frontend)
{ {
static uint32_t SubsystemIds[] = { static uint32_t SubsystemIds[] = {
@ -781,7 +795,7 @@ bool cDvbSdFfDeviceProbe::Probe(int Adapter, int Frontend)
for (uint32_t *sid = SubsystemIds; *sid; sid++) { for (uint32_t *sid = SubsystemIds; *sid; sid++) {
if (*sid == SubsystemId) { if (*sid == SubsystemId) {
dsyslog("creating cDvbSdFfDevice"); dsyslog("creating cDvbSdFfDevice");
new cDvbSdFfDevice(Adapter, Frontend); new cDvbSdFfDevice(Adapter, Frontend, outputOnly);
return true; return true;
} }
} }

View File

@ -3,7 +3,7 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: dvbsdffdevice.h 2.12 2011/05/21 12:56:49 kls Exp $ * $Id: dvbsdffdevice.h 2.13 2011/08/27 11:32:42 kls Exp $
*/ */
#ifndef __DVBSDFFDEVICE_H #ifndef __DVBSDFFDEVICE_H
@ -17,10 +17,11 @@
class cDvbSdFfDevice : public cDvbDevice { class cDvbSdFfDevice : public cDvbDevice {
private: private:
int fd_osd, fd_audio, fd_video, fd_stc; int fd_osd, fd_audio, fd_video, fd_stc;
bool outputOnly;
protected: protected:
virtual void MakePrimaryDevice(bool On); virtual void MakePrimaryDevice(bool On);
public: public:
cDvbSdFfDevice(int Adapter, int Frontend); cDvbSdFfDevice(int Adapter, int Frontend, bool OutputOnly);
virtual ~cDvbSdFfDevice(); virtual ~cDvbSdFfDevice();
virtual bool HasDecoder(void) const; virtual bool HasDecoder(void) const;
virtual bool AvoidRecording(void) const; virtual bool AvoidRecording(void) const;
@ -34,6 +35,8 @@ public:
// Channel facilities // Channel facilities
public:
virtual bool ProvidesSource(int Source) const;
private: private:
void TurnOffLiveMode(bool LiveView); void TurnOffLiveMode(bool LiveView);
protected: protected:
@ -101,7 +104,11 @@ public:
}; };
class cDvbSdFfDeviceProbe : public cDvbDeviceProbe { class cDvbSdFfDeviceProbe : public cDvbDeviceProbe {
private:
bool outputOnly;
public: public:
cDvbSdFfDeviceProbe(void);
void SetOutputOnly(bool On) { outputOnly = On; }
virtual bool Probe(int Adapter, int Frontend); virtual bool Probe(int Adapter, int Frontend);
}; };

View File

@ -3,7 +3,7 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: skincurses.c 2.6 2011/05/15 21:41:47 kls Exp $ * $Id: skincurses.c 2.7 2011/08/21 11:04:38 kls Exp $
*/ */
#include <ncurses.h> #include <ncurses.h>
@ -436,7 +436,7 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
int y = 2; int y = 2;
cTextScroller ts; cTextScroller ts;
char t[32]; char t[32];
snprintf(t, sizeof(t), "%s %s", *DateString(Recording->start), *TimeString(Recording->start)); 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); ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
y += ts.Height(); y += ts.Height();
if (Info->GetEvent()->ParentalRating()) { if (Info->GetEvent()->ParentalRating()) {

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: channels.c 2.17 2010/11/07 12:24:59 kls Exp $ * $Id: channels.c 2.19 2011/08/26 12:44:21 kls Exp $
*/ */
#include "channels.h" #include "channels.h"
@ -497,8 +497,8 @@ cString cChannel::ToText(const cChannel *Channel)
if (Channel->vpid && Channel->vtype) if (Channel->vpid && Channel->vtype)
q += snprintf(q, sizeof(vpidbuf) - (q - vpidbuf), "=%d", Channel->vtype); q += snprintf(q, sizeof(vpidbuf) - (q - vpidbuf), "=%d", Channel->vtype);
*q = 0; *q = 0;
const int BufferSize = (MAXAPIDS + MAXDPIDS) * (5 + 1 + MAXLANGCODE2 + 5) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod+cod@type', +10: paranoia const int ABufferSize = (MAXAPIDS + MAXDPIDS) * (5 + 1 + MAXLANGCODE2 + 5) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod+cod@type', +10: paranoia
char apidbuf[BufferSize]; char apidbuf[ABufferSize];
q = apidbuf; q = apidbuf;
q += IntArrayToString(q, Channel->apids, 10, Channel->alangs, Channel->atypes); q += IntArrayToString(q, Channel->apids, 10, Channel->alangs, Channel->atypes);
if (Channel->dpids[0]) { if (Channel->dpids[0]) {
@ -506,11 +506,19 @@ cString cChannel::ToText(const cChannel *Channel)
q += IntArrayToString(q, Channel->dpids, 10, Channel->dlangs, Channel->dtypes); q += IntArrayToString(q, Channel->dpids, 10, Channel->dlangs, Channel->dtypes);
} }
*q = 0; *q = 0;
const int TBufferSize = MAXSPIDS * (5 + 1 + MAXLANGCODE2) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod+cod', +10: paranoia and tpid
char tpidbuf[TBufferSize];
q = tpidbuf;
q += snprintf(q, sizeof(tpidbuf), "%d", Channel->tpid);
if (Channel->spids[0]) {
*q++ = ';';
q += IntArrayToString(q, Channel->spids, 10, Channel->slangs);
}
char caidbuf[MAXCAIDS * 5 + 10]; // 5: 4 digits plus delimiting ',', 10: paranoia char caidbuf[MAXCAIDS * 5 + 10]; // 5: 4 digits plus delimiting ',', 10: paranoia
q = caidbuf; q = caidbuf;
q += IntArrayToString(q, Channel->caids, 16); q += IntArrayToString(q, Channel->caids, 16);
*q = 0; *q = 0;
buffer = cString::sprintf("%s:%d:%s:%s:%d:%s:%s:%d:%s:%d:%d:%d:%d\n", FullName, Channel->frequency, *Channel->parameters, *cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, Channel->tpid, caidbuf, Channel->sid, Channel->nid, Channel->tid, Channel->rid); buffer = cString::sprintf("%s:%d:%s:%s:%d:%s:%s:%s:%s:%d:%d:%d:%d\n", FullName, Channel->frequency, *Channel->parameters, *cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, tpidbuf, caidbuf, Channel->sid, Channel->nid, Channel->tid, Channel->rid);
} }
return buffer; return buffer;
} }
@ -544,14 +552,17 @@ bool cChannel::Parse(const char *s)
char *parambuf = NULL; char *parambuf = NULL;
char *vpidbuf = NULL; char *vpidbuf = NULL;
char *apidbuf = NULL; char *apidbuf = NULL;
char *tpidbuf = NULL;
char *caidbuf = NULL; char *caidbuf = NULL;
int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%d :%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, &parambuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpid, &caidbuf, &sid, &nid, &tid, &rid); int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%a[^:]:%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, &parambuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpidbuf, &caidbuf, &sid, &nid, &tid, &rid);
if (fields >= 9) { if (fields >= 9) {
if (fields == 9) { if (fields == 9) {
// allow reading of old format // allow reading of old format
sid = atoi(caidbuf); sid = atoi(caidbuf);
delete caidbuf; delete caidbuf;
caidbuf = NULL; caidbuf = NULL;
if (sscanf(tpidbuf, "%d", &tpid) != 1)
return false;
caids[0] = tpid; caids[0] = tpid;
caids[1] = 0; caids[1] = 0;
tpid = 0; tpid = 0;
@ -562,6 +573,7 @@ bool cChannel::Parse(const char *s)
atypes[0] = 0; atypes[0] = 0;
dpids[0] = 0; dpids[0] = 0;
dtypes[0] = 0; dtypes[0] = 0;
spids[0] = 0;
ok = false; ok = false;
if (parambuf && sourcebuf && vpidbuf && apidbuf) { if (parambuf && sourcebuf && vpidbuf && apidbuf) {
parameters = parambuf; parameters = parambuf;
@ -644,7 +656,30 @@ bool cChannel::Parse(const char *s)
dpids[NumDpids] = 0; dpids[NumDpids] = 0;
dtypes[NumDpids] = 0; dtypes[NumDpids] = 0;
} }
int NumSpids = 0;
if ((p = strchr(tpidbuf, ';')) != NULL) {
*p++ = 0;
char *q;
char *strtok_next;
while ((q = strtok_r(p, ",", &strtok_next)) != NULL) {
if (NumSpids < MAXSPIDS) {
char *l = strchr(q, '=');
if (l) {
*l++ = 0;
strn0cpy(slangs[NumSpids], l, MAXLANGCODE2);
}
else
*slangs[NumSpids] = 0;
spids[NumSpids++] = strtol(q, NULL, 10);
}
else
esyslog("ERROR: too many SPIDs!"); // no need to set ok to 'false'
p = NULL;
}
spids[NumSpids] = 0;
}
if (sscanf(tpidbuf, "%d", &tpid) != 1)
return false;
if (caidbuf) { if (caidbuf) {
char *p = caidbuf; char *p = caidbuf;
char *q; char *q;
@ -681,6 +716,7 @@ bool cChannel::Parse(const char *s)
free(sourcebuf); free(sourcebuf);
free(vpidbuf); free(vpidbuf);
free(apidbuf); free(apidbuf);
free(tpidbuf);
free(caidbuf); free(caidbuf);
free(namebuf); free(namebuf);
if (!GetChannelID().Valid()) { if (!GetChannelID().Valid()) {

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: config.c 2.14 2011/06/13 14:41:01 kls Exp $ * $Id: config.c 2.15 2011/08/20 09:12:05 kls Exp $
*/ */
#include "config.h" #include "config.h"
@ -395,7 +395,7 @@ cSetup::cSetup(void)
CurrentChannel = -1; CurrentChannel = -1;
CurrentVolume = MAXVOLUME; CurrentVolume = MAXVOLUME;
CurrentDolby = 0; CurrentDolby = 0;
// InitialChannel is initialized by constructor InitialChannel = "";
InitialVolume = -1; InitialVolume = -1;
ChannelsWrap = 0; ChannelsWrap = 0;
EmergencyExit = 1; EmergencyExit = 1;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: config.h 2.33 2011/06/21 21:43:01 kls Exp $ * $Id: config.h 2.34 2011/08/20 08:51:47 kls Exp $
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H
@ -22,13 +22,13 @@
// VDR's own version number: // VDR's own version number:
#define VDRVERSION "1.7.20" #define VDRVERSION "1.7.21"
#define VDRVERSNUM 10720 // Version * 10000 + Major * 100 + Minor #define VDRVERSNUM 10721 // Version * 10000 + Major * 100 + Minor
// The plugin API's version number: // The plugin API's version number:
#define APIVERSION "1.7.20" #define APIVERSION "1.7.21"
#define APIVERSNUM 10720 // Version * 10000 + Major * 100 + Minor #define APIVERSNUM 10721 // Version * 10000 + Major * 100 + Minor
// When loading plugins, VDR searches them by their APIVERSION, which // When loading plugins, VDR searches them by their APIVERSION, which
// may be smaller than VDRVERSION in case there have been no changes to // 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 * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: cutter.c 2.6 2011/03/06 14:54:33 kls Exp $ * $Id: cutter.c 2.8 2011/08/21 11:08:08 kls Exp $
*/ */
#include "cutter.h" #include "cutter.h"
@ -75,7 +75,7 @@ void cCuttingThread::Action(void)
if (!fromFile || !toFile) if (!fromFile || !toFile)
return; return;
fromFile->SetReadAhead(MEGABYTE(20)); fromFile->SetReadAhead(MEGABYTE(20));
int Index = Mark->position; int Index = Mark->Position();
Mark = fromMarks.Next(Mark); Mark = fromMarks.Next(Mark);
off_t FileSize = 0; off_t FileSize = 0;
int CurrentFileNumber = 0; int CurrentFileNumber = 0;
@ -163,14 +163,14 @@ void cCuttingThread::Action(void)
// Check editing marks: // Check editing marks:
if (Mark && Index >= Mark->position) { if (Mark && Index >= Mark->Position()) {
Mark = fromMarks.Next(Mark); Mark = fromMarks.Next(Mark);
toMarks.Add(LastIFrame); toMarks.Add(LastIFrame);
if (Mark) if (Mark)
toMarks.Add(toIndex->Last() + 1); toMarks.Add(toIndex->Last() + 1);
toMarks.Save(); toMarks.Save();
if (Mark) { if (Mark) {
Index = Mark->position; Index = Mark->Position();
Mark = fromMarks.Next(Mark); Mark = fromMarks.Next(Mark);
CurrentFileNumber = 0; // triggers SetOffset before reading next frame CurrentFileNumber = 0; // triggers SetOffset before reading next frame
cutIn = true; cutIn = true;
@ -208,6 +208,12 @@ bool cCutter::Start(const char *FileName)
error = false; error = false;
ended = false; ended = false;
cRecording Recording(FileName); cRecording Recording(FileName);
cMarks FromMarks;
FromMarks.Load(FileName);
if (cMark *First = FromMarks.First())
Recording.SetStartTime(Recording.Start() + (int(First->Position() / Recording.FramesPerSecond() + 30) / 60) * 60);
const char *evn = Recording.PrefixFileName('%'); const char *evn = Recording.PrefixFileName('%');
if (evn && RemoveVideoFile(evn) && MakeDirs(evn, true)) { if (evn && RemoveVideoFile(evn) && MakeDirs(evn, true)) {
// XXX this can be removed once RenameVideoFile() follows symlinks (see videodir.c) // XXX this can be removed once RenameVideoFile() follows symlinks (see videodir.c)

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.c 2.41 2011/06/02 13:14:16 kls Exp $ * $Id: device.c 2.42 2011/08/26 12:56:00 kls Exp $
*/ */
#include "device.h" #include "device.h"
@ -613,6 +613,11 @@ bool cDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Needs
return false; return false;
} }
bool cDevice::ProvidesEIT(void) const
{
return false;
}
int cDevice::NumProvidedSystems(void) const int cDevice::NumProvidedSystems(void) const
{ {
return 0; return 0;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.h 2.26 2011/06/02 13:15:31 kls Exp $ * $Id: device.h 2.27 2011/08/26 12:52:29 kls Exp $
*/ */
#ifndef __DEVICE_H #ifndef __DEVICE_H
@ -247,6 +247,10 @@ public:
///< function itself actually returns true. ///< function itself actually returns true.
///< The default implementation always returns false, so a derived cDevice ///< The default implementation always returns false, so a derived cDevice
///< class that can provide channels must implement this function. ///< class that can provide channels must implement this function.
virtual bool ProvidesEIT(void) const;
///< Returns true if this device provides EIT data and thus wants to be tuned
///< to the channels it can receive regularly to update the data.
///< The default implementation returns false.
virtual int NumProvidedSystems(void) const; virtual int NumProvidedSystems(void) const;
///< Returns the number of individual "delivery systems" this device provides. ///< Returns the number of individual "delivery systems" this device provides.
///< The default implementation returns 0, so any derived class that can ///< The default implementation returns 0, so any derived class that can

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbdevice.c 2.42 2011/06/11 14:34:24 kls Exp $ * $Id: dvbdevice.c 2.43 2011/08/26 12:57:34 kls Exp $
*/ */
#include "dvbdevice.h" #include "dvbdevice.h"
@ -1081,6 +1081,11 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
return result; return result;
} }
bool cDvbDevice::ProvidesEIT(void) const
{
return dvbTuner != NULL;
}
int cDvbDevice::NumProvidedSystems(void) const int cDvbDevice::NumProvidedSystems(void) const
{ {
return numProvidedSystems; return numProvidedSystems;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbdevice.h 2.15 2011/06/02 13:20:05 kls Exp $ * $Id: dvbdevice.h 2.16 2011/08/26 12:55:45 kls Exp $
*/ */
#ifndef __DVBDEVICE_H #ifndef __DVBDEVICE_H
@ -140,6 +140,7 @@ public:
virtual bool ProvidesSource(int Source) const; virtual bool ProvidesSource(int Source) const;
virtual bool ProvidesTransponder(const cChannel *Channel) const; virtual bool ProvidesTransponder(const cChannel *Channel) const;
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const; virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const;
virtual bool ProvidesEIT(void) const;
virtual int NumProvidedSystems(void) const; virtual int NumProvidedSystems(void) const;
virtual int SignalStrength(void) const; virtual int SignalStrength(void) const;
virtual int SignalQuality(void) const; virtual int SignalQuality(void) const;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: eitscan.c 2.2 2011/08/12 14:18:04 kls Exp $ * $Id: eitscan.c 2.4 2011/08/26 16:16:46 kls Exp $
*/ */
#include "eitscan.h" #include "eitscan.h"
@ -143,7 +143,7 @@ void cEITScanner::Process(void)
bool AnyDeviceSwitched = false; bool AnyDeviceSwitched = false;
for (int i = 0; i < cDevice::NumDevices(); i++) { for (int i = 0; i < cDevice::NumDevices(); i++) {
cDevice *Device = cDevice::GetDevice(i); cDevice *Device = cDevice::GetDevice(i);
if (Device) { if (Device && Device->ProvidesEIT()) {
for (cScanData *ScanData = scanList->First(); ScanData; ScanData = scanList->Next(ScanData)) { for (cScanData *ScanData = scanList->First(); ScanData; ScanData = scanList->Next(ScanData)) {
const cChannel *Channel = ScanData->GetChannel(); const cChannel *Channel = ScanData->GetChannel();
if (Channel) { if (Channel) {

View File

28
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: menu.c 2.29 2011/08/06 13:13:34 kls Exp $ * $Id: menu.c 2.32 2011/08/27 11:05:33 kls Exp $
*/ */
#include "menu.h" #include "menu.h"
@ -2193,13 +2193,13 @@ void cMenuRecordingItem::IncrementCounter(bool New)
totalEntries++; totalEntries++;
if (New) if (New)
newEntries++; newEntries++;
SetText(cString::sprintf("%d\t%d\t%s", totalEntries, newEntries, name)); SetText(cString::sprintf("%d\t\t%d\t%s", totalEntries, newEntries, name));
} }
// --- cMenuRecordings ------------------------------------------------------- // --- cMenuRecordings -------------------------------------------------------
cMenuRecordings::cMenuRecordings(const char *Base, int Level, bool OpenSubMenus) cMenuRecordings::cMenuRecordings(const char *Base, int Level, bool OpenSubMenus)
:cOsdMenu(Base ? Base : tr("Recordings"), 9, 7) :cOsdMenu(Base ? Base : tr("Recordings"), 9, 6, 6)
{ {
base = Base ? strdup(Base) : NULL; base = Base ? strdup(Base) : NULL;
level = Setup.RecordingDirs ? Level : -1; level = Setup.RecordingDirs ? Level : -1;
@ -2770,6 +2770,7 @@ cMenuSetupDVB::cMenuSetupDVB(void)
updateChannelsTexts[5] = tr("add new transponders"); updateChannelsTexts[5] = tr("add new transponders");
SetSection(tr("DVB")); SetSection(tr("DVB"));
SetHelp(NULL, tr("Button$Audio"), tr("Button$Subtitles"), NULL);
Setup(); Setup();
} }
@ -2815,6 +2816,14 @@ eOSState cMenuSetupDVB::ProcessKey(eKeys Key)
eOSState state = cMenuSetupBase::ProcessKey(Key); eOSState state = cMenuSetupBase::ProcessKey(Key);
if (Key != kNone) { if (Key != kNone) {
switch (Key) {
case kGreen: cRemote::Put(kAudio, true);
state = osEnd;
break;
case kYellow: cRemote::Put(kSubtitles, true);
state = osEnd;
break;
default: {
bool DoSetup = data.VideoFormat != newVideoFormat; bool DoSetup = data.VideoFormat != newVideoFormat;
DoSetup |= data.DisplaySubtitles != newDisplaySubtitles; DoSetup |= data.DisplaySubtitles != newDisplaySubtitles;
if (numAudioLanguages != oldnumAudioLanguages) { if (numAudioLanguages != oldnumAudioLanguages) {
@ -2856,6 +2865,8 @@ eOSState cMenuSetupDVB::ProcessKey(eKeys Key)
if (DoSetup) if (DoSetup)
Setup(); Setup();
} }
}
}
if (state == osBack && Key == kOk) { if (state == osBack && Key == kOk) {
if (::Setup.PrimaryDVB != oldPrimaryDVB) if (::Setup.PrimaryDVB != oldPrimaryDVB)
state = osSwitchDvb; state = osSwitchDvb;
@ -4667,7 +4678,7 @@ void cReplayControl::MarkJump(bool Forward)
if (GetIndex(Current, Total)) { if (GetIndex(Current, Total)) {
cMark *m = Forward ? marks.GetNext(Current) : marks.GetPrev(Current); cMark *m = Forward ? marks.GetNext(Current) : marks.GetPrev(Current);
if (m) { if (m) {
Goto(m->position, true); Goto(m->Position(), true);
displayFrames = true; displayFrames = true;
} }
} }
@ -4684,14 +4695,15 @@ void cReplayControl::MarkMove(bool Forward)
int p = SkipFrames(Forward ? 1 : -1); int p = SkipFrames(Forward ? 1 : -1);
cMark *m2; cMark *m2;
if (Forward) { if (Forward) {
if ((m2 = marks.Next(m)) != NULL && m2->position <= p) if ((m2 = marks.Next(m)) != NULL && m2->Position() <= p)
return; return;
} }
else { else {
if ((m2 = marks.Prev(m)) != NULL && m2->position >= p) if ((m2 = marks.Prev(m)) != NULL && m2->Position() >= p)
return; return;
} }
Goto(m->position = p, true); m->SetPosition(p);
Goto(m->Position(), true);
marks.Save(); marks.Save();
} }
} }
@ -4726,7 +4738,7 @@ void cReplayControl::EditTest(void)
if ((m->Index() & 0x01) != 0) if ((m->Index() & 0x01) != 0)
m = marks.Next(m); m = marks.Next(m);
if (m) { if (m) {
Goto(m->position - SecondsToFrames(3, FramesPerSecond())); Goto(m->Position() - SecondsToFrames(3, FramesPerSecond()));
Play(); Play();
} }
} }

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.0\n" "Project-Id-Version: VDR 1.7.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2008-10-16 11:16-0400\n" "PO-Revision-Date: 2008-10-16 11:16-0400\n"
"Last-Translator: Osama Alrawab <alrawab@hotmail.com>\n" "Last-Translator: Osama Alrawab <alrawab@hotmail.com>\n"
"Language-Team: Arabic <ar@li.org>\n" "Language-Team: Arabic <ar@li.org>\n"
@ -923,6 +923,12 @@ msgstr "اضافة مصدر قنوات جديد"
msgid "DVB" msgid "DVB"
msgstr "الدى فى بى" msgstr "الدى فى بى"
msgid "Button$Audio"
msgstr "الصوت"
msgid "Button$Subtitles"
msgstr "الترجمة"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "كرت الستالايت الاولى" msgstr "كرت الستالايت الاولى"
@ -1156,9 +1162,6 @@ msgstr ""
msgid " Stop replaying" msgid " Stop replaying"
msgstr " ايقاف الاعادة" msgstr " ايقاف الاعادة"
msgid "Button$Audio"
msgstr "الصوت"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "طمس" msgstr "طمس"
@ -1184,9 +1187,6 @@ msgstr "لا يوجد صوت متاح"
msgid "No subtitles" msgid "No subtitles"
msgstr "لا توجد ترجمة متاحة" msgstr "لا توجد ترجمة متاحة"
msgid "Button$Subtitles"
msgstr "الترجمة"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "لا ترجمة متاحة" msgstr "لا ترجمة متاحة"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2008-03-02 19:02+0100\n" "PO-Revision-Date: 2008-03-02 19:02+0100\n"
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n" "Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
"Language-Team: Catalan <vdr@linuxtv.org>\n" "Language-Team: Catalan <vdr@linuxtv.org>\n"
@ -905,6 +905,12 @@ msgstr "afegir nous transponders"
msgid "DVB" msgid "DVB"
msgstr "Tarja DVB" msgstr "Tarja DVB"
msgid "Button$Audio"
msgstr "Àudio"
msgid "Button$Subtitles"
msgstr "Subtítols"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Tarja DVB primària" msgstr "Tarja DVB primària"
@ -1132,9 +1138,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Aturar la reproducció" msgstr " Aturar la reproducció"
msgid "Button$Audio"
msgstr "Àudio"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pausa" msgstr "Pausa"
@ -1160,9 +1163,6 @@ msgstr "No hi ha
msgid "No subtitles" msgid "No subtitles"
msgstr "Sense subtítols" msgstr "Sense subtítols"
msgid "Button$Subtitles"
msgstr "Subtítols"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "No hi ha subtítols disponibles!" msgstr "No hi ha subtítols disponibles!"

View File

@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.14\n" "Project-Id-Version: VDR 1.7.14\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2010-05-06 11:00+0200\n" "PO-Revision-Date: 2010-05-06 11:00+0200\n"
"Last-Translator: Radek Šťastný <dedkus@gmail.com>\n" "Last-Translator: Radek Šťastný <dedkus@gmail.com>\n"
"Language-Team: Czech <vdr@linuxtv.org>\n" "Language-Team: Czech <vdr@linuxtv.org>\n"
@ -904,6 +904,12 @@ msgstr "přidat nové transpondéry"
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Zvuk"
msgid "Button$Subtitles"
msgstr "Titulky"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Primární DVB zařízení" msgstr "Primární DVB zařízení"
@ -1131,9 +1137,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Zastavit přehrávání" msgstr " Zastavit přehrávání"
msgid "Button$Audio"
msgstr "Zvuk"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Přerušit" msgstr "Přerušit"
@ -1159,9 +1162,6 @@ msgstr "Zvuk není dostupný!"
msgid "No subtitles" msgid "No subtitles"
msgstr "Bez titulků" msgstr "Bez titulků"
msgid "Button$Subtitles"
msgstr "Titulky"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Žádné dostupné titulky!" msgstr "Žádné dostupné titulky!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n" "PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n" "Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
"Language-Team: Danish <vdr@linuxtv.org>\n" "Language-Team: Danish <vdr@linuxtv.org>\n"
@ -902,6 +902,12 @@ msgstr "tilf. ny transp."
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Subtitles"
msgstr "Undertekster"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Primær DVB enhed" msgstr "Primær DVB enhed"
@ -1129,9 +1135,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Stop afspilning" msgstr " Stop afspilning"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pause" msgstr "Pause"
@ -1157,9 +1160,6 @@ msgstr "Ingen lyd tilg
msgid "No subtitles" msgid "No subtitles"
msgstr "Ingen undertekster" msgstr "Ingen undertekster"
msgid "Button$Subtitles"
msgstr "Undertekster"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Ingen undertekster tilgængelig!" msgstr "Ingen undertekster tilgængelig!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2010-01-16 16:46+0100\n" "PO-Revision-Date: 2010-01-16 16:46+0100\n"
"Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n" "Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n"
"Language-Team: German <vdr@linuxtv.org>\n" "Language-Team: German <vdr@linuxtv.org>\n"
@ -902,6 +902,12 @@ msgstr "neue Transponder hinzuf
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Subtitles"
msgstr "Untertitel"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Primäres DVB-Interface" msgstr "Primäres DVB-Interface"
@ -1129,9 +1135,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Wiedergabe beenden" msgstr " Wiedergabe beenden"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pause" msgstr "Pause"
@ -1157,9 +1160,6 @@ msgstr "Kein Audio verf
msgid "No subtitles" msgid "No subtitles"
msgstr "Keine Untertitel" msgstr "Keine Untertitel"
msgid "Button$Subtitles"
msgstr "Untertitel"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Keine Untertitel verfügbar!" msgstr "Keine Untertitel verfügbar!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n" "PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n" "Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
"Language-Team: Greek <vdr@linuxtv.org>\n" "Language-Team: Greek <vdr@linuxtv.org>\n"
@ -902,6 +902,12 @@ msgstr "
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "¹÷ïò"
msgid "Button$Subtitles"
msgstr ""
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Êýñéá DVB êÜñôá" msgstr "Êýñéá DVB êÜñôá"
@ -1129,9 +1135,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " ÔÝëïò áíáðáñáãùãÞò" msgstr " ÔÝëïò áíáðáñáãùãÞò"
msgid "Button$Audio"
msgstr "¹÷ïò"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Ðáýóç" msgstr "Ðáýóç"
@ -1157,9 +1160,6 @@ msgstr "
msgid "No subtitles" msgid "No subtitles"
msgstr "" msgstr ""
msgid "Button$Subtitles"
msgstr ""
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "" msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2008-03-02 19:02+0100\n" "PO-Revision-Date: 2008-03-02 19:02+0100\n"
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n" "Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
"Language-Team: Spanish <vdr@linuxtv.org>\n" "Language-Team: Spanish <vdr@linuxtv.org>\n"
@ -903,6 +903,12 @@ msgstr "a
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Subtitles"
msgstr "Subtítulos"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Interfaz DVB primario" msgstr "Interfaz DVB primario"
@ -1130,9 +1136,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Parar reprodución" msgstr " Parar reprodución"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pausa" msgstr "Pausa"
@ -1158,9 +1161,6 @@ msgstr "
msgid "No subtitles" msgid "No subtitles"
msgstr "Sin subtítulos" msgstr "Sin subtítulos"
msgid "Button$Subtitles"
msgstr "Subtítulos"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "¡No hay subtítulos disponibles!" msgstr "¡No hay subtítulos disponibles!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n" "PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n" "Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
"Language-Team: Estonian <vdr@linuxtv.org>\n" "Language-Team: Estonian <vdr@linuxtv.org>\n"
@ -902,6 +902,12 @@ msgstr "uued transponderid"
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Subtitles"
msgstr "Subtiitrid"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Esmane DVB seade" msgstr "Esmane DVB seade"
@ -1129,9 +1135,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Lõpetada taasesitamine" msgstr " Lõpetada taasesitamine"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Paus" msgstr "Paus"
@ -1157,9 +1160,6 @@ msgstr "Audio k
msgid "No subtitles" msgid "No subtitles"
msgstr "Subtiitrid väljas" msgstr "Subtiitrid väljas"
msgid "Button$Subtitles"
msgstr "Subtiitrid"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Subtiitrid puuduvad" msgstr "Subtiitrid puuduvad"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2007-08-15 15:52+0200\n" "PO-Revision-Date: 2007-08-15 15:52+0200\n"
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n" "Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
"Language-Team: Finnish <vdr@linuxtv.org>\n" "Language-Team: Finnish <vdr@linuxtv.org>\n"
@ -905,6 +905,12 @@ msgstr "uudet transponderit"
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Ääni"
msgid "Button$Subtitles"
msgstr "Tekstitys"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Ensisijainen DVB-sovitin" msgstr "Ensisijainen DVB-sovitin"
@ -1132,9 +1138,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Lopeta toisto" msgstr " Lopeta toisto"
msgid "Button$Audio"
msgstr "Ääni"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Tauko" msgstr "Tauko"
@ -1160,9 +1163,6 @@ msgstr "Äänen kieli ei ole valittavissa!"
msgid "No subtitles" msgid "No subtitles"
msgstr "Ei tekstitystä" msgstr "Ei tekstitystä"
msgid "Button$Subtitles"
msgstr "Tekstitys"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Tekstitys ei ole valittavissa!" msgstr "Tekstitys ei ole valittavissa!"

View File

@ -13,7 +13,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2008-02-27 18:14+0100\n" "PO-Revision-Date: 2008-02-27 18:14+0100\n"
"Last-Translator: Jean-Claude Repetto <jc@repetto.org>\n" "Last-Translator: Jean-Claude Repetto <jc@repetto.org>\n"
"Language-Team: French <vdr@linuxtv.org>\n" "Language-Team: French <vdr@linuxtv.org>\n"
@ -908,6 +908,12 @@ msgstr "ajouter transpondeurs"
msgid "DVB" msgid "DVB"
msgstr "Cartes DVB" msgstr "Cartes DVB"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Subtitles"
msgstr "Sous-titres"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Carte DVB primaire" msgstr "Carte DVB primaire"
@ -1135,9 +1141,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Arrêter la lecture" msgstr " Arrêter la lecture"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pause" msgstr "Pause"
@ -1163,9 +1166,6 @@ msgstr "Pas de son disponible !"
msgid "No subtitles" msgid "No subtitles"
msgstr "Pas de sous-titres" msgstr "Pas de sous-titres"
msgid "Button$Subtitles"
msgstr "Sous-titres"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Pas de sous-titres disponible !" msgstr "Pas de sous-titres disponible !"

View File

@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2008-03-17 19:00+0100\n" "PO-Revision-Date: 2008-03-17 19:00+0100\n"
"Last-Translator: Adrian Caval <anrxc@sysphere.org>\n" "Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
"Language-Team: Croatian <vdr@linuxtv.org>\n" "Language-Team: Croatian <vdr@linuxtv.org>\n"
@ -904,6 +904,12 @@ msgstr "dodaj nove transpondere"
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Subtitles"
msgstr "Titlovi"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Primarni DVB ureðaj" msgstr "Primarni DVB ureðaj"
@ -1131,9 +1137,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Prekini reprodukciju" msgstr " Prekini reprodukciju"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pauza" msgstr "Pauza"
@ -1159,9 +1162,6 @@ msgstr "Audio nedostupan"
msgid "No subtitles" msgid "No subtitles"
msgstr "Bez titlova" msgstr "Bez titlova"
msgid "Button$Subtitles"
msgstr "Titlovi"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Titlovi nisu dostupni!" msgstr "Titlovi nisu dostupni!"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2007-12-01 21:42+0200\n" "PO-Revision-Date: 2007-12-01 21:42+0200\n"
"Last-Translator: István Füley <ifuley@tigercomp.ro>\n" "Last-Translator: István Füley <ifuley@tigercomp.ro>\n"
"Language-Team: Hungarian <vdr@linuxtv.org>\n" "Language-Team: Hungarian <vdr@linuxtv.org>\n"
@ -905,6 +905,12 @@ msgstr "
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Hang"
msgid "Button$Subtitles"
msgstr "Feliratok"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Elsõ DVB interface" msgstr "Elsõ DVB interface"
@ -1132,9 +1138,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Lejátszást befejzni" msgstr " Lejátszást befejzni"
msgid "Button$Audio"
msgstr "Hang"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Szünet" msgstr "Szünet"
@ -1160,9 +1163,6 @@ msgstr "Hang nem lehets
msgid "No subtitles" msgid "No subtitles"
msgstr "Felirat ki" msgstr "Felirat ki"
msgid "Button$Subtitles"
msgstr "Feliratok"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "A csatornán nincs felirat!" msgstr "A csatornán nincs felirat!"

View File

@ -11,7 +11,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2010-06-13 00:30+0100\n" "PO-Revision-Date: 2010-06-13 00:30+0100\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: Italian <vdr@linuxtv.org>\n" "Language-Team: Italian <vdr@linuxtv.org>\n"
@ -909,6 +909,12 @@ msgstr "nuovi transponder"
msgid "DVB" msgid "DVB"
msgstr "Scheda DVB" msgstr "Scheda DVB"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Subtitles"
msgstr "Sottotitoli"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Scheda DVB primaria" msgstr "Scheda DVB primaria"
@ -1136,9 +1142,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Ferma riproduzione" msgstr " Ferma riproduzione"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pausa" msgstr "Pausa"
@ -1164,9 +1167,6 @@ msgstr "Nessun audio disponibile!"
msgid "No subtitles" msgid "No subtitles"
msgstr "Nessun sottotitolo" msgstr "Nessun sottotitolo"
msgid "Button$Subtitles"
msgstr "Sottotitoli"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Nessun sottotitolo disponibile!" msgstr "Nessun sottotitolo disponibile!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.16\n" "Project-Id-Version: VDR 1.7.16\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2010-10-30 11:55+0200\n" "PO-Revision-Date: 2010-10-30 11:55+0200\n"
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n" "Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
"Language-Team: Lithuanian <vdr@linuxtv.org>\n" "Language-Team: Lithuanian <vdr@linuxtv.org>\n"
@ -902,6 +902,12 @@ msgstr "pridėti naujus siųstuvus"
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Garsas"
msgid "Button$Subtitles"
msgstr "Subtitrai"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Pirminiė DVB įvestis" msgstr "Pirminiė DVB įvestis"
@ -1129,9 +1135,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Sustabdyti kartojimą" msgstr " Sustabdyti kartojimą"
msgid "Button$Audio"
msgstr "Garsas"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pristabdyti" msgstr "Pristabdyti"
@ -1157,9 +1160,6 @@ msgstr "Garsas nepateikiamas!"
msgid "No subtitles" msgid "No subtitles"
msgstr "Nėra subtitrų" msgstr "Nėra subtitrų"
msgid "Button$Subtitles"
msgstr "Subtitrai"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Subtitrai nepateikiami!" msgstr "Subtitrai nepateikiami!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR-1.7.14\n" "Project-Id-Version: VDR-1.7.14\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2010-03-11 00:54+0100\n" "PO-Revision-Date: 2010-03-11 00:54+0100\n"
"Last-Translator: Dimitar Petrovski <dimeptr@gmail.com>\n" "Last-Translator: Dimitar Petrovski <dimeptr@gmail.com>\n"
"Language-Team: Macedonian <en@li.org>\n" "Language-Team: Macedonian <en@li.org>\n"
@ -903,6 +903,12 @@ msgstr "додај нови транспондери"
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Аудио"
msgid "Button$Subtitles"
msgstr "Титл"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Примарен DVB уред" msgstr "Примарен DVB уред"
@ -1130,9 +1136,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Запри пуштање" msgstr " Запри пуштање"
msgid "Button$Audio"
msgstr "Аудио"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Пауза" msgstr "Пауза"
@ -1158,9 +1161,6 @@ msgstr "Аудио недостапно!"
msgid "No subtitles" msgid "No subtitles"
msgstr "Без титл" msgstr "Без титл"
msgid "Button$Subtitles"
msgstr "Титл"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Титлови недостапни!" msgstr "Титлови недостапни!"

View File

@ -11,7 +11,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2008-02-26 17:20+0100\n" "PO-Revision-Date: 2008-02-26 17:20+0100\n"
"Last-Translator: Johan Schuring <johan.schuring@vetteblei.nl>\n" "Last-Translator: Johan Schuring <johan.schuring@vetteblei.nl>\n"
"Language-Team: Dutch <vdr@linuxtv.org>\n" "Language-Team: Dutch <vdr@linuxtv.org>\n"
@ -906,6 +906,12 @@ msgstr "nieuwe transponders toevoegen"
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Subtitles"
msgstr "Ondertiteling"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Eerste DVB kaart" msgstr "Eerste DVB kaart"
@ -1133,9 +1139,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Stop afspelen" msgstr " Stop afspelen"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pauze" msgstr "Pauze"
@ -1161,9 +1164,6 @@ msgstr "Geen audio beschikbaar!"
msgid "No subtitles" msgid "No subtitles"
msgstr "Geen ondertiteling" msgstr "Geen ondertiteling"
msgid "Button$Subtitles"
msgstr "Ondertiteling"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Geen ondertiteling beschikbaar" msgstr "Geen ondertiteling beschikbaar"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n" "PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n" "Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
"Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n" "Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n"
@ -903,6 +903,12 @@ msgstr ""
msgid "DVB" msgid "DVB"
msgstr "DVB-enheter" msgstr "DVB-enheter"
msgid "Button$Audio"
msgstr ""
msgid "Button$Subtitles"
msgstr ""
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Hoved DVB-enhet" msgstr "Hoved DVB-enhet"
@ -1130,9 +1136,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Stopp avspilling" msgstr " Stopp avspilling"
msgid "Button$Audio"
msgstr ""
msgid "Button$Pause" msgid "Button$Pause"
msgstr "" msgstr ""
@ -1158,9 +1161,6 @@ msgstr "Pas d'audio disponible!"
msgid "No subtitles" msgid "No subtitles"
msgstr "" msgstr ""
msgid "Button$Subtitles"
msgstr ""
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "" msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2008-03-09 12:59+0100\n" "PO-Revision-Date: 2008-03-09 12:59+0100\n"
"Last-Translator: Michael Rakowski <mrak@gmx.de>\n" "Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
"Language-Team: Polish <vdr@linuxtv.org>\n" "Language-Team: Polish <vdr@linuxtv.org>\n"
@ -903,6 +903,12 @@ msgstr "dodawaj nowe transpondery"
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "D¼wiêk"
msgid "Button$Subtitles"
msgstr "Napisy"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Pierwszy interfejs DVB" msgstr "Pierwszy interfejs DVB"
@ -1130,9 +1136,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Zatrzymaj odtwarzanie" msgstr " Zatrzymaj odtwarzanie"
msgid "Button$Audio"
msgstr "D¼wiêk"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pauza" msgstr "Pauza"
@ -1158,9 +1161,6 @@ msgstr "D
msgid "No subtitles" msgid "No subtitles"
msgstr "Brak napisów" msgstr "Brak napisów"
msgid "Button$Subtitles"
msgstr "Napisy"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Napisy nie s± dostêpne" msgstr "Napisy nie s± dostêpne"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.15\n" "Project-Id-Version: VDR 1.7.15\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2010-03-28 22:49+0100\n" "PO-Revision-Date: 2010-03-28 22:49+0100\n"
"Last-Translator: Cris Silva <hudokkow@gmail.com>\n" "Last-Translator: Cris Silva <hudokkow@gmail.com>\n"
"Language-Team: Portuguese <vdr@linuxtv.org>\n" "Language-Team: Portuguese <vdr@linuxtv.org>\n"
@ -903,6 +903,12 @@ msgstr "adicionar novos transponders"
msgid "DVB" msgid "DVB"
msgstr "Placa DVB" msgstr "Placa DVB"
msgid "Button$Audio"
msgstr "Áudio"
msgid "Button$Subtitles"
msgstr "Legendas"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Placa DVB primária" msgstr "Placa DVB primária"
@ -1130,9 +1136,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Parar reprodução" msgstr " Parar reprodução"
msgid "Button$Audio"
msgstr "Áudio"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pausa" msgstr "Pausa"
@ -1158,9 +1161,6 @@ msgstr "
msgid "No subtitles" msgid "No subtitles"
msgstr "Sem legendas" msgstr "Sem legendas"
msgid "Button$Subtitles"
msgstr "Legendas"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Legendas indisponíveis!" msgstr "Legendas indisponíveis!"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.12\n" "Project-Id-Version: VDR 1.7.12\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2011-03-10 23:52+0100\n" "PO-Revision-Date: 2011-03-10 23:52+0100\n"
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n" "Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
"Language-Team: Romanian <vdr@linuxtv.org>\n" "Language-Team: Romanian <vdr@linuxtv.org>\n"
@ -905,6 +905,12 @@ msgstr "ad
msgid "DVB" msgid "DVB"
msgstr "Dispozitiv DVB" msgstr "Dispozitiv DVB"
msgid "Button$Audio"
msgstr "Sunet"
msgid "Button$Subtitles"
msgstr "Subtitrare"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Dispozitiv DVB primar" msgstr "Dispozitiv DVB primar"
@ -1132,9 +1138,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Opreºte redarea" msgstr " Opreºte redarea"
msgid "Button$Audio"
msgstr "Sunet"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pauzã" msgstr "Pauzã"
@ -1160,9 +1163,6 @@ msgstr "Lipse
msgid "No subtitles" msgid "No subtitles"
msgstr "Nu afiºeazã subtirare" msgstr "Nu afiºeazã subtirare"
msgid "Button$Subtitles"
msgstr "Subtitrare"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Subtitrare indisponibilã!" msgstr "Subtitrare indisponibilã!"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2008-12-15 14:37+0100\n" "PO-Revision-Date: 2008-12-15 14:37+0100\n"
"Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n" "Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n"
"Language-Team: Russian <vdr@linuxtv.org>\n" "Language-Team: Russian <vdr@linuxtv.org>\n"
@ -903,6 +903,12 @@ msgstr "
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Ï×ëÚ"
msgid "Button$Subtitles"
msgstr "ÁãÑâØâàë"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "¾áÝÞÒÝÞÕ DVB-ãáâàÞÙáâÒÞ" msgstr "¾áÝÞÒÝÞÕ DVB-ãáâàÞÙáâÒÞ"
@ -1130,9 +1136,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " ¿àÕÚàÐâØâì ÒÞáßàÞØ×ÒÕÔÕÝØÕ" msgstr " ¿àÕÚàÐâØâì ÒÞáßàÞØ×ÒÕÔÕÝØÕ"
msgid "Button$Audio"
msgstr "Ï×ëÚ"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "¿Ðã×Ð" msgstr "¿Ðã×Ð"
@ -1158,9 +1161,6 @@ msgstr "
msgid "No subtitles" msgid "No subtitles"
msgstr "½Õâ áãÑâØâàÞÒ" msgstr "½Õâ áãÑâØâàÞÒ"
msgid "Button$Subtitles"
msgstr "ÁãÑâØâàë"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "ÁãÑâØâàë ÝÕÔÞáâãßÝë!" msgstr "ÁãÑâØâàë ÝÕÔÞáâãßÝë!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.16\n" "Project-Id-Version: VDR 1.7.16\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2011-02-15 16:29+0100\n" "PO-Revision-Date: 2011-02-15 16:29+0100\n"
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n" "Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
"Language-Team: Slovak <vdr@linuxtv.org>\n" "Language-Team: Slovak <vdr@linuxtv.org>\n"
@ -902,6 +902,12 @@ msgstr "prida
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Zvuk"
msgid "Button$Subtitles"
msgstr "Titulky"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Hlavné DVB rozhranie" msgstr "Hlavné DVB rozhranie"
@ -1129,9 +1135,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Zastavi» prehrávanie" msgstr " Zastavi» prehrávanie"
msgid "Button$Audio"
msgstr "Zvuk"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pozastavi»" msgstr "Pozastavi»"
@ -1157,9 +1160,6 @@ msgstr "Zvuk nie je dostupn
msgid "No subtitles" msgid "No subtitles"
msgstr "Bez titulkov" msgstr "Bez titulkov"
msgid "Button$Subtitles"
msgstr "Titulky"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "¾iadne dostupné titulky!" msgstr "¾iadne dostupné titulky!"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2008-02-28 19:44+0100\n" "PO-Revision-Date: 2008-02-28 19:44+0100\n"
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n" "Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
"Language-Team: Slovenian <vdr@linuxtv.org>\n" "Language-Team: Slovenian <vdr@linuxtv.org>\n"
@ -903,6 +903,12 @@ msgstr "dodaj nove oddajnike"
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Zvok"
msgid "Button$Subtitles"
msgstr "Podnapisi"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Primarna naprava" msgstr "Primarna naprava"
@ -1130,9 +1136,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Prekini predvajanje" msgstr " Prekini predvajanje"
msgid "Button$Audio"
msgstr "Zvok"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pavza" msgstr "Pavza"
@ -1158,9 +1161,6 @@ msgstr "Zvok ni dosegljiv!"
msgid "No subtitles" msgid "No subtitles"
msgstr "Ni podnapisov" msgstr "Ni podnapisov"
msgid "Button$Subtitles"
msgstr "Podnapisi"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Podnapisi niso dosegljivi!" msgstr "Podnapisi niso dosegljivi!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.1\n" "Project-Id-Version: VDR 1.7.1\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2011-01-09 15:57+0100\n" "PO-Revision-Date: 2011-01-09 15:57+0100\n"
"Last-Translator: Milan Cvijanoviæ <elcom_cvijo@hotmail.com>\n" "Last-Translator: Milan Cvijanoviæ <elcom_cvijo@hotmail.com>\n"
"Language-Team: Serbian <vdr@linuxtv.org>\n" "Language-Team: Serbian <vdr@linuxtv.org>\n"
@ -921,6 +921,12 @@ msgstr "dodaj nove transpondere"
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Subtitles"
msgstr "Titlovi"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Primarni DVB ureðaj" msgstr "Primarni DVB ureðaj"
@ -1153,9 +1159,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Zaustavi reprodukciju" msgstr " Zaustavi reprodukciju"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pauza" msgstr "Pauza"
@ -1181,9 +1184,6 @@ msgstr "Ton nedostupan"
msgid "No subtitles" msgid "No subtitles"
msgstr "Bez titlova" msgstr "Bez titlova"
msgid "Button$Subtitles"
msgstr "Titlovi"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Titlovi nisu dostupni!" msgstr "Titlovi nisu dostupni!"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2008-03-12 18:25+0100\n" "PO-Revision-Date: 2008-03-12 18:25+0100\n"
"Last-Translator: Magnus Andersson <svankan@bahnhof.se>\n" "Last-Translator: Magnus Andersson <svankan@bahnhof.se>\n"
"Language-Team: Swedish <vdr@linuxtv.org>\n" "Language-Team: Swedish <vdr@linuxtv.org>\n"
@ -905,6 +905,12 @@ msgstr "l
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Ljud"
msgid "Button$Subtitles"
msgstr "Knapp$Textning"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Primär DVB enhet" msgstr "Primär DVB enhet"
@ -1132,9 +1138,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Avsluta uppspelning" msgstr " Avsluta uppspelning"
msgid "Button$Audio"
msgstr "Ljud"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Pausa" msgstr "Pausa"
@ -1160,9 +1163,6 @@ msgstr "Ljud saknas!"
msgid "No subtitles" msgid "No subtitles"
msgstr "Ingen textning" msgstr "Ingen textning"
msgid "Button$Subtitles"
msgstr "Knapp$Textning"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Ingen textning tillgänglig!" msgstr "Ingen textning tillgänglig!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2008-02-28 00:33+0100\n" "PO-Revision-Date: 2008-02-28 00:33+0100\n"
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n" "Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
"Language-Team: Turkish <vdr@linuxtv.org>\n" "Language-Team: Turkish <vdr@linuxtv.org>\n"
@ -902,6 +902,12 @@ msgstr "yeni uydu al
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Subtitles"
msgstr "Altyazý"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Primer DVB arayüzü" msgstr "Primer DVB arayüzü"
@ -1129,9 +1135,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Gösteriþi bitir" msgstr " Gösteriþi bitir"
msgid "Button$Audio"
msgstr "Audio"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Durakla" msgstr "Durakla"
@ -1157,9 +1160,6 @@ msgstr "Audio yok!"
msgid "No subtitles" msgid "No subtitles"
msgstr "Altyazý yok" msgstr "Altyazý yok"
msgid "Button$Subtitles"
msgstr "Altyazý"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Altyazý bulunamadý" msgstr "Altyazý bulunamadý"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.7\n" "Project-Id-Version: VDR 1.7.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2010-04-25 16:35+0200\n" "PO-Revision-Date: 2010-04-25 16:35+0200\n"
"Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n" "Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
"Language-Team: Ukrainian <vdr@linuxtv.org>\n" "Language-Team: Ukrainian <vdr@linuxtv.org>\n"
@ -902,6 +902,12 @@ msgstr "додати нові транспондери"
msgid "DVB" msgid "DVB"
msgstr "DVB" msgstr "DVB"
msgid "Button$Audio"
msgstr "Мова аудіо"
msgid "Button$Subtitles"
msgstr "Субтитри"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "Основний DVB-пристрій" msgstr "Основний DVB-пристрій"
@ -1129,9 +1135,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr " Зупинити програвання" msgstr " Зупинити програвання"
msgid "Button$Audio"
msgstr "Мова аудіо"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "Пауза" msgstr "Пауза"
@ -1157,9 +1160,6 @@ msgstr "Відсутній звук!"
msgid "No subtitles" msgid "No subtitles"
msgstr "Немає субтитрів" msgstr "Немає субтитрів"
msgid "Button$Subtitles"
msgstr "Субтитри"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "Субтитрів немає!" msgstr "Субтитрів немає!"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-05-21 14:26+0200\n" "POT-Creation-Date: 2011-08-27 11:54+0200\n"
"PO-Revision-Date: 2009-09-23 23:50+0800\n" "PO-Revision-Date: 2009-09-23 23:50+0800\n"
"Last-Translator: Nan Feng <nfgx@21cn.com>\n" "Last-Translator: Nan Feng <nfgx@21cn.com>\n"
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n" "Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
@ -905,6 +905,12 @@ msgstr "添加新转发器"
msgid "DVB" msgid "DVB"
msgstr "卫星卡设置" msgstr "卫星卡设置"
msgid "Button$Audio"
msgstr "声道"
msgid "Button$Subtitles"
msgstr "字幕"
msgid "Setup.DVB$Primary DVB interface" msgid "Setup.DVB$Primary DVB interface"
msgstr "使用中卫星卡接口" msgstr "使用中卫星卡接口"
@ -1132,9 +1138,6 @@ msgstr "VDR"
msgid " Stop replaying" msgid " Stop replaying"
msgstr "停止回放" msgstr "停止回放"
msgid "Button$Audio"
msgstr "声道"
msgid "Button$Pause" msgid "Button$Pause"
msgstr "暂停" msgstr "暂停"
@ -1160,9 +1163,6 @@ msgstr "音频不可用"
msgid "No subtitles" msgid "No subtitles"
msgstr "没有字幕" msgstr "没有字幕"
msgid "Button$Subtitles"
msgstr "字幕"
msgid "No subtitles available!" msgid "No subtitles available!"
msgstr "字幕不可用" msgstr "字幕不可用"

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: recorder.c 2.14 2011/08/13 14:56:36 kls Exp $ * $Id: recorder.c 2.15 2011/09/04 09:26:44 kls Exp $
*/ */
#include "recorder.h" #include "recorder.h"
@ -31,7 +31,7 @@ cRecorder::cRecorder(const char *FileName, const cChannel *Channel, int Priority
SpinUpDisk(FileName); SpinUpDisk(FileName);
ringBuffer = new cRingBufferLinear(RECORDERBUFSIZE, TS_SIZE, true, "Recorder"); ringBuffer = new cRingBufferLinear(RECORDERBUFSIZE, MIN_TS_PACKETS_FOR_FRAME_DETECTOR * TS_SIZE, true, "Recorder");
ringBuffer->SetTimeouts(0, 100); ringBuffer->SetTimeouts(0, 100);
int Pid = Channel->Vpid(); int Pid = Channel->Vpid();
@ -88,7 +88,7 @@ bool cRecorder::RunningLowOnDiskSpace(void)
bool cRecorder::NextFile(void) bool cRecorder::NextFile(void)
{ {
if (recordFile) { if (recordFile && frameDetector->IndependentFrame()) { // every file shall start with an independent frame
if (fileSize > MEGABYTE(off_t(Setup.MaxVideoFileSize)) || RunningLowOnDiskSpace()) { if (fileSize > MEGABYTE(off_t(Setup.MaxVideoFileSize)) || RunningLowOnDiskSpace()) {
recordFile = fileName->NextFile(); recordFile = fileName->NextFile();
fileSize = 0; fileSize = 0;
@ -119,11 +119,6 @@ void cRecorder::Action(void)
time_t t = time(NULL); time_t t = time(NULL);
bool InfoWritten = false; bool InfoWritten = false;
bool FirstIframeSeen = false; bool FirstIframeSeen = false;
#define BUFFERSIZE (5 * TS_SIZE)
bool Buffering = false;
int BufferIndex = 0;
int MaxBufferIndex = 0;
uchar *Buffer = NULL;
while (Running()) { while (Running()) {
int r; int r;
uchar *b = ringBuffer->Get(r); uchar *b = ringBuffer->Get(r);
@ -144,34 +139,9 @@ void cRecorder::Action(void)
} }
InfoWritten = true; InfoWritten = true;
} }
if (frameDetector->NewPayload()) { // We're at the first TS packet of a new payload... if (FirstIframeSeen || frameDetector->IndependentFrame()) {
if (Buffering)
esyslog("ERROR: encountered new payload while buffering - dropping some data!");
if (!frameDetector->NewFrame()) { // ...but the frame type is yet unknown, so we need to buffer packets until we see the frame type
if (!Buffer) {
dsyslog("frame type not in first packet of payload - buffering");
if (!(Buffer = MALLOC(uchar, BUFFERSIZE))) {
esyslog("ERROR: can't allocate frame type buffer");
break;
}
}
BufferIndex = 0;
Buffering = true;
}
}
else if (frameDetector->NewFrame()) // now we know the frame type, so stop buffering
Buffering = false;
if (Buffering) {
if (BufferIndex + Count <= BUFFERSIZE) {
memcpy(Buffer + BufferIndex, b, Count);
BufferIndex += Count;
}
else
esyslog("ERROR: too many bytes for frame type buffer (%d > %d) - dropped %d bytes", BufferIndex + Count, int(BUFFERSIZE), Count);
}
else if (FirstIframeSeen || frameDetector->IndependentFrame()) {
FirstIframeSeen = true; // start recording with the first I-frame FirstIframeSeen = true; // start recording with the first I-frame
if (frameDetector->IndependentFrame() && !NextFile()) // every file shall start with an independent frame if (!NextFile())
break; break;
if (index && frameDetector->NewFrame()) if (index && frameDetector->NewFrame())
index->Write(frameDetector->IndependentFrame(), fileName->Number(), fileSize); index->Write(frameDetector->IndependentFrame(), fileName->Number(), fileSize);
@ -184,12 +154,6 @@ void cRecorder::Action(void)
fileSize += TS_SIZE; fileSize += TS_SIZE;
} }
} }
if (BufferIndex) {
recordFile->Write(Buffer, BufferIndex); // if an error occurs here, the next write below will catch and report it
if (BufferIndex > MaxBufferIndex)
MaxBufferIndex = BufferIndex;
BufferIndex = 0;
}
if (recordFile->Write(b, Count) < 0) { if (recordFile->Write(b, Count) < 0) {
LOG_ERROR_STR(fileName->Name()); LOG_ERROR_STR(fileName->Name());
break; break;
@ -207,8 +171,4 @@ void cRecorder::Action(void)
t = time(NULL); t = time(NULL);
} }
} }
if (Buffer) {
free(Buffer);
dsyslog("frame type buffer used %d bytes", MaxBufferIndex);
}
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: recording.c 2.33 2011/08/13 12:37:25 kls Exp $ * $Id: recording.c 2.38 2011/09/04 09:32:25 kls Exp $
*/ */
#include "recording.h" #include "recording.h"
@ -60,6 +60,7 @@
#define DISKCHECKDELTA 100 // seconds between checks for free disk space #define DISKCHECKDELTA 100 // seconds between checks for free disk space
#define REMOVELATENCY 10 // seconds to wait until next check after removing a file #define REMOVELATENCY 10 // seconds to wait until next check after removing a file
#define MARKSUPDATEDELTA 10 // seconds between checks for updating editing marks #define MARKSUPDATEDELTA 10 // seconds between checks for updating editing marks
#define MININDEXAGE 3600 // seconds before an index file is considered no longer to be written
#define MAX_SUBTITLE_LENGTH 40 #define MAX_SUBTITLE_LENGTH 40
@ -94,7 +95,7 @@ void cRemoveDeletedRecordingsThread::Action(void)
bool deleted = false; bool deleted = false;
cThreadLock DeletedRecordingsLock(&DeletedRecordings); cThreadLock DeletedRecordingsLock(&DeletedRecordings);
for (cRecording *r = DeletedRecordings.First(); r; ) { for (cRecording *r = DeletedRecordings.First(); r; ) {
if (r->deleted && time(NULL) - r->deleted > DELETEDLIFETIME) { if (r->Deleted() && time(NULL) - r->Deleted() > DELETEDLIFETIME) {
cRecording *next = DeletedRecordings.Next(r); cRecording *next = DeletedRecordings.Next(r);
r->Remove(); r->Remove();
DeletedRecordings.Del(r); DeletedRecordings.Del(r);
@ -120,7 +121,7 @@ void RemoveDeletedRecordings(void)
if (!RemoveDeletedRecordingsThread.Active()) { if (!RemoveDeletedRecordingsThread.Active()) {
cThreadLock DeletedRecordingsLock(&DeletedRecordings); cThreadLock DeletedRecordingsLock(&DeletedRecordings);
for (cRecording *r = DeletedRecordings.First(); r; r = DeletedRecordings.Next(r)) { for (cRecording *r = DeletedRecordings.First(); r; r = DeletedRecordings.Next(r)) {
if (r->deleted && time(NULL) - r->deleted > DELETEDLIFETIME) { if (r->Deleted() && time(NULL) - r->Deleted() > DELETEDLIFETIME) {
RemoveDeletedRecordingsThread.Start(); RemoveDeletedRecordingsThread.Start();
break; break;
} }
@ -153,7 +154,7 @@ void AssertFreeDiskSpace(int Priority, bool Force)
cRecording *r0 = NULL; cRecording *r0 = NULL;
while (r) { while (r) {
if (IsOnVideoDirectoryFileSystem(r->FileName())) { // only remove recordings that will actually increase the free video disk space if (IsOnVideoDirectoryFileSystem(r->FileName())) { // only remove recordings that will actually increase the free video disk space
if (!r0 || r->start < r0->start) if (!r0 || r->Start() < r0->Start())
r0 = r; r0 = r;
} }
r = DeletedRecordings.Next(r); r = DeletedRecordings.Next(r);
@ -180,11 +181,11 @@ void AssertFreeDiskSpace(int Priority, bool Force)
cRecording *r0 = NULL; cRecording *r0 = NULL;
while (r) { while (r) {
if (IsOnVideoDirectoryFileSystem(r->FileName())) { // only delete recordings that will actually increase the free video disk space if (IsOnVideoDirectoryFileSystem(r->FileName())) { // only delete recordings that will actually increase the free video disk space
if (!r->IsEdited() && r->lifetime < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever if (!r->IsEdited() && r->Lifetime() < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever
if ((r->lifetime == 0 && Priority > r->priority) || // the recording has no guaranteed lifetime and the new recording has higher priority if ((r->Lifetime() == 0 && Priority > r->Priority()) || // the recording has no guaranteed lifetime and the new recording has higher priority
(r->lifetime > 0 && (time(NULL) - r->start) / SECSINDAY >= r->lifetime)) { // the recording's guaranteed lifetime has expired (r->Lifetime() > 0 && (time(NULL) - r->Start()) / SECSINDAY >= r->Lifetime())) { // the recording's guaranteed lifetime has expired
if (r0) { if (r0) {
if (r->priority < r0->priority || (r->priority == r0->priority && r->start < r0->start)) if (r->Priority() < r0->Priority() || (r->Priority() == r0->Priority() && r->Start() < r0->Start()))
r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities) r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities)
} }
else else
@ -617,6 +618,7 @@ cRecording::cRecording(cTimer *Timer, const cEvent *Event)
instanceId = InstanceId; instanceId = InstanceId;
isPesRecording = false; isPesRecording = false;
framesPerSecond = DEFAULTFRAMESPERSECOND; framesPerSecond = DEFAULTFRAMESPERSECOND;
numFrames = -1;
deleted = 0; deleted = 0;
// set up the actual name: // set up the actual name:
const char *Title = Event ? Event->Title() : NULL; const char *Title = Event ? Event->Title() : NULL;
@ -676,6 +678,7 @@ cRecording::cRecording(const char *FileName)
lifetime = MAXLIFETIME; lifetime = MAXLIFETIME;
isPesRecording = false; isPesRecording = false;
framesPerSecond = DEFAULTFRAMESPERSECOND; framesPerSecond = DEFAULTFRAMESPERSECOND;
numFrames = -1;
deleted = 0; deleted = 0;
titleBuffer = NULL; titleBuffer = NULL;
sortBuffer = NULL; sortBuffer = NULL;
@ -870,13 +873,16 @@ const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level) cons
s++; s++;
else else
s = name; s = name;
titleBuffer = strdup(cString::sprintf("%02d.%02d.%02d%c%02d:%02d%c%c%s", titleBuffer = strdup(cString::sprintf("%02d.%02d.%02d%c%02d:%02d%c%d:%02d%c%c%s",
t->tm_mday, t->tm_mday,
t->tm_mon + 1, t->tm_mon + 1,
t->tm_year % 100, t->tm_year % 100,
Delimiter, Delimiter,
t->tm_hour, t->tm_hour,
t->tm_min, t->tm_min,
Delimiter,
(LengthInSeconds() >= 0) ? LengthInSeconds() / 3600 : 0,
(LengthInSeconds() >= 0) ? LengthInSeconds() / 60 % 60 : 0,
New, New,
Delimiter, Delimiter,
s)); s));
@ -958,6 +964,13 @@ bool cRecording::WriteInfo(void)
return true; return true;
} }
void cRecording::SetStartTime(time_t Start)
{
start = Start;
free(fileName);
fileName = NULL;
}
bool cRecording::Delete(void) bool cRecording::Delete(void)
{ {
bool result = true; bool result = true;
@ -1024,6 +1037,25 @@ void cRecording::ResetResume(void) const
resume = RESUME_NOT_INITIALIZED; resume = RESUME_NOT_INITIALIZED;
} }
int cRecording::NumFrames(void) const
{
if (numFrames < 0) {
int nf = cIndexFile::GetLength(FileName(), IsPesRecording());
if (time(NULL) - LastModifiedTime(FileName()) < MININDEXAGE)
return nf; // check again later for ongoing recordings
numFrames = nf;
}
return numFrames;
}
int cRecording::LengthInSeconds(void) const
{
int nf = NumFrames();
if (nf >= 0)
return int((nf / FramesPerSecond() + 30) / 60) * 60;
return -1;
}
// --- cRecordings ----------------------------------------------------------- // --- cRecordings -----------------------------------------------------------
cRecordings Recordings; cRecordings Recordings;
@ -1095,6 +1127,7 @@ void cRecordings::ScanVideoDir(const char *DirName, bool Foreground, int LinkLev
if (endswith(buffer, deleted ? DELEXT : RECEXT)) { if (endswith(buffer, deleted ? DELEXT : RECEXT)) {
cRecording *r = new cRecording(buffer); cRecording *r = new cRecording(buffer);
if (r->Name()) { if (r->Name()) {
r->NumFrames(); // initializes the numFrames member
Lock(); Lock();
Add(r); Add(r);
ChangeState(); ChangeState();
@ -1233,23 +1266,21 @@ cMutex MutexMarkFramesPerSecond;
cMark::cMark(int Position, const char *Comment, double FramesPerSecond) cMark::cMark(int Position, const char *Comment, double FramesPerSecond)
{ {
position = Position; position = Position;
comment = Comment ? strdup(Comment) : NULL; comment = Comment;
framesPerSecond = FramesPerSecond; framesPerSecond = FramesPerSecond;
} }
cMark::~cMark() cMark::~cMark()
{ {
free(comment);
} }
cString cMark::ToText(void) cString cMark::ToText(void)
{ {
return cString::sprintf("%s%s%s\n", *IndexToHMSF(position, true, framesPerSecond), comment ? " " : "", comment ? comment : ""); return cString::sprintf("%s%s%s\n", *IndexToHMSF(position, true, framesPerSecond), Comment() ? " " : "", Comment() ? Comment() : "");
} }
bool cMark::Parse(const char *s) bool cMark::Parse(const char *s)
{ {
free(comment);
comment = NULL; comment = NULL;
framesPerSecond = MarkFramesPerSecond; framesPerSecond = MarkFramesPerSecond;
position = HMSFToIndex(s, framesPerSecond); position = HMSFToIndex(s, framesPerSecond);
@ -1313,7 +1344,7 @@ void cMarks::Sort(void)
{ {
for (cMark *m1 = First(); m1; m1 = Next(m1)) { for (cMark *m1 = First(); m1; m1 = Next(m1)) {
for (cMark *m2 = Next(m1); m2; m2 = Next(m2)) { for (cMark *m2 = Next(m1); m2; m2 = Next(m2)) {
if (m2->position < m1->position) { if (m2->Position() < m1->Position()) {
swap(m1->position, m2->position); swap(m1->position, m2->position);
swap(m1->comment, m2->comment); swap(m1->comment, m2->comment);
} }
@ -1334,7 +1365,7 @@ cMark *cMarks::Add(int Position)
cMark *cMarks::Get(int Position) cMark *cMarks::Get(int Position)
{ {
for (cMark *mi = First(); mi; mi = Next(mi)) { for (cMark *mi = First(); mi; mi = Next(mi)) {
if (mi->position == Position) if (mi->Position() == Position)
return mi; return mi;
} }
return NULL; return NULL;
@ -1343,7 +1374,7 @@ cMark *cMarks::Get(int Position)
cMark *cMarks::GetPrev(int Position) cMark *cMarks::GetPrev(int Position)
{ {
for (cMark *mi = Last(); mi; mi = Prev(mi)) { for (cMark *mi = Last(); mi; mi = Prev(mi)) {
if (mi->position < Position) if (mi->Position() < Position)
return mi; return mi;
} }
return NULL; return NULL;
@ -1352,7 +1383,7 @@ cMark *cMarks::GetPrev(int Position)
cMark *cMarks::GetNext(int Position) cMark *cMarks::GetNext(int Position)
{ {
for (cMark *mi = First(); mi; mi = Next(mi)) { for (cMark *mi = First(); mi; mi = Next(mi)) {
if (mi->position > Position) if (mi->Position() > Position)
return mi; return mi;
} }
return NULL; return NULL;
@ -1403,12 +1434,11 @@ void cIndexFileGenerator::Action(void)
bool Rewind = false; bool Rewind = false;
cFileName FileName(recordingName, false); cFileName FileName(recordingName, false);
cUnbufferedFile *ReplayFile = FileName.Open(); cUnbufferedFile *ReplayFile = FileName.Open();
cRingBufferLinear Buffer(IFG_BUFFER_SIZE, TS_SIZE); cRingBufferLinear Buffer(IFG_BUFFER_SIZE, MIN_TS_PACKETS_FOR_FRAME_DETECTOR * TS_SIZE);
cPatPmtParser PatPmtParser; cPatPmtParser PatPmtParser;
cFrameDetector FrameDetector; cFrameDetector FrameDetector;
cIndexFile IndexFile(recordingName, true); cIndexFile IndexFile(recordingName, true);
int BufferChunks = KILOBYTE(1); // no need to read a lot at the beginning when parsing PAT/PMT int BufferChunks = KILOBYTE(1); // no need to read a lot at the beginning when parsing PAT/PMT
int FileNumber = 0;
off_t FileSize = 0; off_t FileSize = 0;
off_t FrameOffset = -1; off_t FrameOffset = -1;
Skins.QueueMessage(mtInfo, tr("Regenerating index file")); Skins.QueueMessage(mtInfo, tr("Regenerating index file"));
@ -1425,18 +1455,12 @@ void cIndexFileGenerator::Action(void)
if (Data) { if (Data) {
if (FrameDetector.Synced()) { if (FrameDetector.Synced()) {
// Step 3 - generate the index: // Step 3 - generate the index:
if (FrameOffset < 0 && TsPid(Data) == PATPID) { if (TsPid(Data) == PATPID)
FileNumber = FileName.Number();
FrameOffset = FileSize; // the PAT/PMT is at the beginning of an I-frame FrameOffset = FileSize; // the PAT/PMT is at the beginning of an I-frame
}
int Processed = FrameDetector.Analyze(Data, Length); int Processed = FrameDetector.Analyze(Data, Length);
if (Processed > 0) { if (Processed > 0) {
if (FrameDetector.NewPayload() && FrameOffset < 0) {
FileNumber = FileName.Number();
FrameOffset = FileSize;
}
if (FrameDetector.NewFrame()) { if (FrameDetector.NewFrame()) {
IndexFile.Write(FrameDetector.IndependentFrame(), FileNumber, FrameOffset); IndexFile.Write(FrameDetector.IndependentFrame(), FileName.Number(), FrameOffset >= 0 ? FrameOffset : FileSize);
FrameOffset = -1; FrameOffset = -1;
} }
FileSize += Processed; FileSize += Processed;
@ -1509,9 +1533,6 @@ void cIndexFileGenerator::Action(void)
// The maximum time to wait before giving up while catching up on an index file: // The maximum time to wait before giving up while catching up on an index file:
#define MAXINDEXCATCHUP 8 // seconds #define MAXINDEXCATCHUP 8 // seconds
// The minimum age of an index file for considering it no longer to be written:
#define MININDEXAGE 3600 // seconds
struct tIndexPes { struct tIndexPes {
uint32_t offset; uint32_t offset;
uchar type; uchar type;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: recording.h 2.22 2011/08/13 12:51:23 kls Exp $ * $Id: recording.h 2.25 2011/08/21 13:10:39 kls Exp $
*/ */
#ifndef __RECORDING_H #ifndef __RECORDING_H
@ -22,6 +22,8 @@
#define TIMERMACRO_TITLE "TITLE" #define TIMERMACRO_TITLE "TITLE"
#define TIMERMACRO_EPISODE "EPISODE" #define TIMERMACRO_EPISODE "EPISODE"
#define __RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS // Code enclosed with this macro is deprecated and may be removed in a future version
extern bool VfatFileSystem; extern bool VfatFileSystem;
extern int InstanceId; extern int InstanceId;
@ -87,6 +89,7 @@ private:
mutable char *fileName; mutable char *fileName;
mutable char *name; mutable char *name;
mutable int fileSizeMB; mutable int fileSizeMB;
mutable int numFrames;
int channel; int channel;
int instanceId; int instanceId;
bool isPesRecording; bool isPesRecording;
@ -97,14 +100,21 @@ private:
static char *StripEpisodeName(char *s); static char *StripEpisodeName(char *s);
char *SortName(void) const; char *SortName(void) const;
int GetResume(void) const; int GetResume(void) const;
#ifdef __RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS
public: public:
#endif
time_t start; time_t start;
int priority; int priority;
int lifetime; int lifetime;
time_t deleted; time_t deleted;
public:
cRecording(cTimer *Timer, const cEvent *Event); cRecording(cTimer *Timer, const cEvent *Event);
cRecording(const char *FileName); cRecording(const char *FileName);
virtual ~cRecording(); virtual ~cRecording();
time_t Start(void) const { return start; }
int Priority(void) const { return priority; }
int Lifetime(void) const { return lifetime; }
time_t Deleted(void) const { return deleted; }
virtual int Compare(const cListObject &ListObject) const; virtual int Compare(const cListObject &ListObject) const;
const char *Name(void) const { return name; } const char *Name(void) const { return name; }
const char *FileName(void) const; const char *FileName(void) const;
@ -114,11 +124,24 @@ public:
int HierarchyLevels(void) const; int HierarchyLevels(void) const;
void ResetResume(void) const; void ResetResume(void) const;
double FramesPerSecond(void) const { return framesPerSecond; } double FramesPerSecond(void) const { return framesPerSecond; }
int NumFrames(void) const;
///< Returns the number of frames in this recording.
///< If the number of frames is unknown, -1 will be returned.
int LengthInSeconds(void) const;
///< Returns the length (in seconds) of this recording, or -1 in case of error.
bool IsNew(void) const { return GetResume() <= 0; } bool IsNew(void) const { return GetResume() <= 0; }
bool IsEdited(void) const; bool IsEdited(void) const;
bool IsPesRecording(void) const { return isPesRecording; } bool IsPesRecording(void) const { return isPesRecording; }
void ReadInfo(void); void ReadInfo(void);
bool WriteInfo(void); bool WriteInfo(void);
void SetStartTime(time_t Start);
///< Sets the start time of this recording to the given value.
///< If a filename has already been set for this recording, it will be
///< deleted and a new one will be generated (using the new start time)
///< at the next call to FileName().
///< Use this function with care - it does not check whether a recording with
///< this new name already exists, and if there is one, results may be
///< unexpected!
bool Delete(void); bool Delete(void);
///< Changes the file name so that it will no longer be visible in the "Recordings" menu ///< Changes the file name so that it will no longer be visible in the "Recordings" menu
///< Returns false in case of error ///< Returns false in case of error
@ -176,13 +199,21 @@ extern cRecordings DeletedRecordings;
#define DEFAULTFRAMESPERSECOND 25.0 #define DEFAULTFRAMESPERSECOND 25.0
class cMark : public cListObject { class cMark : public cListObject {
friend class cMarks; // for sorting
private: private:
double framesPerSecond; double framesPerSecond;
#ifdef __RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS
public: public:
#endif
int position; int position;
char *comment; cString comment;
public:
cMark(int Position = 0, const char *Comment = NULL, double FramesPerSecond = DEFAULTFRAMESPERSECOND); cMark(int Position = 0, const char *Comment = NULL, double FramesPerSecond = DEFAULTFRAMESPERSECOND);
virtual ~cMark(); virtual ~cMark();
int Position(void) const { return position; }
const char *Comment(void) const { return comment; }
void SetPosition(int Position) { position = Position; }
void SetComment(const char *Comment) { comment = Comment; }
cString ToText(void); cString ToText(void);
bool Parse(const char *s); bool Parse(const char *s);
bool Save(FILE *f); bool Save(FILE *f);

79
remux.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: remux.c 2.58 2011/08/15 09:50:14 kls Exp $ * $Id: remux.c 2.62 2011/09/04 13:09:06 kls Exp $
*/ */
#include "remux.h" #include "remux.h"
@ -785,8 +785,7 @@ cFrameDetector::cFrameDetector(int Pid, int Type)
{ {
SetPid(Pid, Type); SetPid(Pid, Type);
synced = false; synced = false;
newPayload = newFrame = independentFrame = false; newFrame = independentFrame = false;
frameTypeOffset = -1;
numPtsValues = 0; numPtsValues = 0;
numFrames = 0; numFrames = 0;
numIFrames = 0; numIFrames = 0;
@ -813,17 +812,36 @@ void cFrameDetector::SetPid(int Pid, int Type)
void cFrameDetector::Reset(void) void cFrameDetector::Reset(void)
{ {
newPayload = newFrame = independentFrame = false; newFrame = independentFrame = false;
frameTypeOffset = -1;
payloadUnitOfFrame = 0; payloadUnitOfFrame = 0;
scanning = false; scanning = false;
scanner = EMPTY_SCANNER; scanner = EMPTY_SCANNER;
} }
int cFrameDetector::SkipPackets(const uchar *&Data, int &Length, int &Processed, int &FrameTypeOffset)
{
if (!synced)
dbgframes("%d>", FrameTypeOffset);
while (Length >= TS_SIZE) {
// switch to the next TS packet, but skip those that have a different PID:
Data += TS_SIZE;
Length -= TS_SIZE;
Processed += TS_SIZE;
if (TsPid(Data) == pid)
break;
else if (Length < TS_SIZE)
esyslog("ERROR: out of data while skipping TS packets in cFrameDetector");
}
FrameTypeOffset -= TS_SIZE;
FrameTypeOffset += TsPayloadOffset(Data);
return FrameTypeOffset;
}
int cFrameDetector::Analyze(const uchar *Data, int Length) int cFrameDetector::Analyze(const uchar *Data, int Length)
{ {
int SeenPayloadStart = false;
int Processed = 0; int Processed = 0;
newPayload = newFrame = independentFrame = false; newFrame = independentFrame = false;
while (Length >= TS_SIZE) { while (Length >= TS_SIZE) {
if (Data[0] != TS_SYNC_BYTE) { if (Data[0] != TS_SYNC_BYTE) {
int Skipped = 1; int Skipped = 1;
@ -836,11 +854,14 @@ int cFrameDetector::Analyze(const uchar *Data, int Length)
int Pid = TsPid(Data); int Pid = TsPid(Data);
if (Pid == pid) { if (Pid == pid) {
if (TsPayloadStart(Data)) { if (TsPayloadStart(Data)) {
SeenPayloadStart = true;
if (synced && Processed) if (synced && Processed)
return Processed; // flush everything before this new payload return Processed;
if (Length < MIN_TS_PACKETS_FOR_FRAME_DETECTOR * TS_SIZE)
return Processed; // need more data, in case the frame type is not stored in the first TS packet
if (framesPerSecond <= 0.0) { if (framesPerSecond <= 0.0) {
// frame rate unknown, so collect a sequence of PTS values: // frame rate unknown, so collect a sequence of PTS values:
if (numPtsValues < MaxPtsValues && numIFrames < 2) { // collect a sequence containing at least two I-frames if (numPtsValues < 2 || numPtsValues < MaxPtsValues && numIFrames < 2) { // collect a sequence containing at least two I-frames
const uchar *Pes = Data + TsPayloadOffset(Data); const uchar *Pes = Data + TsPayloadOffset(Data);
if (numIFrames && PesHasPts(Pes)) { if (numIFrames && PesHasPts(Pes)) {
ptsValues[numPtsValues] = PesGetPts(Pes); ptsValues[numPtsValues] = PesGetPts(Pes);
@ -902,10 +923,6 @@ int cFrameDetector::Analyze(const uchar *Data, int Length)
if (scanning) { if (scanning) {
int PayloadOffset = TsPayloadOffset(Data); int PayloadOffset = TsPayloadOffset(Data);
if (TsPayloadStart(Data)) { if (TsPayloadStart(Data)) {
if (synced && Processed)
return Processed; // flush everything before this new payload
newPayload = true;
scanner = EMPTY_SCANNER;
PayloadOffset += PesPayloadOffset(Data + PayloadOffset); PayloadOffset += PesPayloadOffset(Data + PayloadOffset);
if (!framesPerPayloadUnit) if (!framesPerPayloadUnit)
framesPerPayloadUnit = framesInPayloadUnit; framesPerPayloadUnit = framesInPayloadUnit;
@ -913,29 +930,20 @@ int cFrameDetector::Analyze(const uchar *Data, int Length)
dbgframes("/"); dbgframes("/");
} }
for (int i = PayloadOffset; scanning && i < TS_SIZE; i++) { for (int i = PayloadOffset; scanning && i < TS_SIZE; i++) {
if (frameTypeOffset < 0) {
scanner <<= 8; scanner <<= 8;
scanner |= Data[i]; scanner |= Data[i];
}
else
frameTypeOffset += PayloadOffset;
switch (type) { switch (type) {
case 0x01: // MPEG 1 video case 0x01: // MPEG 1 video
case 0x02: // MPEG 2 video case 0x02: // MPEG 2 video
if (scanner == 0x00000100) { // Picture Start Code if (scanner == 0x00000100) { // Picture Start Code
if (frameTypeOffset < 0) {
frameTypeOffset = i + 2;
if (frameTypeOffset >= TS_SIZE) { // the byte to check is in the next TS packet
frameTypeOffset -= TS_SIZE;
if (!synced)
dbgframes("%d>", frameTypeOffset);
break;
}
}
scanner = EMPTY_SCANNER; scanner = EMPTY_SCANNER;
if (synced && !SeenPayloadStart && Processed)
return Processed; // flush everything before this new frame
int FrameTypeOffset = i + 2;
if (FrameTypeOffset >= TS_SIZE) // the byte to check is in the next TS packet
i = SkipPackets(Data, Length, Processed, FrameTypeOffset);
newFrame = true; newFrame = true;
uchar FrameType = (Data[frameTypeOffset] >> 3) & 0x07; uchar FrameType = (Data[FrameTypeOffset] >> 3) & 0x07;
frameTypeOffset = -1;
independentFrame = FrameType == 1; // I-Frame independentFrame = FrameType == 1; // I-Frame
if (synced) { if (synced) {
if (framesPerPayloadUnit <= 1) if (framesPerPayloadUnit <= 1)
@ -955,19 +963,14 @@ int cFrameDetector::Analyze(const uchar *Data, int Length)
break; break;
case 0x1B: // MPEG 4 video case 0x1B: // MPEG 4 video
if (scanner == 0x00000109) { // Access Unit Delimiter if (scanner == 0x00000109) { // Access Unit Delimiter
if (frameTypeOffset < 0) {
frameTypeOffset = i + 1;
if (frameTypeOffset >= TS_SIZE) { // the byte to check is in the next TS packet
frameTypeOffset -= TS_SIZE;
if (!synced)
dbgframes("%d>", frameTypeOffset);
break;
}
}
scanner = EMPTY_SCANNER; scanner = EMPTY_SCANNER;
if (synced && !SeenPayloadStart && Processed)
return Processed; // flush everything before this new frame
int FrameTypeOffset = i + 1;
if (FrameTypeOffset >= TS_SIZE) // the byte to check is in the next TS packet
i = SkipPackets(Data, Length, Processed, FrameTypeOffset);
newFrame = true; newFrame = true;
uchar FrameType = Data[frameTypeOffset]; uchar FrameType = Data[FrameTypeOffset];
frameTypeOffset = -1;
independentFrame = FrameType == 0x10; independentFrame = FrameType == 0x10;
if (synced) { if (synced) {
if (framesPerPayloadUnit < 0) { if (framesPerPayloadUnit < 0) {

12
remux.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: remux.h 2.30 2011/06/12 12:49:17 kls Exp $ * $Id: remux.h 2.32 2011/09/04 12:48:26 kls Exp $
*/ */
#ifndef __REMUX_H #ifndef __REMUX_H
@ -336,16 +336,16 @@ void PesDump(const char *Name, const u_char *Data, int Length);
// Frame detector: // Frame detector:
#define MIN_TS_PACKETS_FOR_FRAME_DETECTOR 5
class cFrameDetector { class cFrameDetector {
private: private:
enum { MaxPtsValues = 150 }; enum { MaxPtsValues = 150 };
int pid; int pid;
int type; int type;
bool synced; bool synced;
bool newPayload;
bool newFrame; bool newFrame;
bool independentFrame; bool independentFrame;
int frameTypeOffset;
uint32_t ptsValues[MaxPtsValues]; // 32 bit is enough - we only need the delta uint32_t ptsValues[MaxPtsValues]; // 32 bit is enough - we only need the delta
int numPtsValues; int numPtsValues;
int numFrames; int numFrames;
@ -359,6 +359,7 @@ private:
int payloadUnitOfFrame; int payloadUnitOfFrame;
bool scanning; bool scanning;
uint32_t scanner; uint32_t scanner;
int SkipPackets(const uchar *&Data, int &Length, int &Processed, int &FrameTypeOffset);
public: public:
cFrameDetector(int Pid = 0, int Type = 0); cFrameDetector(int Pid = 0, int Type = 0);
///< Sets up a frame detector for the given Pid and stream Type. ///< Sets up a frame detector for the given Pid and stream Type.
@ -377,11 +378,6 @@ public:
///< Analyze() needs to be called again with more actual data. ///< Analyze() needs to be called again with more actual data.
bool Synced(void) { return synced; } bool Synced(void) { return synced; }
///< Returns true if the frame detector has synced on the data stream. ///< Returns true if the frame detector has synced on the data stream.
bool NewPayload(void) { return newPayload; }
///< Returns true if the data given to the last call to Analyze() started a
///< new payload. The caller should remember the current file offset in
///< order to be able to generate an index entry later, when NewFrame()
///< returns true.
bool NewFrame(void) { return newFrame; } bool NewFrame(void) { return newFrame; }
///< Returns true if the data given to the last call to Analyze() started a ///< Returns true if the data given to the last call to Analyze() started a
///< new frame. ///< new frame.

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: skinclassic.c 2.5 2010/11/07 15:10:23 kls Exp $ * $Id: skinclassic.c 2.6 2011/08/21 11:02:06 kls Exp $
*/ */
#include "skinclassic.h" #include "skinclassic.h"
@ -377,7 +377,7 @@ void cSkinClassicDisplayMenu::SetRecording(const cRecording *Recording)
int y = y2; int y = y2;
cTextScroller ts; cTextScroller ts;
char t[32]; char t[32];
snprintf(t, sizeof(t), "%s %s", *DateString(Recording->start), *TimeString(Recording->start)); 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)); ts.Set(osd, x1, y, x2 - x1, y3 - y, t, font, Theme.Color(clrMenuEventTime), Theme.Color(clrBackground));
y += ts.Height(); y += ts.Height();
if (Info->GetEvent()->ParentalRating()) { if (Info->GetEvent()->ParentalRating()) {

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: skins.c 2.2 2011/08/06 09:41:57 kls Exp $ * $Id: skins.c 2.3 2011/08/21 11:21:19 kls Exp $
*/ */
#include "skins.h" #include "skins.h"
@ -136,14 +136,14 @@ cSkinDisplayReplay::cProgressBar::cProgressBar(int Width, int Height, int Curren
if (Marks) { if (Marks) {
bool Start = true; bool Start = true;
for (const cMark *m = Marks->First(); m; m = Marks->Next(m)) { for (const cMark *m = Marks->First(); m; m = Marks->Next(m)) {
int p1 = Pos(m->position); int p1 = Pos(m->Position());
if (Start) { if (Start) {
const cMark *m2 = Marks->Next(m); const cMark *m2 = Marks->Next(m);
int p2 = Pos(m2 ? m2->position : total); int p2 = Pos(m2 ? m2->Position() : total);
int h = Height / 3; int h = Height / 3;
DrawRectangle(p1, h, p2, Height - h, ColorSelected); DrawRectangle(p1, h, p2, Height - h, ColorSelected);
} }
Mark(p1, Start, m->position == Current, ColorMark, ColorCurrent); Mark(p1, Start, m->Position() == Current, ColorMark, ColorCurrent);
Start = !Start; Start = !Start;
} }
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: skinsttng.c 2.10 2011/06/12 15:20:59 kls Exp $ * $Id: skinsttng.c 2.11 2011/08/21 11:02:26 kls Exp $
*/ */
// Star Trek: The Next Generation® is a registered trademark of Paramount Pictures // Star Trek: The Next Generation® is a registered trademark of Paramount Pictures
@ -693,7 +693,7 @@ void cSkinSTTNGDisplayMenu::SetRecording(const cRecording *Recording)
int y = y3; int y = y3;
cTextScroller ts; cTextScroller ts;
char t[32]; char t[32];
snprintf(t, sizeof(t), "%s %s", *DateString(Recording->start), *TimeString(Recording->start)); 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)); ts.Set(osd, xl, y, x4 - xl, y4 - y, t, font, Theme.Color(clrMenuEventTime), Theme.Color(clrBackground));
y += ts.Height(); y += ts.Height();
if (Info->GetEvent()->ParentalRating()) { if (Info->GetEvent()->ParentalRating()) {

33
svdrp.c
View File

@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured * and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection. * graphical interface that sits on top of an SVDRP connection.
* *
* $Id: svdrp.c 2.9 2011/02/25 14:38:45 kls Exp $ * $Id: svdrp.c 2.10 2011/08/27 10:43:18 kls Exp $
*/ */
#include "svdrp.h" #include "svdrp.h"
@ -219,9 +219,11 @@ const char *HelpPages[] = {
" image format defaults to JPEG.", " image format defaults to JPEG.",
"HELP [ <topic> ]\n" "HELP [ <topic> ]\n"
" The HELP command gives help info.", " The HELP command gives help info.",
"HITK [ <key> ]\n" "HITK [ <key> ... ]\n"
" Hit the given remote control key. Without option a list of all\n" " Hit the given remote control key. Without option a list of all\n"
" valid key names is given.", " valid key names is given. If more than one key is given, they are\n"
" entered into the remote control queue in the given sequence. There\n"
" can be up to 31 keys.",
"LSTC [ :groups | <number> | <name> ]\n" "LSTC [ :groups | <number> | <name> ]\n"
" List channels. Without option, all channels are listed. Otherwise\n" " List channels. Without option, all channels are listed. Otherwise\n"
" only the given channel is listed. If a name is given, all channels\n" " only the given channel is listed. If a name is given, all channels\n"
@ -902,13 +904,28 @@ void cSVDRP::CmdHELP(const char *Option)
void cSVDRP::CmdHITK(const char *Option) void cSVDRP::CmdHITK(const char *Option)
{ {
if (*Option) { if (*Option) {
eKeys k = cKey::FromString(Option); char buf[strlen(Option) + 1];
strcpy(buf, Option);
const char *delim = " \t";
char *strtok_next;
char *p = strtok_r(buf, delim, &strtok_next);
int NumKeys = 0;
while (p) {
eKeys k = cKey::FromString(p);
if (k != kNone) { if (k != kNone) {
cRemote::Put(k); if (!cRemote::Put(k)) {
Reply(250, "Key \"%s\" accepted", Option); Reply(451, "Too many keys in \"%s\" (only %d accepted)", Option, NumKeys);
return;
} }
else }
Reply(504, "Unknown key: \"%s\"", Option); else {
Reply(504, "Unknown key: \"%s\"", p);
return;
}
NumKeys++;
p = strtok_r(NULL, delim, &strtok_next);
}
Reply(250, "Key%s \"%s\" accepted", NumKeys > 1 ? "s" : "", Option);
} }
else { else {
Reply(-214, "Valid <key> names for the HITK command:"); Reply(-214, "Valid <key> names for the HITK command:");

13
vdr.5
View File

@ -8,7 +8,7 @@
.\" License as specified in the file COPYING that comes with the .\" License as specified in the file COPYING that comes with the
.\" vdr distribution. .\" vdr distribution.
.\" .\"
.\" $Id: vdr.5 2.22 2011/04/03 10:21:36 kls Exp $ .\" $Id: vdr.5 2.23 2011/08/21 14:06:50 kls Exp $
.\" .\"
.TH vdr 5 "10 Feb 2008" "1.6" "Video Disk Recorder Files" .TH vdr 5 "10 Feb 2008" "1.6" "Video Disk Recorder Files"
.SH NAME .SH NAME
@ -214,6 +214,17 @@ if there is an audio type.
.TP .TP
.B TPID .B TPID
The teletext PID. The teletext PID.
If this channel also carries DVB subtitles, the DVB subtitling PIDs follow the
teletext PID, separated by a semicolon, as in
.B ...:201;2001,2002:...
If certain subtitling PIDs broadcast in specific languages, the language
codes for these can be appended to the individual subtitling PID, separated
by an '=' sign, as in
.B ...:201;2001=deu,2002=eng:...
.TP .TP
.B Conditional access .B Conditional access
A hexadecimal integer defining how this channel can be accessed: A hexadecimal integer defining how this channel can be accessed: