diff options
65 files changed, 842 insertions, 451 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 2aa2c21..be533c1 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -743,6 +743,7 @@ Steffen Barszus <st_barszus@gmx.de> for helping to debug a crash when using the --terminal option without having access to the given terminal 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> 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 reporting that DELETENULL() was not thread safe 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> 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" for suggesting a fix for a bug in handling DiSEqC codes 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> 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 overwritten in case a recording was interrupted and resumed, and the fps value 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> for adding cRecordingInfo::GetEvent() @@ -2760,3 +2771,6 @@ Mark Hawes <MARK.HAWES@au.fujitsu.com> Frank Niederwipper <f.niederwipper@gmail.com> for reporting a problem in timer handling in case a recording directory can't be created + +Chris Mayo <aklhfex@gmail.com> + for reporting a problem with detecting frames on radio channels @@ -6698,3 +6698,47 @@ Video Disk Recorder Revision History - 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 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. diff --git a/PLUGINS/src/dvbhddevice/dvbhddevice.c b/PLUGINS/src/dvbhddevice/dvbhddevice.c index 4745c37..0ad1698 100644 --- a/PLUGINS/src/dvbhddevice/dvbhddevice.c +++ b/PLUGINS/src/dvbhddevice/dvbhddevice.c @@ -3,7 +3,7 @@ * * 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> @@ -11,7 +11,7 @@ #include "setup.h" 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 { private: @@ -20,7 +20,7 @@ public: cPluginDvbhddevice(void); virtual ~cPluginDvbhddevice(); 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 bool SetupParse(const char *Name, const char *Value); }; diff --git a/PLUGINS/src/dvbhddevice/dvbhdffdevice.c b/PLUGINS/src/dvbhddevice/dvbhdffdevice.c index 714769e..ff3f953 100644 --- a/PLUGINS/src/dvbhddevice/dvbhdffdevice.c +++ b/PLUGINS/src/dvbhddevice/dvbhdffdevice.c @@ -3,7 +3,7 @@ * * 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" @@ -54,6 +54,7 @@ cDvbHdFfDevice::cDvbHdFfDevice(int Adapter, int Frontend) hdmiConfig.TransmitAudio = true; hdmiConfig.ForceDviMode = false; hdmiConfig.CecEnabled = gHdffSetup.CecEnabled; + hdmiConfig.VideoModeAdaption = (HDFF::eVideoModeAdaption) gHdffSetup.VideoModeAdaption; mHdffCmdIf->CmdHdmiConfigure(&hdmiConfig); if (gHdffSetup.CecEnabled) mHdffCmdIf->CmdHdmiSendCecCommand(HDFF::cecCommandTvOn); @@ -110,7 +111,7 @@ void cDvbHdFfDevice::SetVideoFormat(bool VideoFormat16_9) { HDFF::tVideoFormat videoFormat; videoFormat.AutomaticEnabled = true; - videoFormat.AfdEnabled = false; + videoFormat.AfdEnabled = true; videoFormat.TvFormat = (HDFF::eTvFormat) gHdffSetup.TvFormat; videoFormat.VideoConversion = (HDFF::eVideoConversion) gHdffSetup.VideoConversion; mHdffCmdIf->CmdAvSetVideoFormat(0, &videoFormat); @@ -729,10 +730,25 @@ bool cDvbHdFfDeviceProbe::Probe(int Adapter, int Frontend) 0x13C2300A, // Technotrend S2-6400 HDFF production version 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++) { 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); if (fd != -1) { //TODO treat the second path of the S2-6400 as a budget device close(fd); diff --git a/PLUGINS/src/dvbhddevice/hdffcmd.c b/PLUGINS/src/dvbhddevice/hdffcmd.c index 82869df..60ad70e 100644 --- a/PLUGINS/src/dvbhddevice/hdffcmd.c +++ b/PLUGINS/src/dvbhddevice/hdffcmd.c @@ -3,7 +3,7 @@ * * 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" @@ -1089,6 +1089,7 @@ void cHdffCmdIf::CmdHdmiConfigure(const tHdmiConfig * pConfig) { cmdBuf.SetBits(1, 0); } + cmdBuf.SetBits(3, (uint32_t) pConfig->VideoModeAdaption); osd_cmd.cmd_len = CmdSetLength(cmdBuf); ioctl(mOsdDev, OSD_RAW_CMD, &osd_cmd); } diff --git a/PLUGINS/src/dvbhddevice/hdffmsgdef.h b/PLUGINS/src/dvbhddevice/hdffmsgdef.h index a6c3f4b..d63e88a 100644 --- a/PLUGINS/src/dvbhddevice/hdffmsgdef.h +++ b/PLUGINS/src/dvbhddevice/hdffmsgdef.h @@ -3,7 +3,7 @@ * * 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_ @@ -274,6 +274,14 @@ typedef enum _eHdmiVideoMode videoModeMaxValue } eHdmiVideoMode; +typedef enum _eVideoModeAdaption +{ + videoModeAdaptOff, + videoModeAdaptFrameRate, + videoModeAdaptOnlyForHd, + videoModeAdaptAlways +} eVideoModeAdaption; + typedef enum _eCecCommand { cecCommandTvOn, @@ -287,6 +295,7 @@ typedef struct _tHdmiConfig bool TransmitAudio; bool ForceDviMode; bool CecEnabled; + eVideoModeAdaption VideoModeAdaption; } tHdmiConfig; // Remote control definitions diff --git a/PLUGINS/src/dvbhddevice/po/de_DE.po b/PLUGINS/src/dvbhddevice/po/de_DE.po index 907f243..78ace1b 100644 --- a/PLUGINS/src/dvbhddevice/po/de_DE.po +++ b/PLUGINS/src/dvbhddevice/po/de_DE.po @@ -7,15 +7,30 @@ msgid "" msgstr "" "Project-Id-Version: VDR \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" "Last-Translator: Christoph Haubrich\n" "Language-Team: <see README>\n" -"Language: \n" +"Language: de\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 "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" msgstr "automatisch" @@ -40,9 +55,6 @@ msgstr "abgeschaltet" msgid "Analogue only" msgstr "nur Analoge Ausgänge" -msgid "Always" -msgstr "immer" - msgid "HDMI only" msgstr "nur HDMI" @@ -55,6 +67,9 @@ msgstr "keins" msgid "Resolution" msgstr "Auflösung" +msgid "Video Mode Adaption" +msgstr "Auflösungsanpassung" + msgid "TV format" msgstr "TV-Format" diff --git a/PLUGINS/src/dvbhddevice/po/fi_FI.po b/PLUGINS/src/dvbhddevice/po/fi_FI.po new file mode 100644 index 0000000..db8ef0b --- /dev/null +++ b/PLUGINS/src/dvbhddevice/po/fi_FI.po @@ -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" diff --git a/PLUGINS/src/dvbhddevice/po/it_IT.po b/PLUGINS/src/dvbhddevice/po/it_IT.po index a328312..bafb2c5 100644 --- a/PLUGINS/src/dvbhddevice/po/it_IT.po +++ b/PLUGINS/src/dvbhddevice/po/it_IT.po @@ -7,11 +7,11 @@ msgid "" msgstr "" "Project-Id-Version: VDR\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" "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" "Language-Team: <see README>\n" -"Language: \n" +"Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,6 +19,21 @@ msgstr "" "X-Poedit-Country: ITALY\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" msgstr "Automatica" @@ -43,9 +58,6 @@ msgstr "Disabilitata" msgid "Analogue only" msgstr "Solo analogica" -msgid "Always" -msgstr "Sempre" - msgid "HDMI only" msgstr "Solo HDMI" @@ -58,6 +70,9 @@ msgstr "nessuna" msgid "Resolution" msgstr "Risoluzione" +msgid "Video Mode Adaption" +msgstr "" + msgid "TV format" msgstr "Formato TV" @@ -90,4 +105,3 @@ msgstr "OSD alto livello" msgid "Allow True Color OSD" msgstr "Permetti OSD True Color" - diff --git a/PLUGINS/src/dvbhddevice/setup.c b/PLUGINS/src/dvbhddevice/setup.c index 30365e0..6e41860 100644 --- a/PLUGINS/src/dvbhddevice/setup.c +++ b/PLUGINS/src/dvbhddevice/setup.c @@ -3,7 +3,7 @@ * * 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" @@ -20,6 +20,7 @@ cHdffSetup gHdffSetup; cHdffSetup::cHdffSetup(void) { Resolution = kResolution1080i; + VideoModeAdaption = HDFF::videoModeAdaptOff; TvFormat = HDFF::tvFormat16by9; VideoConversion = HDFF::videoConversionPillarbox; AnalogueVideo = HDFF::videoOutCvbsYuv; @@ -35,18 +36,19 @@ cHdffSetup::cHdffSetup(void) bool cHdffSetup::SetupParse(const char *Name, const char *Value) { - if (strcmp(Name, "Resolution") == 0) Resolution = atoi(Value); - else if (strcmp(Name, "TvFormat") == 0) TvFormat = atoi(Value); - else if (strcmp(Name, "VideoConversion") == 0) VideoConversion = atoi(Value); - else if (strcmp(Name, "AnalogueVideo") == 0) AnalogueVideo = atoi(Value); - else if (strcmp(Name, "AudioDelay") == 0) AudioDelay = atoi(Value); - else if (strcmp(Name, "AudioDownmix") == 0) AudioDownmix = atoi(Value); - else if (strcmp(Name, "OsdSize") == 0) OsdSize = atoi(Value); - else if (strcmp(Name, "CecEnabled") == 0) CecEnabled = atoi(Value); - else if (strcmp(Name, "RemoteProtocol") == 0) RemoteProtocol = atoi(Value); - else if (strcmp(Name, "RemoteAddress") == 0) RemoteAddress = atoi(Value); - else if (strcmp(Name, "HighLevelOsd") == 0) HighLevelOsd = atoi(Value); - else if (strcmp(Name, "TrueColorOsd") == 0) TrueColorOsd = 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, "VideoConversion") == 0) VideoConversion = atoi(Value); + else if (strcmp(Name, "AnalogueVideo") == 0) AnalogueVideo = atoi(Value); + else if (strcmp(Name, "AudioDelay") == 0) AudioDelay = atoi(Value); + else if (strcmp(Name, "AudioDownmix") == 0) AudioDownmix = atoi(Value); + else if (strcmp(Name, "OsdSize") == 0) OsdSize = atoi(Value); + else if (strcmp(Name, "CecEnabled") == 0) CecEnabled = atoi(Value); + else if (strcmp(Name, "RemoteProtocol") == 0) RemoteProtocol = atoi(Value); + else if (strcmp(Name, "RemoteAddress") == 0) RemoteAddress = atoi(Value); + else if (strcmp(Name, "HighLevelOsd") == 0) HighLevelOsd = atoi(Value); + else if (strcmp(Name, "TrueColorOsd") == 0) TrueColorOsd = atoi(Value); else return false; return true; } @@ -113,6 +115,7 @@ HDFF::eHdmiVideoMode cHdffSetup::GetVideoMode(void) cHdffSetupPage::cHdffSetupPage(HDFF::cHdffCmdIf * pHdffCmdIf) { const int kResolutions = 4; + const int kVideoModeAdaptions = 4; const int kTvFormats = 2; const int kVideoConversions = 6; const int kAnalogueVideos = 4; @@ -128,6 +131,14 @@ cHdffSetupPage::cHdffSetupPage(HDFF::cHdffCmdIf * pHdffCmdIf) "576i", }; + static const char * VideoModeAdaptionItems[kVideoModeAdaptions] = + { + tr("Off"), + tr("Frame rate"), + tr("HD Only"), + tr("Always") + }; + static const char * TvFormatItems[kTvFormats] = { "4/3", @@ -182,6 +193,7 @@ cHdffSetupPage::cHdffSetupPage(HDFF::cHdffCmdIf * pHdffCmdIf) mNewHdffSetup = gHdffSetup; 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("Video Conversion"), &mNewHdffSetup.VideoConversion, kVideoConversions, VideoConversionItems)); Add(new cMenuEditStraItem(tr("Analogue Video"), &mNewHdffSetup.AnalogueVideo, kAnalogueVideos, AnalogueVideoItems)); @@ -202,6 +214,7 @@ cHdffSetupPage::~cHdffSetupPage(void) void cHdffSetupPage::Store(void) { SetupStore("Resolution", mNewHdffSetup.Resolution); + SetupStore("VideoModeAdaption", mNewHdffSetup.VideoModeAdaption); SetupStore("TvFormat", mNewHdffSetup.TvFormat); SetupStore("VideoConversion", mNewHdffSetup.VideoConversion); SetupStore("AnalogueVideo", mNewHdffSetup.AnalogueVideo); @@ -237,6 +250,7 @@ void cHdffSetupPage::Store(void) hdmiConfig.TransmitAudio = true; hdmiConfig.ForceDviMode = false; hdmiConfig.CecEnabled = mNewHdffSetup.CecEnabled; + hdmiConfig.VideoModeAdaption = (HDFF::eVideoModeAdaption) mNewHdffSetup.VideoModeAdaption; mHdffCmdIf->CmdHdmiConfigure(&hdmiConfig); mHdffCmdIf->CmdRemoteSetProtocol((HDFF::eRemoteProtocol) mNewHdffSetup.RemoteProtocol); diff --git a/PLUGINS/src/dvbhddevice/setup.h b/PLUGINS/src/dvbhddevice/setup.h index 07c9d1a..c3fe7a6 100644 --- a/PLUGINS/src/dvbhddevice/setup.h +++ b/PLUGINS/src/dvbhddevice/setup.h @@ -3,7 +3,7 @@ * * 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_ @@ -20,6 +20,7 @@ struct cHdffSetup HDFF::eHdmiVideoMode GetVideoMode(void); int Resolution; + int VideoModeAdaption; int TvFormat; int VideoConversion; int AnalogueVideo; diff --git a/PLUGINS/src/dvbsddevice/HISTORY b/PLUGINS/src/dvbsddevice/HISTORY index 9672f6f..229e35b 100644 --- a/PLUGINS/src/dvbsddevice/HISTORY +++ b/PLUGINS/src/dvbsddevice/HISTORY @@ -19,3 +19,7 @@ VDR Plugin 'dvbsddevice' Revision History 2011-04-17: Version 0.0.4 - 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). diff --git a/PLUGINS/src/dvbsddevice/dvbsddevice.c b/PLUGINS/src/dvbsddevice/dvbsddevice.c index 6f042d8..2aa8c77 100644 --- a/PLUGINS/src/dvbsddevice/dvbsddevice.c +++ b/PLUGINS/src/dvbsddevice/dvbsddevice.c @@ -3,13 +3,14 @@ * * 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 "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"; class cPluginDvbsddevice : public cPlugin { @@ -20,6 +21,8 @@ public: virtual ~cPluginDvbsddevice(); virtual const char *Version(void) { return VERSION; } virtual const char *Description(void) { return DESCRIPTION; } + virtual const char *CommandLineHelp(void); + virtual bool ProcessArgs(int argc, char *argv[]); }; cPluginDvbsddevice::cPluginDvbsddevice(void) @@ -32,4 +35,27 @@ cPluginDvbsddevice::~cPluginDvbsddevice() 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! diff --git a/PLUGINS/src/dvbsddevice/dvbsdffdevice.c b/PLUGINS/src/dvbsddevice/dvbsdffdevice.c index 73e55ba..17f842b 100644 --- a/PLUGINS/src/dvbsddevice/dvbsdffdevice.c +++ b/PLUGINS/src/dvbsddevice/dvbsdffdevice.c @@ -3,7 +3,7 @@ * * 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" @@ -23,12 +23,13 @@ int cDvbSdFfDevice::devVideoOffset = -1; -cDvbSdFfDevice::cDvbSdFfDevice(int Adapter, int Frontend) +cDvbSdFfDevice::cDvbSdFfDevice(int Adapter, int Frontend, bool OutputOnly) :cDvbDevice(Adapter, Frontend) { spuDecoder = NULL; digitalAudio = false; playMode = pmNone; + outputOnly = OutputOnly; // Devices that are only present on cards with decoders: @@ -357,6 +358,14 @@ bool cDvbSdFfDevice::SetPid(cPidHandle *Handle, int Type, bool On) return true; } +bool cDvbSdFfDevice::ProvidesSource(int Source) const +{ + if (outputOnly) + return false; + else + return cDvbDevice::ProvidesSource(Source); +} + void cDvbSdFfDevice::TurnOffLiveMode(bool LiveView) { if (LiveView) { @@ -761,6 +770,11 @@ int cDvbSdFfDevice::PlayTsAudio(const uchar *Data, int Length) // --- cDvbSdFfDeviceProbe --------------------------------------------------- +cDvbSdFfDeviceProbe::cDvbSdFfDeviceProbe(void) +{ + outputOnly = false; +} + bool cDvbSdFfDeviceProbe::Probe(int Adapter, int Frontend) { static uint32_t SubsystemIds[] = { @@ -781,7 +795,7 @@ bool cDvbSdFfDeviceProbe::Probe(int Adapter, int Frontend) for (uint32_t *sid = SubsystemIds; *sid; sid++) { if (*sid == SubsystemId) { dsyslog("creating cDvbSdFfDevice"); - new cDvbSdFfDevice(Adapter, Frontend); + new cDvbSdFfDevice(Adapter, Frontend, outputOnly); return true; } } diff --git a/PLUGINS/src/dvbsddevice/dvbsdffdevice.h b/PLUGINS/src/dvbsddevice/dvbsdffdevice.h index afe4727..bd74cde 100644 --- a/PLUGINS/src/dvbsddevice/dvbsdffdevice.h +++ b/PLUGINS/src/dvbsddevice/dvbsdffdevice.h @@ -3,7 +3,7 @@ * * 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 @@ -17,10 +17,11 @@ class cDvbSdFfDevice : public cDvbDevice { private: int fd_osd, fd_audio, fd_video, fd_stc; + bool outputOnly; protected: virtual void MakePrimaryDevice(bool On); public: - cDvbSdFfDevice(int Adapter, int Frontend); + cDvbSdFfDevice(int Adapter, int Frontend, bool OutputOnly); virtual ~cDvbSdFfDevice(); virtual bool HasDecoder(void) const; virtual bool AvoidRecording(void) const; @@ -34,6 +35,8 @@ public: // Channel facilities +public: + virtual bool ProvidesSource(int Source) const; private: void TurnOffLiveMode(bool LiveView); protected: @@ -101,7 +104,11 @@ public: }; class cDvbSdFfDeviceProbe : public cDvbDeviceProbe { +private: + bool outputOnly; public: + cDvbSdFfDeviceProbe(void); + void SetOutputOnly(bool On) { outputOnly = On; } virtual bool Probe(int Adapter, int Frontend); }; diff --git a/PLUGINS/src/skincurses/skincurses.c b/PLUGINS/src/skincurses/skincurses.c index 11fead5..74166b3 100644 --- a/PLUGINS/src/skincurses/skincurses.c +++ b/PLUGINS/src/skincurses/skincurses.c @@ -3,7 +3,7 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: skincurses.c 2.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> @@ -436,7 +436,7 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording) int y = 2; cTextScroller ts; 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); y += ts.Height(); if (Info->GetEvent()->ParentalRating()) { @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * 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" @@ -497,8 +497,8 @@ cString cChannel::ToText(const cChannel *Channel) if (Channel->vpid && Channel->vtype) q += snprintf(q, sizeof(vpidbuf) - (q - vpidbuf), "=%d", Channel->vtype); *q = 0; - const int BufferSize = (MAXAPIDS + MAXDPIDS) * (5 + 1 + MAXLANGCODE2 + 5) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod+cod@type', +10: paranoia - char apidbuf[BufferSize]; + const int ABufferSize = (MAXAPIDS + MAXDPIDS) * (5 + 1 + MAXLANGCODE2 + 5) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod+cod@type', +10: paranoia + char apidbuf[ABufferSize]; q = apidbuf; q += IntArrayToString(q, Channel->apids, 10, Channel->alangs, Channel->atypes); 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 = 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 q = caidbuf; q += IntArrayToString(q, Channel->caids, 16); *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; } @@ -544,14 +552,17 @@ bool cChannel::Parse(const char *s) char *parambuf = NULL; char *vpidbuf = NULL; char *apidbuf = NULL; + char *tpidbuf = NULL; char *caidbuf = NULL; - int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%d :%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, ¶mbuf, &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, ¶mbuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpidbuf, &caidbuf, &sid, &nid, &tid, &rid); if (fields >= 9) { if (fields == 9) { // allow reading of old format sid = atoi(caidbuf); delete caidbuf; caidbuf = NULL; + if (sscanf(tpidbuf, "%d", &tpid) != 1) + return false; caids[0] = tpid; caids[1] = 0; tpid = 0; @@ -562,6 +573,7 @@ bool cChannel::Parse(const char *s) atypes[0] = 0; dpids[0] = 0; dtypes[0] = 0; + spids[0] = 0; ok = false; if (parambuf && sourcebuf && vpidbuf && apidbuf) { parameters = parambuf; @@ -644,7 +656,30 @@ bool cChannel::Parse(const char *s) dpids[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) { char *p = caidbuf; char *q; @@ -681,6 +716,7 @@ bool cChannel::Parse(const char *s) free(sourcebuf); free(vpidbuf); free(apidbuf); + free(tpidbuf); free(caidbuf); free(namebuf); if (!GetChannelID().Valid()) { @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * 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" @@ -395,7 +395,7 @@ cSetup::cSetup(void) CurrentChannel = -1; CurrentVolume = MAXVOLUME; CurrentDolby = 0; - // InitialChannel is initialized by constructor + InitialChannel = ""; InitialVolume = -1; ChannelsWrap = 0; EmergencyExit = 1; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * 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 @@ -22,13 +22,13 @@ // VDR's own version number: -#define VDRVERSION "1.7.20" -#define VDRVERSNUM 10720 // Version * 10000 + Major * 100 + Minor +#define VDRVERSION "1.7.21" +#define VDRVERSNUM 10721 // Version * 10000 + Major * 100 + Minor // The plugin API's version number: -#define APIVERSION "1.7.20" -#define APIVERSNUM 10720 // Version * 10000 + Major * 100 + Minor +#define APIVERSION "1.7.21" +#define APIVERSNUM 10721 // Version * 10000 + Major * 100 + Minor // When loading plugins, VDR searches them by their APIVERSION, which // may be smaller than VDRVERSION in case there have been no changes to @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: cutter.c 2.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" @@ -75,7 +75,7 @@ void cCuttingThread::Action(void) if (!fromFile || !toFile) return; fromFile->SetReadAhead(MEGABYTE(20)); - int Index = Mark->position; + int Index = Mark->Position(); Mark = fromMarks.Next(Mark); off_t FileSize = 0; int CurrentFileNumber = 0; @@ -163,14 +163,14 @@ void cCuttingThread::Action(void) // Check editing marks: - if (Mark && Index >= Mark->position) { + if (Mark && Index >= Mark->Position()) { Mark = fromMarks.Next(Mark); toMarks.Add(LastIFrame); if (Mark) toMarks.Add(toIndex->Last() + 1); toMarks.Save(); if (Mark) { - Index = Mark->position; + Index = Mark->Position(); Mark = fromMarks.Next(Mark); CurrentFileNumber = 0; // triggers SetOffset before reading next frame cutIn = true; @@ -208,6 +208,12 @@ bool cCutter::Start(const char *FileName) error = false; ended = false; 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('%'); if (evn && RemoveVideoFile(evn) && MakeDirs(evn, true)) { // XXX this can be removed once RenameVideoFile() follows symlinks (see videodir.c) @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 2.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" @@ -613,6 +613,11 @@ bool cDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Needs return false; } +bool cDevice::ProvidesEIT(void) const +{ + return false; +} + int cDevice::NumProvidedSystems(void) const { return 0; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * 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 @@ -247,6 +247,10 @@ public: ///< function itself actually returns true. ///< The default implementation always returns false, so a derived cDevice ///< 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; ///< Returns the number of individual "delivery systems" this device provides. ///< The default implementation returns 0, so any derived class that can diff --git a/dvbdevice.c b/dvbdevice.c index b0750dd..a97f274 100644 --- a/dvbdevice.c +++ b/dvbdevice.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * 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" @@ -1081,6 +1081,11 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne return result; } +bool cDvbDevice::ProvidesEIT(void) const +{ + return dvbTuner != NULL; +} + int cDvbDevice::NumProvidedSystems(void) const { return numProvidedSystems; diff --git a/dvbdevice.h b/dvbdevice.h index 0962548..e1842b7 100644 --- a/dvbdevice.h +++ b/dvbdevice.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * 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 @@ -140,6 +140,7 @@ public: virtual bool ProvidesSource(int Source) const; virtual bool ProvidesTransponder(const cChannel *Channel) 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 SignalStrength(void) const; virtual int SignalQuality(void) const; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * 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" @@ -143,7 +143,7 @@ void cEITScanner::Process(void) bool AnyDeviceSwitched = false; for (int i = 0; i < cDevice::NumDevices(); i++) { cDevice *Device = cDevice::GetDevice(i); - if (Device) { + if (Device && Device->ProvidesEIT()) { for (cScanData *ScanData = scanList->First(); ScanData; ScanData = scanList->Next(ScanData)) { const cChannel *Channel = ScanData->GetChannel(); if (Channel) { diff --git a/epg.data b/epg.data deleted file mode 100644 index e69de29..0000000 --- a/epg.data +++ /dev/null @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * 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" @@ -2193,13 +2193,13 @@ void cMenuRecordingItem::IncrementCounter(bool New) totalEntries++; if (New) 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(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; level = Setup.RecordingDirs ? Level : -1; @@ -2770,6 +2770,7 @@ cMenuSetupDVB::cMenuSetupDVB(void) updateChannelsTexts[5] = tr("add new transponders"); SetSection(tr("DVB")); + SetHelp(NULL, tr("Button$Audio"), tr("Button$Subtitles"), NULL); Setup(); } @@ -2815,46 +2816,56 @@ eOSState cMenuSetupDVB::ProcessKey(eKeys Key) eOSState state = cMenuSetupBase::ProcessKey(Key); if (Key != kNone) { - bool DoSetup = data.VideoFormat != newVideoFormat; - DoSetup |= data.DisplaySubtitles != newDisplaySubtitles; - if (numAudioLanguages != oldnumAudioLanguages) { - for (int i = oldnumAudioLanguages; i < numAudioLanguages; i++) { - data.AudioLanguages[i] = 0; - for (int l = 0; l < I18nLanguages()->Size(); l++) { - int k; - for (k = 0; k < oldnumAudioLanguages; k++) { - if (data.AudioLanguages[k] == l) - break; - } - if (k >= oldnumAudioLanguages) { - data.AudioLanguages[i] = l; - break; + 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; + DoSetup |= data.DisplaySubtitles != newDisplaySubtitles; + if (numAudioLanguages != oldnumAudioLanguages) { + for (int i = oldnumAudioLanguages; i < numAudioLanguages; i++) { + data.AudioLanguages[i] = 0; + for (int l = 0; l < I18nLanguages()->Size(); l++) { + int k; + for (k = 0; k < oldnumAudioLanguages; k++) { + if (data.AudioLanguages[k] == l) + break; + } + if (k >= oldnumAudioLanguages) { + data.AudioLanguages[i] = l; + break; + } + } } - } - } - data.AudioLanguages[numAudioLanguages] = -1; - DoSetup = true; - } - if (numSubtitleLanguages != oldnumSubtitleLanguages) { - for (int i = oldnumSubtitleLanguages; i < numSubtitleLanguages; i++) { - data.SubtitleLanguages[i] = 0; - for (int l = 0; l < I18nLanguages()->Size(); l++) { - int k; - for (k = 0; k < oldnumSubtitleLanguages; k++) { - if (data.SubtitleLanguages[k] == l) - break; - } - if (k >= oldnumSubtitleLanguages) { - data.SubtitleLanguages[i] = l; - break; + data.AudioLanguages[numAudioLanguages] = -1; + DoSetup = true; + } + if (numSubtitleLanguages != oldnumSubtitleLanguages) { + for (int i = oldnumSubtitleLanguages; i < numSubtitleLanguages; i++) { + data.SubtitleLanguages[i] = 0; + for (int l = 0; l < I18nLanguages()->Size(); l++) { + int k; + for (k = 0; k < oldnumSubtitleLanguages; k++) { + if (data.SubtitleLanguages[k] == l) + break; + } + if (k >= oldnumSubtitleLanguages) { + data.SubtitleLanguages[i] = l; + break; + } + } } - } + data.SubtitleLanguages[numSubtitleLanguages] = -1; + DoSetup = true; + } + if (DoSetup) + Setup(); } - data.SubtitleLanguages[numSubtitleLanguages] = -1; - DoSetup = true; - } - if (DoSetup) - Setup(); + } } if (state == osBack && Key == kOk) { if (::Setup.PrimaryDVB != oldPrimaryDVB) @@ -4667,7 +4678,7 @@ void cReplayControl::MarkJump(bool Forward) if (GetIndex(Current, Total)) { cMark *m = Forward ? marks.GetNext(Current) : marks.GetPrev(Current); if (m) { - Goto(m->position, true); + Goto(m->Position(), true); displayFrames = true; } } @@ -4684,14 +4695,15 @@ void cReplayControl::MarkMove(bool Forward) int p = SkipFrames(Forward ? 1 : -1); cMark *m2; if (Forward) { - if ((m2 = marks.Next(m)) != NULL && m2->position <= p) + if ((m2 = marks.Next(m)) != NULL && m2->Position() <= p) return; } else { - if ((m2 = marks.Prev(m)) != NULL && m2->position >= p) + if ((m2 = marks.Prev(m)) != NULL && m2->Position() >= p) return; } - Goto(m->position = p, true); + m->SetPosition(p); + Goto(m->Position(), true); marks.Save(); } } @@ -4726,7 +4738,7 @@ void cReplayControl::EditTest(void) if ((m->Index() & 0x01) != 0) m = marks.Next(m); if (m) { - Goto(m->position - SecondsToFrames(3, FramesPerSecond())); + Goto(m->Position() - SecondsToFrames(3, FramesPerSecond())); Play(); } } @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.7.0\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" "Last-Translator: Osama Alrawab <alrawab@hotmail.com>\n" "Language-Team: Arabic <ar@li.org>\n" @@ -923,6 +923,12 @@ msgstr "اضافة مصدر قنوات جديد" msgid "DVB" msgstr "الدى فى بى" +msgid "Button$Audio" +msgstr "الصوت" + +msgid "Button$Subtitles" +msgstr "الترجمة" + msgid "Setup.DVB$Primary DVB interface" msgstr "كرت الستالايت الاولى" @@ -1156,9 +1162,6 @@ msgstr "" msgid " Stop replaying" msgstr " ايقاف الاعادة" -msgid "Button$Audio" -msgstr "الصوت" - msgid "Button$Pause" msgstr "طمس" @@ -1184,9 +1187,6 @@ msgstr "لا يوجد صوت متاح" msgid "No subtitles" msgstr "لا توجد ترجمة متاحة" -msgid "Button$Subtitles" -msgstr "الترجمة" - msgid "No subtitles available!" msgstr "لا ترجمة متاحة" diff --git a/po/ca_ES.po b/po/ca_ES.po index 835f93d..b104fea 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Luca Olivetti <luca@ventoso.org>\n" "Language-Team: Catalan <vdr@linuxtv.org>\n" @@ -905,6 +905,12 @@ msgstr "afegir nous transponders" msgid "DVB" msgstr "Tarja DVB" +msgid "Button$Audio" +msgstr "udio" + +msgid "Button$Subtitles" +msgstr "Subttols" + msgid "Setup.DVB$Primary DVB interface" msgstr "Tarja DVB primria" @@ -1132,9 +1138,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Aturar la reproducci" -msgid "Button$Audio" -msgstr "udio" - msgid "Button$Pause" msgstr "Pausa" @@ -1160,9 +1163,6 @@ msgstr "No hi ha udio disponible!" msgid "No subtitles" msgstr "Sense subttols" -msgid "Button$Subtitles" -msgstr "Subttols" - msgid "No subtitles available!" msgstr "No hi ha subttols disponibles!" diff --git a/po/cs_CZ.po b/po/cs_CZ.po index e6ebdfd..bcafac7 100644 --- a/po/cs_CZ.po +++ b/po/cs_CZ.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.7.14\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" "Last-Translator: Radek Šťastný <dedkus@gmail.com>\n" "Language-Team: Czech <vdr@linuxtv.org>\n" @@ -904,6 +904,12 @@ msgstr "přidat nové transpondéry" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Zvuk" + +msgid "Button$Subtitles" +msgstr "Titulky" + msgid "Setup.DVB$Primary DVB interface" msgstr "Primární DVB zařízení" @@ -1131,9 +1137,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Zastavit přehrávání" -msgid "Button$Audio" -msgstr "Zvuk" - msgid "Button$Pause" msgstr "Přerušit" @@ -1159,9 +1162,6 @@ msgstr "Zvuk není dostupný!" msgid "No subtitles" msgstr "Bez titulků" -msgid "Button$Subtitles" -msgstr "Titulky" - msgid "No subtitles available!" msgstr "Žádné dostupné titulky!" diff --git a/po/da_DK.po b/po/da_DK.po index c837986..81b11eb 100644 --- a/po/da_DK.po +++ b/po/da_DK.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Mogens Elneff <mogens@elneff.dk>\n" "Language-Team: Danish <vdr@linuxtv.org>\n" @@ -902,6 +902,12 @@ msgstr "tilf. ny transp." msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Audio" + +msgid "Button$Subtitles" +msgstr "Undertekster" + msgid "Setup.DVB$Primary DVB interface" msgstr "Primr DVB enhed" @@ -1129,9 +1135,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Stop afspilning" -msgid "Button$Audio" -msgstr "Audio" - msgid "Button$Pause" msgstr "Pause" @@ -1157,9 +1160,6 @@ msgstr "Ingen lyd tilgngelig!" msgid "No subtitles" msgstr "Ingen undertekster" -msgid "Button$Subtitles" -msgstr "Undertekster" - msgid "No subtitles available!" msgstr "Ingen undertekster tilgngelig!" diff --git a/po/de_DE.po b/po/de_DE.po index 75dc3a6..6d5b822 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n" "Language-Team: German <vdr@linuxtv.org>\n" @@ -902,6 +902,12 @@ msgstr "neue Transponder hinzufgen" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Audio" + +msgid "Button$Subtitles" +msgstr "Untertitel" + msgid "Setup.DVB$Primary DVB interface" msgstr "Primres DVB-Interface" @@ -1129,9 +1135,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Wiedergabe beenden" -msgid "Button$Audio" -msgstr "Audio" - msgid "Button$Pause" msgstr "Pause" @@ -1157,9 +1160,6 @@ msgstr "Kein Audio verfgbar!" msgid "No subtitles" msgstr "Keine Untertitel" -msgid "Button$Subtitles" -msgstr "Untertitel" - msgid "No subtitles available!" msgstr "Keine Untertitel verfgbar!" diff --git a/po/el_GR.po b/po/el_GR.po index a35fa3b..9756ea7 100644 --- a/po/el_GR.po +++ b/po/el_GR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n" "Language-Team: Greek <vdr@linuxtv.org>\n" @@ -902,6 +902,12 @@ msgstr " " msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "" + +msgid "Button$Subtitles" +msgstr "" + msgid "Setup.DVB$Primary DVB interface" msgstr " DVB " @@ -1129,9 +1135,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " " -msgid "Button$Audio" -msgstr "" - msgid "Button$Pause" msgstr "" @@ -1157,9 +1160,6 @@ msgstr " " msgid "No subtitles" msgstr "" -msgid "Button$Subtitles" -msgstr "" - msgid "No subtitles available!" msgstr "" diff --git a/po/es_ES.po b/po/es_ES.po index 88b693e..193e75e 100644 --- a/po/es_ES.po +++ b/po/es_ES.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Luca Olivetti <luca@ventoso.org>\n" "Language-Team: Spanish <vdr@linuxtv.org>\n" @@ -903,6 +903,12 @@ msgstr "aadir transponders" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Audio" + +msgid "Button$Subtitles" +msgstr "Subttulos" + msgid "Setup.DVB$Primary DVB interface" msgstr "Interfaz DVB primario" @@ -1130,9 +1136,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Parar reproducin" -msgid "Button$Audio" -msgstr "Audio" - msgid "Button$Pause" msgstr "Pausa" @@ -1158,9 +1161,6 @@ msgstr "No hay audio disponible!" msgid "No subtitles" msgstr "Sin subttulos" -msgid "Button$Subtitles" -msgstr "Subttulos" - msgid "No subtitles available!" msgstr "No hay subttulos disponibles!" diff --git a/po/et_EE.po b/po/et_EE.po index 8c8ad1f..49794dd 100644 --- a/po/et_EE.po +++ b/po/et_EE.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Arthur Konovalov <artlov@gmail.com>\n" "Language-Team: Estonian <vdr@linuxtv.org>\n" @@ -902,6 +902,12 @@ msgstr "uued transponderid" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Audio" + +msgid "Button$Subtitles" +msgstr "Subtiitrid" + msgid "Setup.DVB$Primary DVB interface" msgstr "Esmane DVB seade" @@ -1129,9 +1135,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Lpetada taasesitamine" -msgid "Button$Audio" -msgstr "Audio" - msgid "Button$Pause" msgstr "Paus" @@ -1157,9 +1160,6 @@ msgstr "Audio kttesaamatu!" msgid "No subtitles" msgstr "Subtiitrid vljas" -msgid "Button$Subtitles" -msgstr "Subtiitrid" - msgid "No subtitles available!" msgstr "Subtiitrid puuduvad" diff --git a/po/fi_FI.po b/po/fi_FI.po index 1b06c3f..b093e88 100644 --- a/po/fi_FI.po +++ b/po/fi_FI.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n" "Language-Team: Finnish <vdr@linuxtv.org>\n" @@ -905,6 +905,12 @@ msgstr "uudet transponderit" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Ääni" + +msgid "Button$Subtitles" +msgstr "Tekstitys" + msgid "Setup.DVB$Primary DVB interface" msgstr "Ensisijainen DVB-sovitin" @@ -1132,9 +1138,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Lopeta toisto" -msgid "Button$Audio" -msgstr "Ääni" - msgid "Button$Pause" msgstr "Tauko" @@ -1160,9 +1163,6 @@ msgstr "Äänen kieli ei ole valittavissa!" msgid "No subtitles" msgstr "Ei tekstitystä" -msgid "Button$Subtitles" -msgstr "Tekstitys" - msgid "No subtitles available!" msgstr "Tekstitys ei ole valittavissa!" diff --git a/po/fr_FR.po b/po/fr_FR.po index 68a581c..b5c5120 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Jean-Claude Repetto <jc@repetto.org>\n" "Language-Team: French <vdr@linuxtv.org>\n" @@ -908,6 +908,12 @@ msgstr "ajouter transpondeurs" msgid "DVB" msgstr "Cartes DVB" +msgid "Button$Audio" +msgstr "Audio" + +msgid "Button$Subtitles" +msgstr "Sous-titres" + msgid "Setup.DVB$Primary DVB interface" msgstr "Carte DVB primaire" @@ -1135,9 +1141,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Arrter la lecture" -msgid "Button$Audio" -msgstr "Audio" - msgid "Button$Pause" msgstr "Pause" @@ -1163,9 +1166,6 @@ msgstr "Pas de son disponible !" msgid "No subtitles" msgstr "Pas de sous-titres" -msgid "Button$Subtitles" -msgstr "Sous-titres" - msgid "No subtitles available!" msgstr "Pas de sous-titres disponible !" diff --git a/po/hr_HR.po b/po/hr_HR.po index 69104b4..ed519a2 100644 --- a/po/hr_HR.po +++ b/po/hr_HR.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Adrian Caval <anrxc@sysphere.org>\n" "Language-Team: Croatian <vdr@linuxtv.org>\n" @@ -904,6 +904,12 @@ msgstr "dodaj nove transpondere" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Audio" + +msgid "Button$Subtitles" +msgstr "Titlovi" + msgid "Setup.DVB$Primary DVB interface" msgstr "Primarni DVB ureaj" @@ -1131,9 +1137,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Prekini reprodukciju" -msgid "Button$Audio" -msgstr "Audio" - msgid "Button$Pause" msgstr "Pauza" @@ -1159,9 +1162,6 @@ msgstr "Audio nedostupan" msgid "No subtitles" msgstr "Bez titlova" -msgid "Button$Subtitles" -msgstr "Titlovi" - msgid "No subtitles available!" msgstr "Titlovi nisu dostupni!" diff --git a/po/hu_HU.po b/po/hu_HU.po index b7cf1a7..17b905f 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Istvn Fley <ifuley@tigercomp.ro>\n" "Language-Team: Hungarian <vdr@linuxtv.org>\n" @@ -905,6 +905,12 @@ msgstr "j transponder hozzadsa" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Hang" + +msgid "Button$Subtitles" +msgstr "Feliratok" + msgid "Setup.DVB$Primary DVB interface" msgstr "Els DVB interface" @@ -1132,9 +1138,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Lejtszst befejzni" -msgid "Button$Audio" -msgstr "Hang" - msgid "Button$Pause" msgstr "Sznet" @@ -1160,9 +1163,6 @@ msgstr "Hang nem lehetsges!" msgid "No subtitles" msgstr "Felirat ki" -msgid "Button$Subtitles" -msgstr "Feliratok" - msgid "No subtitles available!" msgstr "A csatornn nincs felirat!" diff --git a/po/it_IT.po b/po/it_IT.po index 24e5412..501300e 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" "Language-Team: Italian <vdr@linuxtv.org>\n" @@ -909,6 +909,12 @@ msgstr "nuovi transponder" msgid "DVB" msgstr "Scheda DVB" +msgid "Button$Audio" +msgstr "Audio" + +msgid "Button$Subtitles" +msgstr "Sottotitoli" + msgid "Setup.DVB$Primary DVB interface" msgstr "Scheda DVB primaria" @@ -1136,9 +1142,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Ferma riproduzione" -msgid "Button$Audio" -msgstr "Audio" - msgid "Button$Pause" msgstr "Pausa" @@ -1164,9 +1167,6 @@ msgstr "Nessun audio disponibile!" msgid "No subtitles" msgstr "Nessun sottotitolo" -msgid "Button$Subtitles" -msgstr "Sottotitoli" - msgid "No subtitles available!" msgstr "Nessun sottotitolo disponibile!" diff --git a/po/lt_LT.po b/po/lt_LT.po index a8dfcb9..6cb1faa 100644 --- a/po/lt_LT.po +++ b/po/lt_LT.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.7.16\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" "Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n" "Language-Team: Lithuanian <vdr@linuxtv.org>\n" @@ -902,6 +902,12 @@ msgstr "pridėti naujus siųstuvus" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Garsas" + +msgid "Button$Subtitles" +msgstr "Subtitrai" + msgid "Setup.DVB$Primary DVB interface" msgstr "Pirminiė DVB įvestis" @@ -1129,9 +1135,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Sustabdyti kartojimą" -msgid "Button$Audio" -msgstr "Garsas" - msgid "Button$Pause" msgstr "Pristabdyti" @@ -1157,9 +1160,6 @@ msgstr "Garsas nepateikiamas!" msgid "No subtitles" msgstr "Nėra subtitrų" -msgid "Button$Subtitles" -msgstr "Subtitrai" - msgid "No subtitles available!" msgstr "Subtitrai nepateikiami!" diff --git a/po/mk_MK.po b/po/mk_MK.po index c9d3481..0d22563 100644 --- a/po/mk_MK.po +++ b/po/mk_MK.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR-1.7.14\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" "Last-Translator: Dimitar Petrovski <dimeptr@gmail.com>\n" "Language-Team: Macedonian <en@li.org>\n" @@ -903,6 +903,12 @@ msgstr "додај нови транспондери" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Аудио" + +msgid "Button$Subtitles" +msgstr "Титл" + msgid "Setup.DVB$Primary DVB interface" msgstr "Примарен DVB уред" @@ -1130,9 +1136,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Запри пуштање" -msgid "Button$Audio" -msgstr "Аудио" - msgid "Button$Pause" msgstr "Пауза" @@ -1158,9 +1161,6 @@ msgstr "Аудио недостапно!" msgid "No subtitles" msgstr "Без титл" -msgid "Button$Subtitles" -msgstr "Титл" - msgid "No subtitles available!" msgstr "Титлови недостапни!" diff --git a/po/nl_NL.po b/po/nl_NL.po index 66febc5..ae2b85e 100644 --- a/po/nl_NL.po +++ b/po/nl_NL.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Johan Schuring <johan.schuring@vetteblei.nl>\n" "Language-Team: Dutch <vdr@linuxtv.org>\n" @@ -906,6 +906,12 @@ msgstr "nieuwe transponders toevoegen" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Audio" + +msgid "Button$Subtitles" +msgstr "Ondertiteling" + msgid "Setup.DVB$Primary DVB interface" msgstr "Eerste DVB kaart" @@ -1133,9 +1139,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Stop afspelen" -msgid "Button$Audio" -msgstr "Audio" - msgid "Button$Pause" msgstr "Pauze" @@ -1161,9 +1164,6 @@ msgstr "Geen audio beschikbaar!" msgid "No subtitles" msgstr "Geen ondertiteling" -msgid "Button$Subtitles" -msgstr "Ondertiteling" - msgid "No subtitles available!" msgstr "Geen ondertiteling beschikbaar" diff --git a/po/nn_NO.po b/po/nn_NO.po index a49ab6b..8ec8dfb 100644 --- a/po/nn_NO.po +++ b/po/nn_NO.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Truls Slevigen <truls@slevigen.no>\n" "Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n" @@ -903,6 +903,12 @@ msgstr "" msgid "DVB" msgstr "DVB-enheter" +msgid "Button$Audio" +msgstr "" + +msgid "Button$Subtitles" +msgstr "" + msgid "Setup.DVB$Primary DVB interface" msgstr "Hoved DVB-enhet" @@ -1130,9 +1136,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Stopp avspilling" -msgid "Button$Audio" -msgstr "" - msgid "Button$Pause" msgstr "" @@ -1158,9 +1161,6 @@ msgstr "Pas d'audio disponible!" msgid "No subtitles" msgstr "" -msgid "Button$Subtitles" -msgstr "" - msgid "No subtitles available!" msgstr "" diff --git a/po/pl_PL.po b/po/pl_PL.po index e56f3bf..a5c1b47 100644 --- a/po/pl_PL.po +++ b/po/pl_PL.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Michael Rakowski <mrak@gmx.de>\n" "Language-Team: Polish <vdr@linuxtv.org>\n" @@ -903,6 +903,12 @@ msgstr "dodawaj nowe transpondery" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Dwik" + +msgid "Button$Subtitles" +msgstr "Napisy" + msgid "Setup.DVB$Primary DVB interface" msgstr "Pierwszy interfejs DVB" @@ -1130,9 +1136,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Zatrzymaj odtwarzanie" -msgid "Button$Audio" -msgstr "Dwik" - msgid "Button$Pause" msgstr "Pauza" @@ -1158,9 +1161,6 @@ msgstr "Dwik nie jest dostpny!" msgid "No subtitles" msgstr "Brak napisw" -msgid "Button$Subtitles" -msgstr "Napisy" - msgid "No subtitles available!" msgstr "Napisy nie s dostpne" diff --git a/po/pt_PT.po b/po/pt_PT.po index 2eae063..c443312 100644 --- a/po/pt_PT.po +++ b/po/pt_PT.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.7.15\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" "Last-Translator: Cris Silva <hudokkow@gmail.com>\n" "Language-Team: Portuguese <vdr@linuxtv.org>\n" @@ -903,6 +903,12 @@ msgstr "adicionar novos transponders" msgid "DVB" msgstr "Placa DVB" +msgid "Button$Audio" +msgstr "udio" + +msgid "Button$Subtitles" +msgstr "Legendas" + msgid "Setup.DVB$Primary DVB interface" msgstr "Placa DVB primria" @@ -1130,9 +1136,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Parar reproduo" -msgid "Button$Audio" -msgstr "udio" - msgid "Button$Pause" msgstr "Pausa" @@ -1158,9 +1161,6 @@ msgstr "udio indisponvel!" msgid "No subtitles" msgstr "Sem legendas" -msgid "Button$Subtitles" -msgstr "Legendas" - msgid "No subtitles available!" msgstr "Legendas indisponveis!" diff --git a/po/ro_RO.po b/po/ro_RO.po index cd1a4d0..f8c5a1e 100644 --- a/po/ro_RO.po +++ b/po/ro_RO.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.7.12\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" "Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n" "Language-Team: Romanian <vdr@linuxtv.org>\n" @@ -905,6 +905,12 @@ msgstr "adugare transpondere noi" msgid "DVB" msgstr "Dispozitiv DVB" +msgid "Button$Audio" +msgstr "Sunet" + +msgid "Button$Subtitles" +msgstr "Subtitrare" + msgid "Setup.DVB$Primary DVB interface" msgstr "Dispozitiv DVB primar" @@ -1132,9 +1138,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Oprete redarea" -msgid "Button$Audio" -msgstr "Sunet" - msgid "Button$Pause" msgstr "Pauz" @@ -1160,9 +1163,6 @@ msgstr "Lipsete sunetul!" msgid "No subtitles" msgstr "Nu afieaz subtirare" -msgid "Button$Subtitles" -msgstr "Subtitrare" - msgid "No subtitles available!" msgstr "Subtitrare indisponibil!" diff --git a/po/ru_RU.po b/po/ru_RU.po index 57210f0..e683b8b 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n" "Language-Team: Russian <vdr@linuxtv.org>\n" @@ -903,6 +903,12 @@ msgstr ". " msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "" + +msgid "Button$Subtitles" +msgstr "" + msgid "Setup.DVB$Primary DVB interface" msgstr " DVB-" @@ -1130,9 +1136,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " " -msgid "Button$Audio" -msgstr "" - msgid "Button$Pause" msgstr "" @@ -1158,9 +1161,6 @@ msgstr " !" msgid "No subtitles" msgstr " " -msgid "Button$Subtitles" -msgstr "" - msgid "No subtitles available!" msgstr " !" diff --git a/po/sk_SK.po b/po/sk_SK.po index a8faa76..46edef5 100644 --- a/po/sk_SK.po +++ b/po/sk_SK.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.7.16\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" "Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n" "Language-Team: Slovak <vdr@linuxtv.org>\n" @@ -902,6 +902,12 @@ msgstr "prida nov transpondry" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Zvuk" + +msgid "Button$Subtitles" +msgstr "Titulky" + msgid "Setup.DVB$Primary DVB interface" msgstr "Hlavn DVB rozhranie" @@ -1129,9 +1135,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Zastavi prehrvanie" -msgid "Button$Audio" -msgstr "Zvuk" - msgid "Button$Pause" msgstr "Pozastavi" @@ -1157,9 +1160,6 @@ msgstr "Zvuk nie je dostupn!" msgid "No subtitles" msgstr "Bez titulkov" -msgid "Button$Subtitles" -msgstr "Titulky" - msgid "No subtitles available!" msgstr "iadne dostupn titulky!" diff --git a/po/sl_SI.po b/po/sl_SI.po index 2e6667d..89c6923 100644 --- a/po/sl_SI.po +++ b/po/sl_SI.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n" "Language-Team: Slovenian <vdr@linuxtv.org>\n" @@ -903,6 +903,12 @@ msgstr "dodaj nove oddajnike" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Zvok" + +msgid "Button$Subtitles" +msgstr "Podnapisi" + msgid "Setup.DVB$Primary DVB interface" msgstr "Primarna naprava" @@ -1130,9 +1136,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Prekini predvajanje" -msgid "Button$Audio" -msgstr "Zvok" - msgid "Button$Pause" msgstr "Pavza" @@ -1158,9 +1161,6 @@ msgstr "Zvok ni dosegljiv!" msgid "No subtitles" msgstr "Ni podnapisov" -msgid "Button$Subtitles" -msgstr "Podnapisi" - msgid "No subtitles available!" msgstr "Podnapisi niso dosegljivi!" diff --git a/po/sr_SR.po b/po/sr_SR.po index c57dc2b..45d354b 100644 --- a/po/sr_SR.po +++ b/po/sr_SR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.7.1\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" "Last-Translator: Milan Cvijanovi <elcom_cvijo@hotmail.com>\n" "Language-Team: Serbian <vdr@linuxtv.org>\n" @@ -921,6 +921,12 @@ msgstr "dodaj nove transpondere" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Audio" + +msgid "Button$Subtitles" +msgstr "Titlovi" + msgid "Setup.DVB$Primary DVB interface" msgstr "Primarni DVB ureaj" @@ -1153,9 +1159,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Zaustavi reprodukciju" -msgid "Button$Audio" -msgstr "Audio" - msgid "Button$Pause" msgstr "Pauza" @@ -1181,9 +1184,6 @@ msgstr "Ton nedostupan" msgid "No subtitles" msgstr "Bez titlova" -msgid "Button$Subtitles" -msgstr "Titlovi" - msgid "No subtitles available!" msgstr "Titlovi nisu dostupni!" diff --git a/po/sv_SE.po b/po/sv_SE.po index 41b6592..150f95e 100644 --- a/po/sv_SE.po +++ b/po/sv_SE.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Magnus Andersson <svankan@bahnhof.se>\n" "Language-Team: Swedish <vdr@linuxtv.org>\n" @@ -905,6 +905,12 @@ msgstr "lgg till nya transponders" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Ljud" + +msgid "Button$Subtitles" +msgstr "Knapp$Textning" + msgid "Setup.DVB$Primary DVB interface" msgstr "Primr DVB enhet" @@ -1132,9 +1138,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Avsluta uppspelning" -msgid "Button$Audio" -msgstr "Ljud" - msgid "Button$Pause" msgstr "Pausa" @@ -1160,9 +1163,6 @@ msgstr "Ljud saknas!" msgid "No subtitles" msgstr "Ingen textning" -msgid "Button$Subtitles" -msgstr "Knapp$Textning" - msgid "No subtitles available!" msgstr "Ingen textning tillgnglig!" diff --git a/po/tr_TR.po b/po/tr_TR.po index b0ad00f..194943b 100644 --- a/po/tr_TR.po +++ b/po/tr_TR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Oktay Yolgeen <oktay_73@yahoo.de>\n" "Language-Team: Turkish <vdr@linuxtv.org>\n" @@ -902,6 +902,12 @@ msgstr "yeni uydu alc-verici ekle" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Audio" + +msgid "Button$Subtitles" +msgstr "Altyaz" + msgid "Setup.DVB$Primary DVB interface" msgstr "Primer DVB arayz" @@ -1129,9 +1135,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Gsterii bitir" -msgid "Button$Audio" -msgstr "Audio" - msgid "Button$Pause" msgstr "Durakla" @@ -1157,9 +1160,6 @@ msgstr "Audio yok!" msgid "No subtitles" msgstr "Altyaz yok" -msgid "Button$Subtitles" -msgstr "Altyaz" - msgid "No subtitles available!" msgstr "Altyaz bulunamad" diff --git a/po/uk_UA.po b/po/uk_UA.po index f316e29..433ec70 100644 --- a/po/uk_UA.po +++ b/po/uk_UA.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.7.7\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n" "Language-Team: Ukrainian <vdr@linuxtv.org>\n" @@ -902,6 +902,12 @@ msgstr "додати нові транспондери" msgid "DVB" msgstr "DVB" +msgid "Button$Audio" +msgstr "Мова аудіо" + +msgid "Button$Subtitles" +msgstr "Субтитри" + msgid "Setup.DVB$Primary DVB interface" msgstr "Основний DVB-пристрій" @@ -1129,9 +1135,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr " Зупинити програвання" -msgid "Button$Audio" -msgstr "Мова аудіо" - msgid "Button$Pause" msgstr "Пауза" @@ -1157,9 +1160,6 @@ msgstr "Відсутній звук!" msgid "No subtitles" msgstr "Немає субтитрів" -msgid "Button$Subtitles" -msgstr "Субтитри" - msgid "No subtitles available!" msgstr "Субтитрів немає!" diff --git a/po/zh_CN.po b/po/zh_CN.po index 11ccd84..c28fe88 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.6.0\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" -"POT-Creation-Date: 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" "Last-Translator: Nan Feng <nfgx@21cn.com>\n" "Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n" @@ -905,6 +905,12 @@ msgstr "添加新转发器" msgid "DVB" msgstr "卫星卡设置" +msgid "Button$Audio" +msgstr "声道" + +msgid "Button$Subtitles" +msgstr "字幕" + msgid "Setup.DVB$Primary DVB interface" msgstr "使用中卫星卡接口" @@ -1132,9 +1138,6 @@ msgstr "VDR" msgid " Stop replaying" msgstr "停止回放" -msgid "Button$Audio" -msgstr "声道" - msgid "Button$Pause" msgstr "暂停" @@ -1160,9 +1163,6 @@ msgstr "音频不可用" msgid "No subtitles" msgstr "没有字幕" -msgid "Button$Subtitles" -msgstr "字幕" - msgid "No subtitles available!" msgstr "字幕不可用" @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * 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" @@ -31,7 +31,7 @@ cRecorder::cRecorder(const char *FileName, const cChannel *Channel, int Priority 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); int Pid = Channel->Vpid(); @@ -88,7 +88,7 @@ bool cRecorder::RunningLowOnDiskSpace(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()) { recordFile = fileName->NextFile(); fileSize = 0; @@ -119,11 +119,6 @@ void cRecorder::Action(void) time_t t = time(NULL); bool InfoWritten = false; bool FirstIframeSeen = false; -#define BUFFERSIZE (5 * TS_SIZE) - bool Buffering = false; - int BufferIndex = 0; - int MaxBufferIndex = 0; - uchar *Buffer = NULL; while (Running()) { int r; uchar *b = ringBuffer->Get(r); @@ -144,34 +139,9 @@ void cRecorder::Action(void) } InfoWritten = true; } - if (frameDetector->NewPayload()) { // We're at the first TS packet of a new payload... - 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()) { + if (FirstIframeSeen || frameDetector->IndependentFrame()) { FirstIframeSeen = true; // start recording with the first I-frame - if (frameDetector->IndependentFrame() && !NextFile()) // every file shall start with an independent frame + if (!NextFile()) break; if (index && frameDetector->NewFrame()) index->Write(frameDetector->IndependentFrame(), fileName->Number(), fileSize); @@ -184,12 +154,6 @@ void cRecorder::Action(void) 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) { LOG_ERROR_STR(fileName->Name()); break; @@ -207,8 +171,4 @@ void cRecorder::Action(void) t = time(NULL); } } - if (Buffer) { - free(Buffer); - dsyslog("frame type buffer used %d bytes", MaxBufferIndex); - } } diff --git a/recording.c b/recording.c index 4456bdd..bea7eb6 100644 --- a/recording.c +++ b/recording.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recording.c 2.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" @@ -60,6 +60,7 @@ #define DISKCHECKDELTA 100 // seconds between checks for free disk space #define REMOVELATENCY 10 // seconds to wait until next check after removing a file #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 @@ -94,7 +95,7 @@ void cRemoveDeletedRecordingsThread::Action(void) bool deleted = false; cThreadLock DeletedRecordingsLock(&DeletedRecordings); 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); r->Remove(); DeletedRecordings.Del(r); @@ -120,7 +121,7 @@ void RemoveDeletedRecordings(void) if (!RemoveDeletedRecordingsThread.Active()) { cThreadLock DeletedRecordingsLock(&DeletedRecordings); 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(); break; } @@ -153,7 +154,7 @@ void AssertFreeDiskSpace(int Priority, bool Force) cRecording *r0 = NULL; while (r) { 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; } r = DeletedRecordings.Next(r); @@ -180,11 +181,11 @@ void AssertFreeDiskSpace(int Priority, bool Force) cRecording *r0 = NULL; while (r) { 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->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 + 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 + (r->Lifetime() > 0 && (time(NULL) - r->Start()) / SECSINDAY >= r->Lifetime())) { // the recording's guaranteed lifetime has expired 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) } else @@ -617,6 +618,7 @@ cRecording::cRecording(cTimer *Timer, const cEvent *Event) instanceId = InstanceId; isPesRecording = false; framesPerSecond = DEFAULTFRAMESPERSECOND; + numFrames = -1; deleted = 0; // set up the actual name: const char *Title = Event ? Event->Title() : NULL; @@ -676,6 +678,7 @@ cRecording::cRecording(const char *FileName) lifetime = MAXLIFETIME; isPesRecording = false; framesPerSecond = DEFAULTFRAMESPERSECOND; + numFrames = -1; deleted = 0; titleBuffer = NULL; sortBuffer = NULL; @@ -870,13 +873,16 @@ const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level) cons s++; else 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_mon + 1, t->tm_year % 100, Delimiter, t->tm_hour, t->tm_min, + Delimiter, + (LengthInSeconds() >= 0) ? LengthInSeconds() / 3600 : 0, + (LengthInSeconds() >= 0) ? LengthInSeconds() / 60 % 60 : 0, New, Delimiter, s)); @@ -958,6 +964,13 @@ bool cRecording::WriteInfo(void) return true; } +void cRecording::SetStartTime(time_t Start) +{ + start = Start; + free(fileName); + fileName = NULL; +} + bool cRecording::Delete(void) { bool result = true; @@ -1024,6 +1037,25 @@ void cRecording::ResetResume(void) const 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 Recordings; @@ -1095,6 +1127,7 @@ void cRecordings::ScanVideoDir(const char *DirName, bool Foreground, int LinkLev if (endswith(buffer, deleted ? DELEXT : RECEXT)) { cRecording *r = new cRecording(buffer); if (r->Name()) { + r->NumFrames(); // initializes the numFrames member Lock(); Add(r); ChangeState(); @@ -1233,23 +1266,21 @@ cMutex MutexMarkFramesPerSecond; cMark::cMark(int Position, const char *Comment, double FramesPerSecond) { position = Position; - comment = Comment ? strdup(Comment) : NULL; + comment = Comment; framesPerSecond = FramesPerSecond; } cMark::~cMark() { - free(comment); } 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) { - free(comment); comment = NULL; framesPerSecond = MarkFramesPerSecond; position = HMSFToIndex(s, framesPerSecond); @@ -1313,7 +1344,7 @@ void cMarks::Sort(void) { for (cMark *m1 = First(); m1; m1 = Next(m1)) { 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->comment, m2->comment); } @@ -1334,7 +1365,7 @@ cMark *cMarks::Add(int Position) cMark *cMarks::Get(int Position) { for (cMark *mi = First(); mi; mi = Next(mi)) { - if (mi->position == Position) + if (mi->Position() == Position) return mi; } return NULL; @@ -1343,7 +1374,7 @@ cMark *cMarks::Get(int Position) cMark *cMarks::GetPrev(int Position) { for (cMark *mi = Last(); mi; mi = Prev(mi)) { - if (mi->position < Position) + if (mi->Position() < Position) return mi; } return NULL; @@ -1352,7 +1383,7 @@ cMark *cMarks::GetPrev(int Position) cMark *cMarks::GetNext(int Position) { for (cMark *mi = First(); mi; mi = Next(mi)) { - if (mi->position > Position) + if (mi->Position() > Position) return mi; } return NULL; @@ -1403,12 +1434,11 @@ void cIndexFileGenerator::Action(void) bool Rewind = false; cFileName FileName(recordingName, false); 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; cFrameDetector FrameDetector; cIndexFile IndexFile(recordingName, true); 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 FrameOffset = -1; Skins.QueueMessage(mtInfo, tr("Regenerating index file")); @@ -1425,18 +1455,12 @@ void cIndexFileGenerator::Action(void) if (Data) { if (FrameDetector.Synced()) { // Step 3 - generate the index: - if (FrameOffset < 0 && TsPid(Data) == PATPID) { - FileNumber = FileName.Number(); + if (TsPid(Data) == PATPID) FrameOffset = FileSize; // the PAT/PMT is at the beginning of an I-frame - } int Processed = FrameDetector.Analyze(Data, Length); if (Processed > 0) { - if (FrameDetector.NewPayload() && FrameOffset < 0) { - FileNumber = FileName.Number(); - FrameOffset = FileSize; - } if (FrameDetector.NewFrame()) { - IndexFile.Write(FrameDetector.IndependentFrame(), FileNumber, FrameOffset); + IndexFile.Write(FrameDetector.IndependentFrame(), FileName.Number(), FrameOffset >= 0 ? FrameOffset : FileSize); FrameOffset = -1; } 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: #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 { uint32_t offset; uchar type; diff --git a/recording.h b/recording.h index 578dd45..37979ec 100644 --- a/recording.h +++ b/recording.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recording.h 2.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 @@ -22,6 +22,8 @@ #define TIMERMACRO_TITLE "TITLE" #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 int InstanceId; @@ -87,6 +89,7 @@ private: mutable char *fileName; mutable char *name; mutable int fileSizeMB; + mutable int numFrames; int channel; int instanceId; bool isPesRecording; @@ -97,14 +100,21 @@ private: static char *StripEpisodeName(char *s); char *SortName(void) const; int GetResume(void) const; +#ifdef __RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS public: +#endif time_t start; int priority; int lifetime; time_t deleted; +public: cRecording(cTimer *Timer, const cEvent *Event); cRecording(const char *FileName); 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; const char *Name(void) const { return name; } const char *FileName(void) const; @@ -114,11 +124,24 @@ public: int HierarchyLevels(void) const; void ResetResume(void) const; 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 IsEdited(void) const; bool IsPesRecording(void) const { return isPesRecording; } void ReadInfo(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); ///< Changes the file name so that it will no longer be visible in the "Recordings" menu ///< Returns false in case of error @@ -176,13 +199,21 @@ extern cRecordings DeletedRecordings; #define DEFAULTFRAMESPERSECOND 25.0 class cMark : public cListObject { + friend class cMarks; // for sorting private: double framesPerSecond; +#ifdef __RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS public: +#endif int position; - char *comment; + cString comment; +public: cMark(int Position = 0, const char *Comment = NULL, double FramesPerSecond = DEFAULTFRAMESPERSECOND); 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); bool Parse(const char *s); bool Save(FILE *f); @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * 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" @@ -785,8 +785,7 @@ cFrameDetector::cFrameDetector(int Pid, int Type) { SetPid(Pid, Type); synced = false; - newPayload = newFrame = independentFrame = false; - frameTypeOffset = -1; + newFrame = independentFrame = false; numPtsValues = 0; numFrames = 0; numIFrames = 0; @@ -813,17 +812,36 @@ void cFrameDetector::SetPid(int Pid, int Type) void cFrameDetector::Reset(void) { - newPayload = newFrame = independentFrame = false; - frameTypeOffset = -1; + newFrame = independentFrame = false; payloadUnitOfFrame = 0; scanning = false; 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 SeenPayloadStart = false; int Processed = 0; - newPayload = newFrame = independentFrame = false; + newFrame = independentFrame = false; while (Length >= TS_SIZE) { if (Data[0] != TS_SYNC_BYTE) { int Skipped = 1; @@ -836,11 +854,14 @@ int cFrameDetector::Analyze(const uchar *Data, int Length) int Pid = TsPid(Data); if (Pid == pid) { if (TsPayloadStart(Data)) { + SeenPayloadStart = true; 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) { // 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); if (numIFrames && PesHasPts(Pes)) { ptsValues[numPtsValues] = PesGetPts(Pes); @@ -902,10 +923,6 @@ int cFrameDetector::Analyze(const uchar *Data, int Length) if (scanning) { int PayloadOffset = TsPayloadOffset(Data); if (TsPayloadStart(Data)) { - if (synced && Processed) - return Processed; // flush everything before this new payload - newPayload = true; - scanner = EMPTY_SCANNER; PayloadOffset += PesPayloadOffset(Data + PayloadOffset); if (!framesPerPayloadUnit) framesPerPayloadUnit = framesInPayloadUnit; @@ -913,29 +930,20 @@ int cFrameDetector::Analyze(const uchar *Data, int Length) dbgframes("/"); } for (int i = PayloadOffset; scanning && i < TS_SIZE; i++) { - if (frameTypeOffset < 0) { - scanner <<= 8; - scanner |= Data[i]; - } - else - frameTypeOffset += PayloadOffset; + scanner <<= 8; + scanner |= Data[i]; switch (type) { case 0x01: // MPEG 1 video case 0x02: // MPEG 2 video 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; + 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; - uchar FrameType = (Data[frameTypeOffset] >> 3) & 0x07; - frameTypeOffset = -1; + uchar FrameType = (Data[FrameTypeOffset] >> 3) & 0x07; independentFrame = FrameType == 1; // I-Frame if (synced) { if (framesPerPayloadUnit <= 1) @@ -955,19 +963,14 @@ int cFrameDetector::Analyze(const uchar *Data, int Length) break; case 0x1B: // MPEG 4 video 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; + 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; - uchar FrameType = Data[frameTypeOffset]; - frameTypeOffset = -1; + uchar FrameType = Data[FrameTypeOffset]; independentFrame = FrameType == 0x10; if (synced) { if (framesPerPayloadUnit < 0) { @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * 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 @@ -336,16 +336,16 @@ void PesDump(const char *Name, const u_char *Data, int Length); // Frame detector: +#define MIN_TS_PACKETS_FOR_FRAME_DETECTOR 5 + class cFrameDetector { private: enum { MaxPtsValues = 150 }; int pid; int type; bool synced; - bool newPayload; bool newFrame; bool independentFrame; - int frameTypeOffset; uint32_t ptsValues[MaxPtsValues]; // 32 bit is enough - we only need the delta int numPtsValues; int numFrames; @@ -359,6 +359,7 @@ private: int payloadUnitOfFrame; bool scanning; uint32_t scanner; + int SkipPackets(const uchar *&Data, int &Length, int &Processed, int &FrameTypeOffset); public: cFrameDetector(int Pid = 0, int Type = 0); ///< 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. bool Synced(void) { return synced; } ///< 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; } ///< Returns true if the data given to the last call to Analyze() started a ///< new frame. diff --git a/skinclassic.c b/skinclassic.c index 3333246..49f0bcb 100644 --- a/skinclassic.c +++ b/skinclassic.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: skinclassic.c 2.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" @@ -377,7 +377,7 @@ void cSkinClassicDisplayMenu::SetRecording(const cRecording *Recording) int y = y2; cTextScroller ts; 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)); y += ts.Height(); if (Info->GetEvent()->ParentalRating()) { @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * 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" @@ -136,14 +136,14 @@ cSkinDisplayReplay::cProgressBar::cProgressBar(int Width, int Height, int Curren if (Marks) { bool Start = true; for (const cMark *m = Marks->First(); m; m = Marks->Next(m)) { - int p1 = Pos(m->position); + int p1 = Pos(m->Position()); if (Start) { const cMark *m2 = Marks->Next(m); - int p2 = Pos(m2 ? m2->position : total); + int p2 = Pos(m2 ? m2->Position() : total); int h = Height / 3; 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; } } diff --git a/skinsttng.c b/skinsttng.c index 169488a..c9c3031 100644 --- a/skinsttng.c +++ b/skinsttng.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: skinsttng.c 2.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 @@ -693,7 +693,7 @@ void cSkinSTTNGDisplayMenu::SetRecording(const cRecording *Recording) int y = y3; cTextScroller ts; 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)); y += ts.Height(); if (Info->GetEvent()->ParentalRating()) { @@ -10,7 +10,7 @@ * and interact with the Video Disk Recorder - or write a full featured * graphical interface that sits on top of an SVDRP connection. * - * $Id: svdrp.c 2.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" @@ -219,9 +219,11 @@ const char *HelpPages[] = { " image format defaults to JPEG.", "HELP [ <topic> ]\n" " 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" - " 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" " List channels. Without option, all channels are listed. Otherwise\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) { if (*Option) { - eKeys k = cKey::FromString(Option); - if (k != kNone) { - cRemote::Put(k); - Reply(250, "Key \"%s\" accepted", Option); - } - else - Reply(504, "Unknown key: \"%s\"", 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 (!cRemote::Put(k)) { + Reply(451, "Too many keys in \"%s\" (only %d accepted)", Option, NumKeys); + return; + } + } + 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 { Reply(-214, "Valid <key> names for the HITK command:"); @@ -8,7 +8,7 @@ .\" License as specified in the file COPYING that comes with the .\" 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" .SH NAME @@ -214,6 +214,17 @@ if there is an audio type. .TP .B TPID 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 .B Conditional access A hexadecimal integer defining how this channel can be accessed: |