From 0c96d6b62650790dc83ce6621eb664e51f39719b Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 4 Sep 2011 15:42:00 +0200 Subject: [PATCH] Version 1.7.21 Original announce message: VDR developer version 1.7.21 is now available at ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.21.tar.bz2 A 'diff' against the previous version is available at ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.20-1.7.21.diff MD5 checksums: 7300bfd997db1a848bd774fefe4aec80 vdr-1.7.21.tar.bz2 c4e745939f31543dd607b97d58fc86be vdr-1.7.20-1.7.21.diff WARNING: ======== This is a developer version. Even though I use it in my productive environment. I strongly recommend that you only use it under controlled conditions and for testing and debugging. This version contains functions to determine the "signal strength" and "signal quality" through cDevice. If you are using a DVB card that contains an stb0899 frontend chip (like the TT-budget S2-3200) you may want to apply the patches from ftp://ftp.tvdr.de/vdr/Developer/Driver-Patches to the LinuxDVB driver source in order to receive useful results from that frontend. From the HISTORY file: - Fixed detecting frames for channels that split frames into several payloads (reported by Derek Kelly). - Now initializing Setup.InitialChannel to an empty string to avoid problems in case there is no setup.conf. - The start time of an edited recording is now set to the time of the first editing mark (thanks to Udo Richter). This obsoletes the CUTTIME patch. - Direct access to the members start, priority, lifetime, and deleted of cRecording as well as to position and comment of cMark is now deprecated. Plugin authors should switch to the new access functions for these members. For now the macro __RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS is defined in recording.h, which exposes these members, so that existing plugins will still compile. Comment out this #define to check whether a particular plugin needs to be modified. This #define may be removed in a future version. - The new functions cRecording::NumFrames() and cRecording::LengthInSeconds() return the number of frames and length (in seconds) of a recording (suggested by Steffen Barszus). - The subtitle PIDs are now stored in the channels.conf file as an extension to the TPID field (thanks to Rolf Ahrenberg). - The new function cDevice::ProvidesEIT() is used to determine whether a device can provide EIT data and will thus be used in cEITScanner::Process() to receive EIT data from the channels it can receive (suggested by Rolf Ahrenberg). Note that by default it is assumed that a device can't provide EIT data, and only the builtin cDvbDevice returns true from this function. - The Audio and Subtitles options are now available through the Green and Yellow keys in the Setup/DVB menu (thanks to Rolf Ahrenberg). This is mainly for remote controls that don't have dedicated keys for these functions. - The SVDRP command HITK now accepts multiple keys (up to 31). - The Recordings menu now displays the length (in hours:minutes) of each recording (thanks to Rolf Ahrenberg). Note that the "new" indicator has been moved from the recording time to the length column. This new format is also used by the SVDRP command LSTR, so in case you have an application that parses the LSTR output, you will need to adjust it to the new format. - The dvbsddevice plugin now supports the new option --outputonly, which disables receiving on SD FF devices and uses the device only for output (thanks to Udo Richter). - Fixed detecting frames on radio channels (reported by Chris Mayo). - Revoked the changes to cFrameDetector that have been introduced in version 1.7.19. Detecting frames in case the Picture Start Code or Access Unit Delimiter extends over TS packet boundaries is now done by locally skipping TS packets in cFrameDetector. --- CONTRIBUTORS | 14 ++++ HISTORY | 44 ++++++++++ PLUGINS/src/dvbhddevice/dvbhddevice.c | 6 +- PLUGINS/src/dvbhddevice/dvbhdffdevice.c | 24 +++++- PLUGINS/src/dvbhddevice/hdffcmd.c | 3 +- PLUGINS/src/dvbhddevice/hdffmsgdef.h | 11 ++- PLUGINS/src/dvbhddevice/po/de_DE.po | 25 ++++-- PLUGINS/src/dvbhddevice/po/fi_FI.po | 104 ++++++++++++++++++++++++ PLUGINS/src/dvbhddevice/po/it_IT.po | 26 ++++-- PLUGINS/src/dvbhddevice/setup.c | 40 ++++++--- PLUGINS/src/dvbhddevice/setup.h | 3 +- PLUGINS/src/dvbsddevice/HISTORY | 4 + PLUGINS/src/dvbsddevice/dvbsddevice.c | 30 ++++++- PLUGINS/src/dvbsddevice/dvbsdffdevice.c | 20 ++++- PLUGINS/src/dvbsddevice/dvbsdffdevice.h | 11 ++- PLUGINS/src/skincurses/skincurses.c | 4 +- channels.c | 48 +++++++++-- config.c | 4 +- config.h | 10 +-- cutter.c | 14 +++- device.c | 7 +- device.h | 6 +- dvbdevice.c | 7 +- dvbdevice.h | 3 +- eitscan.c | 4 +- epg.data | 0 menu.c | 102 +++++++++++++---------- po/ar.po | 14 ++-- po/ca_ES.po | 14 ++-- po/cs_CZ.po | 14 ++-- po/da_DK.po | 14 ++-- po/de_DE.po | 14 ++-- po/el_GR.po | 14 ++-- po/es_ES.po | 14 ++-- po/et_EE.po | 14 ++-- po/fi_FI.po | 14 ++-- po/fr_FR.po | 14 ++-- po/hr_HR.po | 14 ++-- po/hu_HU.po | 14 ++-- po/it_IT.po | 14 ++-- po/lt_LT.po | 14 ++-- po/mk_MK.po | 14 ++-- po/nl_NL.po | 14 ++-- po/nn_NO.po | 14 ++-- po/pl_PL.po | 14 ++-- po/pt_PT.po | 14 ++-- po/ro_RO.po | 14 ++-- po/ru_RU.po | 14 ++-- po/sk_SK.po | 14 ++-- po/sl_SI.po | 14 ++-- po/sr_SR.po | 14 ++-- po/sv_SE.po | 14 ++-- po/tr_TR.po | 14 ++-- po/uk_UA.po | 14 ++-- po/zh_CN.po | 14 ++-- recorder.c | 50 ++---------- recording.c | 81 +++++++++++------- recording.h | 35 +++++++- remux.c | 83 ++++++++++--------- remux.h | 12 +-- skinclassic.c | 4 +- skins.c | 8 +- skinsttng.c | 4 +- svdrp.c | 37 ++++++--- vdr.5 | 13 ++- 65 files changed, 842 insertions(+), 451 deletions(-) create mode 100644 PLUGINS/src/dvbhddevice/po/fi_FI.po delete mode 100644 epg.data diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 2aa2c21d..be533c18 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -743,6 +743,7 @@ Steffen Barszus 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 for reporting a bug in saving the polarization parameter of channels that have a @@ -1111,6 +1112,11 @@ Rolf Ahrenberg 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 for reporting a bug in cutting a recording if there is only a single editing mark @@ -1708,6 +1714,9 @@ Udo Richter 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 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 for adding cRecordingInfo::GetEvent() @@ -2760,3 +2771,6 @@ Mark Hawes Frank Niederwipper for reporting a problem in timer handling in case a recording directory can't be created + +Chris Mayo + for reporting a problem with detecting frames on radio channels diff --git a/HISTORY b/HISTORY index b5006894..42473309 100644 --- a/HISTORY +++ b/HISTORY @@ -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 4745c377..0ad1698d 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 @@ -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 714769eb..ff3f953b 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 82869df1..60ad70e7 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 a6c3f4b3..d63e88a5 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 907f2437..78ace1bf 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: \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: \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 00000000..db8ef0b7 --- /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: \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 \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 a328312c..bafb2c55 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: \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 \n" "Language-Team: \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 30365e0a..6e41860f 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 07c9d1a0..c3fe7a63 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 9672f6fc..229e35b0 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 6f042d8b..2aa8c77d 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 #include #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 73e55bac..17f842b6 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 afe4727e..bd74cde6 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 11fead5f..74166b33 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 @@ -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()) { diff --git a/channels.c b/channels.c index c689850b..b9204f28 100644 --- a/channels.c +++ b/channels.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: channels.c 2.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()) { diff --git a/config.c b/config.c index 6767b5c6..73bb00d6 100644 --- a/config.c +++ b/config.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.c 2.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; diff --git a/config.h b/config.h index 19f87686..c51e3df7 100644 --- a/config.h +++ b/config.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.h 2.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 diff --git a/cutter.c b/cutter.c index 96739fdd..778302b8 100644 --- a/cutter.c +++ b/cutter.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: cutter.c 2.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) diff --git a/device.c b/device.c index 07599936..ba098d88 100644 --- a/device.c +++ b/device.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 2.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; diff --git a/device.h b/device.h index d937e5f0..fd587a83 100644 --- a/device.h +++ b/device.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.h 2.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 b0750dd4..a97f2749 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 0962548c..e1842b7d 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; diff --git a/eitscan.c b/eitscan.c index 25b7115c..9d8ac995 100644 --- a/eitscan.c +++ b/eitscan.c @@ -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 e69de29b..00000000 diff --git a/menu.c b/menu.c index 39785146..ef2bb468 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 2.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(); } } diff --git a/po/ar.po b/po/ar.po index 3c31613d..d3dd29af 100644 --- a/po/ar.po +++ b/po/ar.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.7.0\n" "Report-Msgid-Bugs-To: \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 \n" "Language-Team: Arabic \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 835f93d3..b104fea3 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: \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 \n" "Language-Team: Catalan \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 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 e6ebdfd9..bcafac7d 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: \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ý \n" "Language-Team: Czech \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 c8379864..81b11eb0 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: \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 \n" "Language-Team: Danish \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 tilg 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 75dc3a65..6d5b822f 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: \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 \n" "Language-Team: German \n" @@ -902,6 +902,12 @@ msgstr "neue Transponder hinzuf 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 verf 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 a35fa3b4..9756ea78 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: \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 \n" "Language-Team: Greek \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 88b693e9..193e75eb 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: \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 \n" "Language-Team: Spanish \n" @@ -903,6 +903,12 @@ msgstr "a 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 " 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 8c8ad1fc..49794dd5 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: \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 \n" "Language-Team: Estonian \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 k 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 1b06c3f2..b093e880 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: \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 \n" "Language-Team: Finnish \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 68a581c0..b5c51204 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: \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 \n" "Language-Team: French \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 69104b46..ed519a2f 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: \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 \n" "Language-Team: Croatian \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 b7cf1a7b..17b905f5 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: \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 \n" "Language-Team: Hungarian \n" @@ -905,6 +905,12 @@ msgstr " 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 lehets 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 24e54129..501300ed 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: \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 \n" "Language-Team: Italian \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 a8dfcb94..6cb1faa0 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: \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 \n" "Language-Team: Lithuanian \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 c9d34813..0d22563f 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: \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 \n" "Language-Team: Macedonian \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 66febc50..ae2b85e0 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: \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 \n" "Language-Team: Dutch \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 a49ab6b8..8ec8dfb4 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: \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 \n" "Language-Team: Norwegian Nynorsk \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 e56f3bf9..a5c1b472 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: \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 \n" "Language-Team: Polish \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 "D 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 2eae063b..c4433123 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: \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 \n" "Language-Team: Portuguese \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 " 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 cd1a4d08..f8c5a1e2 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: \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 \n" "Language-Team: Romanian \n" @@ -905,6 +905,12 @@ msgstr "ad 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 "Lipse 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 57210f0b..e683b8b1 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: \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 \n" "Language-Team: Russian \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 a8faa761..46edef58 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: \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 \n" "Language-Team: Slovak \n" @@ -902,6 +902,12 @@ msgstr "prida 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 2e6667d0..89c69239 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: \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 \n" "Language-Team: Slovenian \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 c57dc2b7..45d354bb 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: \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 \n" "Language-Team: Serbian \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 41b6592c..150f95eb 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: \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 \n" "Language-Team: Swedish \n" @@ -905,6 +905,12 @@ msgstr "l 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 b0ad00f3..194943b8 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: \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 \n" "Language-Team: Turkish \n" @@ -902,6 +902,12 @@ msgstr "yeni uydu al 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 f316e29a..433ec704 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: \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 \n" "Language-Team: Ukrainian \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 11ccd840..c28fe881 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: \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 \n" "Language-Team: Chinese (simplified) \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 "字幕不可用" diff --git a/recorder.c b/recorder.c index 6080deb0..a6cab473 100644 --- a/recorder.c +++ b/recorder.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recorder.c 2.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 4456bddb..bea7eb6b 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 578dd455..37979ec6 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); diff --git a/remux.c b/remux.c index f174f614..78ab2940 100644 --- a/remux.c +++ b/remux.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: remux.c 2.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) { diff --git a/remux.h b/remux.h index 3204bb41..b8822796 100644 --- a/remux.h +++ b/remux.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: remux.h 2.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 33332467..49f0bcb5 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()) { diff --git a/skins.c b/skins.c index 83428730..427e4224 100644 --- a/skins.c +++ b/skins.c @@ -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 169488a3..c9c3031f 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()) { diff --git a/svdrp.c b/svdrp.c index fe3bcc7c..e8e75b39 100644 --- a/svdrp.c +++ b/svdrp.c @@ -10,7 +10,7 @@ * and interact with the Video Disk Recorder - or write a full featured * graphical interface that sits on top of an SVDRP connection. * - * $Id: svdrp.c 2.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 [ ]\n" " The HELP command gives help info.", - "HITK [ ]\n" + "HITK [ ... ]\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 | | ]\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 names for the HITK command:"); diff --git a/vdr.5 b/vdr.5 index 6274c1af..c46a2bf2 100644 --- a/vdr.5 +++ b/vdr.5 @@ -8,7 +8,7 @@ .\" License as specified in the file COPYING that comes with the .\" vdr distribution. .\" -.\" $Id: vdr.5 2.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: